AuthDingTalkRequest.java 3.2 KB
Newer Older
智布道's avatar
智布道 已提交
1 2 3 4
package me.zhyd.oauth.request;

import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
5 6
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
智布道's avatar
智布道 已提交
7
import me.zhyd.oauth.config.AuthConfig;
8
import me.zhyd.oauth.config.AuthSource;
智布道's avatar
智布道 已提交
9
import me.zhyd.oauth.enums.AuthUserGender;
10
import me.zhyd.oauth.exception.AuthException;
11 12 13
import me.zhyd.oauth.model.AuthCallback;
import me.zhyd.oauth.model.AuthToken;
import me.zhyd.oauth.model.AuthUser;
智布道's avatar
智布道 已提交
14
import me.zhyd.oauth.utils.GlobalAuthUtil;
不合群的混子's avatar
不合群的混子 已提交
15
import me.zhyd.oauth.utils.UrlBuilder;
智布道's avatar
智布道 已提交
16 17

/**
18 19
 * 钉钉登录
 *
智布道's avatar
智布道 已提交
20 21 22 23
 * @author yadong.zhang (yadong.zhang0415(a)gmail.com)
 * @version 1.0
 * @since 1.8
 */
智布道's avatar
智布道 已提交
24
public class AuthDingTalkRequest extends AuthDefaultRequest {
智布道's avatar
智布道 已提交
25 26

    public AuthDingTalkRequest(AuthConfig config) {
不合群的混子's avatar
不合群的混子 已提交
27
        super(config, AuthSource.DINGTALK);
智布道's avatar
智布道 已提交
28 29
    }

30
    @Override
31 32
    protected AuthToken getAccessToken(AuthCallback authCallback) {
        return AuthToken.builder().accessCode(authCallback.getCode()).build();
33 34
    }

智布道's avatar
智布道 已提交
35
    @Override
36 37
    protected AuthUser getUserInfo(AuthToken authToken) {
        String code = authToken.getAccessCode();
38 39
        JSONObject param = new JSONObject();
        param.put("tmp_auth_code", code);
不合群的混子's avatar
不合群的混子 已提交
40
        HttpResponse response = HttpRequest.post(userInfoUrl(authToken)).body(param.toJSONString()).execute();
智布道's avatar
智布道 已提交
41 42 43
        JSONObject object = JSON.parseObject(response.body());
        if (object.getIntValue("errcode") != 0) {
            throw new AuthException(object.getString("errmsg"));
智布道's avatar
智布道 已提交
44 45
        }
        object = object.getJSONObject("user_info");
S
skqing 已提交
46
        AuthToken token = AuthToken.builder()
不合群的混子's avatar
不合群的混子 已提交
47 48 49
            .openId(object.getString("openid"))
            .unionId(object.getString("unionid"))
            .build();
50
        return AuthUser.builder()
不合群的混子's avatar
不合群的混子 已提交
51 52 53 54
            .uuid(object.getString("unionid"))
            .nickname(object.getString("nick"))
            .username(object.getString("nick"))
            .gender(AuthUserGender.UNKNOWN)
55
            .source(source)
不合群的混子's avatar
不合群的混子 已提交
56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
            .token(token)
            .build();
    }

    /**
     * 返回认证url,可自行跳转页面
     *
     * @return 返回授权地址
     */
    @Override
    public String authorize() {
        return UrlBuilder.fromBaseUrl(source.authorize())
            .queryParam("response_type", "code")
            .queryParam("appid", config.getClientId())
            .queryParam("scope", "snsapi_login")
            .queryParam("redirect_uri", config.getRedirectUri())
            .queryParam("state", getRealState(config.getState()))
            .build();
    }

    /**
     * 返回获取userInfo的url
     *
79
     * @param authToken 用户授权后的token
不合群的混子's avatar
不合群的混子 已提交
80 81 82 83 84 85 86 87 88 89 90 91 92
     * @return 返回获取userInfo的url
     */
    @Override
    protected String userInfoUrl(AuthToken authToken) {
        // 根据timestamp, appSecret计算签名值
        String timestamp = System.currentTimeMillis() + "";
        String urlEncodeSignature = GlobalAuthUtil.generateDingTalkSignature(config.getClientSecret(), timestamp);

        return UrlBuilder.fromBaseUrl(source.userInfo())
            .queryParam("signature", urlEncodeSignature)
            .queryParam("timestamp", timestamp)
            .queryParam("accessKey", config.getClientId())
            .build();
93
    }
智布道's avatar
智布道 已提交
94
}