AuthTaobaoRequest.java 3.9 KB
Newer Older
1 2 3
package me.zhyd.oauth.request;

import com.alibaba.fastjson.JSONObject;
4
import me.zhyd.oauth.cache.AuthStateCache;
5
import me.zhyd.oauth.config.AuthConfig;
6
import me.zhyd.oauth.config.AuthDefaultSource;
7
import me.zhyd.oauth.enums.AuthResponseStatus;
8
import me.zhyd.oauth.enums.AuthUserGender;
9
import me.zhyd.oauth.exception.AuthException;
不合群的混子's avatar
不合群的混子 已提交
10
import me.zhyd.oauth.model.AuthCallback;
11
import me.zhyd.oauth.model.AuthResponse;
不合群的混子's avatar
不合群的混子 已提交
12 13
import me.zhyd.oauth.model.AuthToken;
import me.zhyd.oauth.model.AuthUser;
14
import me.zhyd.oauth.utils.GlobalAuthUtils;
15 16
import me.zhyd.oauth.utils.HttpUtils;
import me.zhyd.oauth.utils.StringUtils;
不合群的混子's avatar
不合群的混子 已提交
17
import me.zhyd.oauth.utils.UrlBuilder;
18 19 20 21 22

/**
 * 淘宝登录
 *
 * @author yadong.zhang (yadong.zhang0415(a)gmail.com)
智布道's avatar
智布道 已提交
23
 * @since 1.1.0
24
 */
智布道's avatar
智布道 已提交
25
public class AuthTaobaoRequest extends AuthDefaultRequest {
26 27

    public AuthTaobaoRequest(AuthConfig config) {
28
        super(config, AuthDefaultSource.TAOBAO);
29 30
    }

31
    public AuthTaobaoRequest(AuthConfig config, AuthStateCache authStateCache) {
32
        super(config, AuthDefaultSource.TAOBAO, authStateCache);
33 34
    }

35
    @Override
36 37
    protected AuthToken getAccessToken(AuthCallback authCallback) {
        return AuthToken.builder().accessCode(authCallback.getCode()).build();
38 39
    }

40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
    private AuthToken getAuthToken(JSONObject object) {
        this.checkResponse(object);

        return AuthToken.builder()
            .accessToken(object.getString("access_token"))
            .expireIn(object.getIntValue("expires_in"))
            .tokenType(object.getString("token_type"))
            .idToken(object.getString("id_token"))
            .refreshToken(object.getString("refresh_token"))
            .uid(object.getString("taobao_user_id"))
            .openId(object.getString("taobao_open_uid"))
            .build();
    }

    private void checkResponse(JSONObject object) {
        if (object.containsKey("error")) {
            throw new AuthException(object.getString("error_description"));
        }
    }

60 61
    @Override
    protected AuthUser getUserInfo(AuthToken authToken) {
62 63
        String response = doPostAuthorizationCode(authToken.getAccessCode());
        JSONObject accessTokenObject = JSONObject.parseObject(response);
智布道's avatar
智布道 已提交
64
        if (accessTokenObject.containsKey("error")) {
智布道's avatar
智布道 已提交
65
            throw new AuthException(accessTokenObject.getString("error_description"));
66
        }
67
        authToken = this.getAuthToken(accessTokenObject);
68

69
        String nick = GlobalAuthUtils.urlDecode(accessTokenObject.getString("taobao_user_nick"));
70
        return AuthUser.builder()
71 72
            .rawUserInfo(accessTokenObject)
            .uuid(StringUtils.isEmpty(authToken.getUid()) ? authToken.getOpenId() : authToken.getUid())
不合群的混子's avatar
不合群的混子 已提交
73 74 75 76
            .username(nick)
            .nickname(nick)
            .gender(AuthUserGender.UNKNOWN)
            .token(authToken)
77
            .source(source.toString())
不合群的混子's avatar
不合群的混子 已提交
78 79 80
            .build();
    }

81 82 83
    @Override
    public AuthResponse refresh(AuthToken oldToken) {
        String tokenUrl = refreshTokenUrl(oldToken.getRefreshToken());
84
        String response = new HttpUtils(config.getHttpConfig()).post(tokenUrl).getBody();
85 86 87 88 89 90 91
        JSONObject accessTokenObject = JSONObject.parseObject(response);
        return AuthResponse.builder()
            .code(AuthResponseStatus.SUCCESS.getCode())
            .data(this.getAuthToken(accessTokenObject))
            .build();
    }

不合群的混子's avatar
不合群的混子 已提交
92
    /**
93
     * 返回带{@code state}参数的授权url,授权回调时会带上这个{@code state}
不合群的混子's avatar
不合群的混子 已提交
94
     *
95
     * @param state state 验证授权流程的参数,可以防止csrf
不合群的混子's avatar
不合群的混子 已提交
96
     * @return 返回授权地址
智布道's avatar
智布道 已提交
97
     * @since 1.9.3
不合群的混子's avatar
不合群的混子 已提交
98 99
     */
    @Override
100
    public String authorize(String state) {
不合群的混子's avatar
不合群的混子 已提交
101 102 103 104 105
        return UrlBuilder.fromBaseUrl(source.authorize())
            .queryParam("response_type", "code")
            .queryParam("client_id", config.getClientId())
            .queryParam("redirect_uri", config.getRedirectUri())
            .queryParam("view", "web")
106
            .queryParam("state", getRealState(state))
不合群的混子's avatar
不合群的混子 已提交
107
            .build();
108 109
    }
}