AuthDingTalkRequest.java 3.3 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.AuthDingTalkErrorCode;
10
import me.zhyd.oauth.exception.AuthException;
11 12 13 14
import me.zhyd.oauth.model.AuthCallback;
import me.zhyd.oauth.model.AuthToken;
import me.zhyd.oauth.model.AuthUser;
import me.zhyd.oauth.model.AuthUserGender;
智布道's avatar
智布道 已提交
15
import me.zhyd.oauth.utils.GlobalAuthUtil;
不合群的混子's avatar
不合群的混子 已提交
16
import me.zhyd.oauth.utils.UrlBuilder;
智布道's avatar
智布道 已提交
17 18

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

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

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

智布道's avatar
智布道 已提交
36
    @Override
37 38
    protected AuthUser getUserInfo(AuthToken authToken) {
        String code = authToken.getAccessCode();
39 40
        JSONObject param = new JSONObject();
        param.put("tmp_auth_code", code);
不合群的混子's avatar
不合群的混子 已提交
41
        HttpResponse response = HttpRequest.post(userInfoUrl(authToken)).body(param.toJSONString()).execute();
智布道's avatar
智布道 已提交
42
        String userInfo = response.body();
43 44
        JSONObject object = JSON.parseObject(userInfo);
        AuthDingTalkErrorCode errorCode = AuthDingTalkErrorCode.getErrorCode(object.getIntValue("errcode"));
45
        if (AuthDingTalkErrorCode.EC0 != errorCode) {
46
            throw new AuthException(errorCode.getDesc());
智布道's avatar
智布道 已提交
47 48
        }
        object = object.getJSONObject("user_info");
S
skqing 已提交
49
        AuthToken token = AuthToken.builder()
不合群的混子's avatar
不合群的混子 已提交
50 51 52
            .openId(object.getString("openid"))
            .unionId(object.getString("unionid"))
            .build();
53
        return AuthUser.builder()
不合群的混子's avatar
不合群的混子 已提交
54 55 56 57 58 59 60 61 62 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
            .uuid(object.getString("unionid"))
            .nickname(object.getString("nick"))
            .username(object.getString("nick"))
            .gender(AuthUserGender.UNKNOWN)
            .source(AuthSource.DINGTALK)
            .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
     *
     * @param authToken
     * @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();
96
    }
智布道's avatar
智布道 已提交
97
}