package org.pac4j.oauth.client; import org.apache.commons.lang3.StringUtils; import org.pac4j.core.client.BaseClient; import org.pac4j.core.context.WebContext; import org.pac4j.oauth.credentials.OAuthCredentials; import org.pac4j.oauth.profile.JsonHelper; import org.pac4j.oauth.profile.tencent.TencentProfile; import org.scribe.builder.api.StateApi20; import org.scribe.builder.api.TencentApi; import org.scribe.model.OAuthConfig; import org.scribe.model.OAuthConstants; import org.scribe.model.OAuthRequest; import org.scribe.model.SignatureType; import org.scribe.model.Token; import org.scribe.model.Verb; import org.scribe.oauth.TencentOAuth20ServiceImpl; import com.fasterxml.jackson.databind.JsonNode; public class TencentClient extends BaseOAuth20Client<TencentProfile> { public final static String DEFAULT_SCOPE = "get_user_info"; public final static String OPEN_ID_URL = "https://graph.qq.com/oauth2.0/me"; protected String scope = DEFAULT_SCOPE; protected StateApi20 api20; public TencentClient() { super(); } @Override protected void internalInit() { super.internalInit(); this.api20 = new TencentApi(); String theScope = StringUtils.isNotBlank(this.scope) ? this.scope : null; final OAuthConfig conf = new OAuthConfig(this.key, this.secret, this.callbackUrl, SignatureType.Header, theScope, null); this.service = new TencentOAuth20ServiceImpl(this.api20, conf); } @Override protected boolean requiresStateParameter() { return true; } @Override protected boolean hasBeenCancelled(WebContext context) { return false; } @Override protected TencentProfile extractUserProfile(String body) { final TencentProfile profile = new TencentProfile(); String jsonStr = body.substring(9, body.length() - 2); final JsonNode json = JsonHelper.getFirstNode(jsonStr); for (final String attribute : TencentAttributesDefinition.instance.getAllAttributes()) { profile.addAttribute(attribute, JsonHelper.get(json, attribute)); } profile.setId(profile.getAttribute(TencentAttributesDefinition.OPEN_ID)); return profile; } @Override protected String getProfileUrl() { return OPEN_ID_URL; } protected String getProfileUrl(Token accessToken) { OAuthRequest request = new OAuthRequest(Verb.GET, OPEN_ID_URL); request.addQuerystringParameter(OAuthConstants.ACCESS_TOKEN, accessToken.getToken()); return request.getCompleteUrl(); } @Override protected BaseClient<OAuthCredentials, TencentProfile> newClient() { final TencentClient tencentClient = new TencentClient(); tencentClient.setScope(this.getScope()); return tencentClient; } public String getScope() { return scope; } public void setScope(String scope) { this.scope = scope; } }