From c1311e461977363a548b01645dcf610dda1ac658 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vlastimil=20Eli=C3=A1=C5=A1?= Date: Fri, 13 Apr 2018 08:09:27 +0200 Subject: [PATCH] KEYCLOAK-6849 - LinkedIn social login provider updated to new LinkedIn OAuth2 endpoint (#5125) * KEYCLOAK-6849 - LinkedIn social login provider updated to new LinkedIn OAuth2 endpoint * KEYCLOAK-6849 - LinkedIn social login provider test updated * KEYCLOAK-6849 - LinkedIn social login provider test updated to conditionally handle consent page when shown only * Simplify the LinkedIn app authorization This reverts commit c12359e7a13d9ff231fe2e25cddba66ad679a9cd. --- .../linkedin/LinkedInIdentityProvider.java | 6 +++--- testsuite/integration-arquillian/HOW-TO-RUN.md | 10 +++++++--- .../pages/social/LinkedInLoginPage.java | 18 +++++++++++++++--- .../testsuite/broker/SocialLoginTest.java | 4 ++-- 4 files changed, 27 insertions(+), 11 deletions(-) diff --git a/services/src/main/java/org/keycloak/social/linkedin/LinkedInIdentityProvider.java b/services/src/main/java/org/keycloak/social/linkedin/LinkedInIdentityProvider.java index c30db0c7f1..9c2eef6df7 100755 --- a/services/src/main/java/org/keycloak/social/linkedin/LinkedInIdentityProvider.java +++ b/services/src/main/java/org/keycloak/social/linkedin/LinkedInIdentityProvider.java @@ -37,12 +37,12 @@ import java.net.URLDecoder; * * @author Vlastimil Elias (velias at redhat dot com) */ -public class LinkedInIdentityProvider extends AbstractOAuth2IdentityProvider implements SocialIdentityProvider { +public class LinkedInIdentityProvider extends AbstractOAuth2IdentityProvider implements SocialIdentityProvider { private static final Logger log = Logger.getLogger(LinkedInIdentityProvider.class); - public static final String AUTH_URL = "https://www.linkedin.com/uas/oauth2/authorization"; - public static final String TOKEN_URL = "https://www.linkedin.com/uas/oauth2/accessToken"; + public static final String AUTH_URL = "https://www.linkedin.com/oauth/v2/authorization"; + public static final String TOKEN_URL = "https://www.linkedin.com/oauth/v2/accessToken"; public static final String PROFILE_URL = "https://api.linkedin.com/v1/people/~:(id,formatted-name,email-address,public-profile-url)?format=json"; public static final String DEFAULT_SCOPE = "r_basicprofile r_emailaddress"; diff --git a/testsuite/integration-arquillian/HOW-TO-RUN.md b/testsuite/integration-arquillian/HOW-TO-RUN.md index b30e836131..65a6f042e3 100644 --- a/testsuite/integration-arquillian/HOW-TO-RUN.md +++ b/testsuite/integration-arquillian/HOW-TO-RUN.md @@ -292,8 +292,10 @@ The social login tests require setup of all social networks including an example shared as it would result in the clients and users eventually being blocked. By default these tests are skipped. To run the full test you need to configure clients in Google, Facebook, GitHub, Twitter, LinkedIn, Microsoft, PayPal and -StackOverflow. See the server administration guide for details on how to do that. Further, you also need to create a -sample user that can login to the social network. +StackOverflow. See the server administration guide for details on how to do that. You have to use URLs like +`http://localhost:8180/auth/realms/social/broker/google/endpoint` (with `google` replaced by the name +of given provider) as an authorized redirect URL when configuring the client. Further, you also need to create a sample user +that can login to the social network. The details should be added to a standard properties file. For some properties you can use shared common properties and override when needed. Or you can specify these for all providers. All providers require at least clientId and @@ -315,7 +317,8 @@ An example social.properties file looks like: facebook.profile.lastName=Test In the example above the common username, password and profile are shared for all providers, but Facebook has a -different last name. +different last name. Profile informations are used for assertion after login, so you have to set them to be same as +user profile information returned by given social login provider for used sample user. Some providers actively block bots so you need to use a proper browser to test. Either Firefox or Chrome should work. @@ -328,6 +331,7 @@ To run the tests run: -Dbrowser=chrome \ -Dsocial.config=/path/to/social.properties +To run individual social provider test only you can use option like `-Dtest=SocialLoginTest#linkedinLogin` ## Different Browsers diff --git a/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/pages/social/LinkedInLoginPage.java b/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/pages/social/LinkedInLoginPage.java index e2b7e51715..70cb1eb558 100644 --- a/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/pages/social/LinkedInLoginPage.java +++ b/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/pages/social/LinkedInLoginPage.java @@ -17,6 +17,7 @@ package org.keycloak.testsuite.pages.social; +import org.openqa.selenium.NoSuchElementException; import org.openqa.selenium.WebElement; import org.openqa.selenium.support.FindBy; @@ -24,20 +25,31 @@ import org.openqa.selenium.support.FindBy; * @author Vaclav Muzikar */ public class LinkedInLoginPage extends AbstractSocialLoginPage { - @FindBy(id = "session_key-oauth2SAuthorizeForm") + @FindBy(id = "session_key-login") private WebElement usernameInput; - @FindBy(id = "session_password-oauth2SAuthorizeForm") + @FindBy(id = "session_password-login") private WebElement passwordInput; - @FindBy(name = "authorize") + @FindBy(name = "signin") private WebElement loginButton; + @FindBy(name = "action") + private WebElement authorizeButton; + @Override public void login(String user, String password) { usernameInput.clear(); usernameInput.sendKeys(user); passwordInput.sendKeys(password); loginButton.click(); + + try { + authorizeButton.click(); + log.info("LinkedIn test app authorized"); + } + catch (NoSuchElementException e) { + log.info("Skipping LinkedIn app authorization"); + } } } diff --git a/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/broker/SocialLoginTest.java b/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/broker/SocialLoginTest.java index 8118b7f657..12de8e9aaa 100644 --- a/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/broker/SocialLoginTest.java +++ b/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/broker/SocialLoginTest.java @@ -269,6 +269,7 @@ public class SocialLoginTest extends AbstractKeycloakTest { assertAccount(); } + @Test public void githubLogin() throws InterruptedException { setTestProvider(GITHUB); @@ -362,8 +363,7 @@ public class SocialLoginTest extends AbstractKeycloakTest { log.infof("current URL: %s", driver.getCurrentUrl()); log.infof("performing log in to '%s' ...", currentTestProvider.id()); currentSocialLoginPage.login(getConfig("username"), getConfig("password")); - } - else { + } else { log.infof("already logged in to '%s'; skipping the login process", currentTestProvider.id()); } }