AuthDouyinRequest.java 3.7 KB
Newer Older
1 2 3 4 5 6
package me.zhyd.oauth.request;

import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import com.alibaba.fastjson.JSONObject;
import me.zhyd.oauth.config.AuthConfig;
7
import me.zhyd.oauth.config.AuthSource;
8
import me.zhyd.oauth.exception.AuthException;
9
import me.zhyd.oauth.model.*;
智布道's avatar
智布道 已提交
10
import me.zhyd.oauth.url.AuthDouyinUrlBuilder;
11
import me.zhyd.oauth.url.entity.AuthUserInfoEntity;
12 13 14 15 16 17 18 19 20


/**
 * 抖音登录
 *
 * @author yadong.zhang (yadong.zhang0415(a)gmail.com)
 * @version 1.0
 * @since 1.8
 */
智布道's avatar
智布道 已提交
21
public class AuthDouyinRequest extends AuthDefaultRequest {
22 23

    public AuthDouyinRequest(AuthConfig config) {
智布道's avatar
智布道 已提交
24
        super(config, AuthSource.DOUYIN, new AuthDouyinUrlBuilder());
25 26 27
    }

    @Override
28
    protected AuthToken getAccessToken(AuthCallback authCallback) {
智布道's avatar
智布道 已提交
29
        String accessTokenUrl = this.urlBuilder.getAccessTokenUrl(authCallback.getCode());
30 31 32 33 34 35 36
        return this.getToken(accessTokenUrl);
    }

    @Override
    protected AuthUser getUserInfo(AuthToken authToken) {
        String accessToken = authToken.getAccessToken();
        String openId = authToken.getOpenId();
37 38 39 40
        String url = this.urlBuilder.getUserInfoUrl(AuthUserInfoEntity.builder()
                .accessToken(accessToken)
                .openId(openId)
                .build());
S
skqing 已提交
41
        HttpResponse response = HttpRequest.get(url).execute();
42 43 44 45 46
        JSONObject object = JSONObject.parseObject(response.body());

        JSONObject userInfoObject = this.checkResponse(object);

        return AuthUser.builder()
S
skqing 已提交
47
                .uuid(userInfoObject.getString("union_id"))
48 49 50
                .username(userInfoObject.getString("nickname"))
                .nickname(userInfoObject.getString("nickname"))
                .avatar(userInfoObject.getString("avatar"))
S
skqing 已提交
51
                .remark(userInfoObject.getString("description"))
H
Hongwei Peng 已提交
52
                .gender(AuthUserGender.UNKNOWN)
53 54 55 56 57 58 59
                .token(authToken)
                .source(AuthSource.DOUYIN)
                .build();
    }

    @Override
    public AuthResponse refresh(AuthToken oldToken) {
智布道's avatar
智布道 已提交
60
        String refreshTokenUrl = this.urlBuilder.getRefreshUrl(oldToken.getRefreshToken());
61
        return AuthResponse.builder()
智布道's avatar
智布道 已提交
62
                .code(AuthResponseStatus.SUCCESS.getCode())
63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103
                .data(this.getToken(refreshTokenUrl))
                .build();
    }

    /**
     * 检查响应内容是否正确
     *
     * @param object 请求响应内容
     * @return 实际请求数据的json对象
     */
    private JSONObject checkResponse(JSONObject object) {
        String message = object.getString("message");
        JSONObject data = object.getJSONObject("data");
        int errorCode = data.getIntValue("error_code");
        if ("error".equals(message) || errorCode != 0) {
            throw new AuthException(errorCode, data.getString("description"));
        }
        return data;
    }

    /**
     * 获取token,适用于获取access_token和刷新token
     *
     * @param accessTokenUrl 实际请求token的地址
     * @return token对象
     */
    private AuthToken getToken(String accessTokenUrl) {
        HttpResponse response = HttpRequest.post(accessTokenUrl).execute();
        String accessTokenStr = response.body();
        JSONObject object = JSONObject.parseObject(accessTokenStr);

        JSONObject accessTokenObject = this.checkResponse(object);
        return AuthToken.builder()
                .accessToken(accessTokenObject.getString("access_token"))
                .openId(accessTokenObject.getString("open_id"))
                .expireIn(accessTokenObject.getIntValue("expires_in"))
                .refreshToken(accessTokenObject.getString("refresh_token"))
                .scope(accessTokenObject.getString("scope"))
                .build();
    }
}