package com.feth.play.module.pa.providers.oauth1.linkedin; import com.fasterxml.jackson.databind.JsonNode; import com.feth.play.module.pa.PlayAuthenticate; import com.feth.play.module.pa.exceptions.AccessDeniedException; import com.feth.play.module.pa.exceptions.AccessTokenException; import com.feth.play.module.pa.exceptions.AuthException; import com.feth.play.module.pa.providers.oauth1.OAuth1AuthProvider; import com.google.inject.Inject; import play.inject.ApplicationLifecycle; import play.libs.oauth.OAuth.OAuthCalculator; import play.libs.oauth.OAuth.RequestToken; import play.libs.ws.WSClient; import play.mvc.Http; import javax.inject.Singleton; import java.util.List; @Singleton public class LinkedinAuthProvider extends OAuth1AuthProvider<LinkedinAuthUser, LinkedinAuthInfo> { public static final String PROVIDER_KEY = "linkedin"; private static final String USER_INFO_URL_SETTING_KEY = "userInfoUrl"; private static final String USER_EMAIL_URL_SETTING_KEY = "userEmailUrl"; public static final String OAUTH_ACCESS_DENIED= "user_refused"; @Inject public LinkedinAuthProvider(final PlayAuthenticate auth, final ApplicationLifecycle lifecycle, final WSClient wsClient) { super(auth, lifecycle, wsClient); } @Override public String getKey() { return PROVIDER_KEY; } @Override protected List<String> neededSettingKeys() { final List<String> neededSettingKeys = super.neededSettingKeys(); neededSettingKeys.add(USER_INFO_URL_SETTING_KEY); neededSettingKeys.add(USER_EMAIL_URL_SETTING_KEY); return neededSettingKeys; } @Override protected LinkedinAuthUser transform(final LinkedinAuthInfo info) throws AuthException { final String userInfoUrl = getConfiguration().getString( USER_INFO_URL_SETTING_KEY); final String emailUrl = getConfiguration().getString( USER_EMAIL_URL_SETTING_KEY); final OAuthCalculator op = getOAuthCalculator(info); final JsonNode userJson = signedOauthGet(userInfoUrl, op); final JsonNode emailJson = signedOauthGet(emailUrl, op); return new LinkedinAuthUser(userJson, emailJson.asText(), info); } @Override protected LinkedinAuthInfo buildInfo(final RequestToken requestToken) throws AccessTokenException { return new LinkedinAuthInfo(requestToken.token, requestToken.secret); } @Override protected void checkError(Http.Request request) throws AuthException { final String error = request.getQueryString(Constants.OAUTH_PROBLEM); if (error != null) { if (error.equals(OAUTH_ACCESS_DENIED)) { throw new AccessDeniedException(getKey()); } else { throw new AuthException(error); } } } }