AuthCodingRequest.java 4.3 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.AuthUserGender;
8
import me.zhyd.oauth.exception.AuthException;
9
import me.zhyd.oauth.model.AuthCallback;
10
import me.zhyd.oauth.model.AuthToken;
11
import me.zhyd.oauth.model.AuthUser;
不合群的混子's avatar
不合群的混子 已提交
12
import me.zhyd.oauth.utils.UrlBuilder;
13 14

/**
15 16
 * Cooding登录
 *
17
 * @author yadong.zhang (yadong.zhang0415(a)gmail.com)
智布道's avatar
智布道 已提交
18
 * @since 1.0.0
19
 */
智布道's avatar
智布道 已提交
20
public class AuthCodingRequest extends AuthDefaultRequest {
21 22

    public AuthCodingRequest(AuthConfig config) {
23
        super(config, AuthDefaultSource.CODING);
24 25
    }

26
    public AuthCodingRequest(AuthConfig config, AuthStateCache authStateCache) {
27
        super(config, AuthDefaultSource.CODING, authStateCache);
28 29
    }

30
    @Override
31
    protected AuthToken getAccessToken(AuthCallback authCallback) {
32 33
        String response = doGetAuthorizationCode(authCallback.getCode());
        JSONObject accessTokenObject = JSONObject.parseObject(response);
智布道's avatar
智布道 已提交
34
        this.checkResponse(accessTokenObject);
智布道's avatar
智布道 已提交
35
        return AuthToken.builder()
不合群的混子's avatar
不合群的混子 已提交
36 37 38 39
            .accessToken(accessTokenObject.getString("access_token"))
            .expireIn(accessTokenObject.getIntValue("expires_in"))
            .refreshToken(accessTokenObject.getString("refresh_token"))
            .build();
40 41 42
    }

    @Override
43
    protected AuthUser getUserInfo(AuthToken authToken) {
44 45
        String response = doGetUserInfo(authToken);
        JSONObject object = JSONObject.parseObject(response);
智布道's avatar
智布道 已提交
46
        this.checkResponse(object);
智布道's avatar
智布道 已提交
47

48
        object = object.getJSONObject("data");
49
        return AuthUser.builder()
50
            .rawUserInfo(object)
不合群的混子's avatar
不合群的混子 已提交
51 52
            .uuid(object.getString("id"))
            .username(object.getString("name"))
智布道's avatar
智布道 已提交
53 54
            .avatar("https://coding.net" + object.getString("avatar"))
            .blog("https://coding.net" + object.getString("path"))
不合群的混子's avatar
不合群的混子 已提交
55 56 57 58 59 60 61
            .nickname(object.getString("name"))
            .company(object.getString("company"))
            .location(object.getString("location"))
            .gender(AuthUserGender.getRealGender(object.getString("sex")))
            .email(object.getString("email"))
            .remark(object.getString("slogan"))
            .token(authToken)
62
            .source(source.toString())
不合群的混子's avatar
不合群的混子 已提交
63 64 65
            .build();
    }

智布道's avatar
智布道 已提交
66 67 68 69 70 71 72 73 74 75 76
    /**
     * 检查响应内容是否正确
     *
     * @param object 请求响应内容
     */
    private void checkResponse(JSONObject object) {
        if (object.getIntValue("code") != 0) {
            throw new AuthException(object.getString("msg"));
        }
    }

不合群的混子's avatar
不合群的混子 已提交
77
    /**
78
     * 返回带{@code state}参数的授权url,授权回调时会带上这个{@code state}
不合群的混子's avatar
不合群的混子 已提交
79
     *
80
     * @param state state 验证授权流程的参数,可以防止csrf
不合群的混子's avatar
不合群的混子 已提交
81
     * @return 返回授权地址
智布道's avatar
智布道 已提交
82
     * @since 1.9.3
不合群的混子's avatar
不合群的混子 已提交
83 84
     */
    @Override
85
    public String authorize(String state) {
智布道's avatar
智布道 已提交
86
        return UrlBuilder.fromBaseUrl(String.format(source.authorize(), config.getCodingGroupName()))
不合群的混子's avatar
不合群的混子 已提交
87 88 89 90
            .queryParam("response_type", "code")
            .queryParam("client_id", config.getClientId())
            .queryParam("redirect_uri", config.getRedirectUri())
            .queryParam("scope", "user")
91
            .queryParam("state", getRealState(state))
不合群的混子's avatar
不合群的混子 已提交
92
            .build();
93
    }
智布道's avatar
智布道 已提交
94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122
    /**
     * 返回获取accessToken的url
     *
     * @param code 授权码
     * @return 返回获取accessToken的url
     */
    @Override
    public  String accessTokenUrl(String code) {
        return UrlBuilder.fromBaseUrl(String.format(source.accessToken(), config.getCodingGroupName()))
            .queryParam("code", code)
            .queryParam("client_id", config.getClientId())
            .queryParam("client_secret", config.getClientSecret())
            .queryParam("grant_type", "authorization_code")
            .queryParam("redirect_uri", config.getRedirectUri())
            .build();
    }

    /**
     * 返回获取userInfo的url
     *
     * @param authToken token
     * @return 返回获取userInfo的url
     */
    @Override
    public  String userInfoUrl(AuthToken authToken) {
        return UrlBuilder.fromBaseUrl(String.format(source.userInfo(), config.getCodingGroupName()))
            .queryParam("access_token", authToken.getAccessToken())
            .build();
    }
123
}