package org.pac4j.oauth.client; import com.github.scribejava.apis.LinkedInApi20; import org.pac4j.core.context.WebContext; import org.pac4j.core.redirect.RedirectAction; import org.pac4j.core.util.CommonHelper; import org.pac4j.oauth.exception.OAuthCredentialsException; import org.pac4j.oauth.profile.linkedin2.LinkedIn2ProfileDefinition; import org.pac4j.oauth.profile.linkedin2.LinkedIn2Profile; /** * <p>This class is the OAuth client to authenticate users in LinkedIn (using OAuth 2.0 protocol).</p> * <p>It returns a {@link org.pac4j.oauth.profile.linkedin2.LinkedIn2Profile}.</p> * <p>The scope (by default : <code>r_fullprofile</code>) can be specified using the {@link #setScope(String)} method, as well as the returned * fields through the {@link #setFields(String)} method.</p> * <p>More information at https://developer.linkedin.com/documents/profile-api</p> * * @author Jerome Leleu * @since 1.4.1 */ public class LinkedIn2Client extends OAuth20Client<LinkedIn2Profile> { public final static String DEFAULT_SCOPE = "r_fullprofile"; protected String scope = DEFAULT_SCOPE; protected String fields = "id,first-name,last-name,maiden-name,formatted-name,phonetic-first-name,phonetic-last-name,formatted-phonetic-name,headline,location,industry,current-share,num-connections,num-connections-capped,summary,specialties,positions,picture-url,site-standard-profile-request,api-standard-profile-request,public-profile-url,email-address"; public LinkedIn2Client() { } public LinkedIn2Client(final String key, final String secret) { setKey(key); setSecret(secret); } @Override protected void clientInit(final WebContext context) { CommonHelper.assertNotBlank("scope", this.scope); CommonHelper.assertNotBlank("fields", this.fields); configuration.setApi(LinkedInApi20.instance()); configuration.setProfileDefinition(new LinkedIn2ProfileDefinition()); configuration.setScope(this.scope); configuration.setWithState(true); configuration.setHasBeenCancelledFactory(ctx -> { final String error = ctx.getRequestParameter(OAuthCredentialsException.ERROR); final String errorDescription = ctx.getRequestParameter(OAuthCredentialsException.ERROR_DESCRIPTION); // user has denied permissions if ("access_denied".equals(error) && ("the+user+denied+your+request".equals(errorDescription) || "the user denied your request" .equals(errorDescription))) { return true; } else { return false; } }); setConfiguration(configuration); defaultLogoutActionBuilder((ctx, profile, targetUrl) -> RedirectAction.redirect("https://www.linkedin.com/uas/logout")); super.clientInit(context); } public String getScope() { return this.scope; } public void setScope(final String scope) { this.scope = scope; } public String getFields() { return this.fields; } public void setFields(final String fields) { this.fields = fields; } }