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

import com.alibaba.fastjson.JSONObject;
import me.zhyd.oauth.cache.AuthStateCache;
import me.zhyd.oauth.config.AuthConfig;
6
import me.zhyd.oauth.config.AuthDefaultSource;
智布道's avatar
智布道 已提交
7
import me.zhyd.oauth.enums.AuthUserGender;
智布道's avatar
智布道 已提交
8
import me.zhyd.oauth.enums.scope.AuthHuaweiScope;
智布道's avatar
智布道 已提交
9 10 11 12 13
import me.zhyd.oauth.exception.AuthException;
import me.zhyd.oauth.model.AuthCallback;
import me.zhyd.oauth.model.AuthResponse;
import me.zhyd.oauth.model.AuthToken;
import me.zhyd.oauth.model.AuthUser;
智布道's avatar
智布道 已提交
14
import me.zhyd.oauth.utils.AuthScopeUtils;
智布道's avatar
智布道 已提交
15
import me.zhyd.oauth.utils.HttpUtils;
智布道's avatar
智布道 已提交
16 17
import me.zhyd.oauth.utils.UrlBuilder;

18 19 20
import java.util.HashMap;
import java.util.Map;

智布道's avatar
智布道 已提交
21 22 23 24 25 26 27
import static me.zhyd.oauth.enums.AuthResponseStatus.SUCCESS;

/**
 * 华为授权登录
 *
 * @author yadong.zhang (yadong.zhang0415(a)gmail.com)
 * @version 1.0
28
 * @since 1.10.0
智布道's avatar
智布道 已提交
29 30 31 32
 */
public class AuthHuaweiRequest extends AuthDefaultRequest {

    public AuthHuaweiRequest(AuthConfig config) {
33
        super(config, AuthDefaultSource.HUAWEI);
智布道's avatar
智布道 已提交
34 35 36
    }

    public AuthHuaweiRequest(AuthConfig config, AuthStateCache authStateCache) {
37
        super(config, AuthDefaultSource.HUAWEI, authStateCache);
智布道's avatar
智布道 已提交
38 39 40 41 42 43 44 45 46 47 48 49
    }

    /**
     * 获取access token
     *
     * @param authCallback 授权成功后的回调参数
     * @return token
     * @see AuthDefaultRequest#authorize()
     * @see AuthDefaultRequest#authorize(String)
     */
    @Override
    protected AuthToken getAccessToken(AuthCallback authCallback) {
50
        Map<String, String> form = new HashMap<>(8);
51 52 53 54 55 56
        form.put("grant_type", "authorization_code");
        form.put("code", authCallback.getAuthorization_code());
        form.put("client_id", config.getClientId());
        form.put("client_secret", config.getClientSecret());
        form.put("redirect_uri", config.getRedirectUri());

57
        String response = new HttpUtils(config.getHttpConfig()).post(source.accessToken(), form, false).getBody();
58
        return getAuthToken(response);
智布道's avatar
智布道 已提交
59 60 61 62 63 64 65 66 67 68 69
    }

    /**
     * 使用token换取用户信息
     *
     * @param authToken token信息
     * @return 用户信息
     * @see AuthDefaultRequest#getAccessToken(AuthCallback)
     */
    @Override
    protected AuthUser getUserInfo(AuthToken authToken) {
70
        Map<String, String> form = new HashMap<>(7);
71 72 73 74 75
        form.put("nsp_ts", System.currentTimeMillis() + "");
        form.put("access_token", authToken.getAccessToken());
        form.put("nsp_fmt", "JS");
        form.put("nsp_svc", "OpenUP.User.getInfo");

76
        String response = new HttpUtils(config.getHttpConfig()).post(source.userInfo(), form, false).getBody();
77
        JSONObject object = JSONObject.parseObject(response);
智布道's avatar
智布道 已提交
78 79 80 81 82 83

        this.checkResponse(object);

        AuthUserGender gender = getRealGender(object);

        return AuthUser.builder()
84
            .rawUserInfo(object)
智布道's avatar
智布道 已提交
85 86 87 88 89
            .uuid(object.getString("userID"))
            .username(object.getString("userName"))
            .nickname(object.getString("userName"))
            .gender(gender)
            .avatar(object.getString("headPictureURL"))
智布道's avatar
智布道 已提交
90
            .token(authToken)
91
            .source(source.toString())
智布道's avatar
智布道 已提交
92 93 94 95 96 97 98 99 100 101 102
            .build();
    }

    /**
     * 刷新access token (续期)
     *
     * @param authToken 登录成功后返回的Token信息
     * @return AuthResponse
     */
    @Override
    public AuthResponse refresh(AuthToken authToken) {
103
        Map<String, String> form = new HashMap<>(7);
104 105 106 107 108
        form.put("client_id", config.getClientId());
        form.put("client_secret", config.getClientSecret());
        form.put("refresh_token", authToken.getRefreshToken());
        form.put("grant_type", "refresh_token");

109
        String response = new HttpUtils(config.getHttpConfig()).post(source.refresh(), form, false).getBody();
110
        return AuthResponse.builder().code(SUCCESS.getCode()).data(getAuthToken(response)).build();
智布道's avatar
智布道 已提交
111 112
    }

113 114
    private AuthToken getAuthToken(String response) {
        JSONObject object = JSONObject.parseObject(response);
智布道's avatar
智布道 已提交
115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133

        this.checkResponse(object);

        return AuthToken.builder()
            .accessToken(object.getString("access_token"))
            .expireIn(object.getIntValue("expires_in"))
            .refreshToken(object.getString("refresh_token"))
            .build();
    }

    /**
     * 返回带{@code state}参数的授权url,授权回调时会带上这个{@code state}
     *
     * @param state state 验证授权流程的参数,可以防止csrf
     * @return 返回授权地址
     * @since 1.9.3
     */
    @Override
    public String authorize(String state) {
智布道's avatar
智布道 已提交
134
        return UrlBuilder.fromBaseUrl(super.authorize(state))
智布道's avatar
智布道 已提交
135
            .queryParam("access_type", "offline")
智布道's avatar
智布道 已提交
136
            .queryParam("scope", this.getScopes(" ", true, AuthScopeUtils.getDefaultScopes(AuthHuaweiScope.values())))
智布道's avatar
智布道 已提交
137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173
            .build();
    }

    /**
     * 返回获取userInfo的url
     *
     * @param authToken token
     * @return 返回获取userInfo的url
     */
    @Override
    protected String userInfoUrl(AuthToken authToken) {
        return UrlBuilder.fromBaseUrl(source.userInfo())
            .queryParam("nsp_ts", System.currentTimeMillis())
            .queryParam("access_token", authToken.getAccessToken())
            .queryParam("nsp_fmt", "JS")
            .queryParam("nsp_svc", "OpenUP.User.getInfo")
            .build();
    }

    /**
     * 获取用户的实际性别。华为系统中,用户的性别:1表示女,0表示男
     *
     * @param object obj
     * @return AuthUserGender
     */
    private AuthUserGender getRealGender(JSONObject object) {
        int genderCodeInt = object.getIntValue("gender");
        String genderCode = genderCodeInt == 1 ? "0" : (genderCodeInt == 0) ? "1" : genderCodeInt + "";
        return AuthUserGender.getRealGender(genderCode);
    }

    /**
     * 校验响应结果
     *
     * @param object 接口返回的结果
     */
    private void checkResponse(JSONObject object) {
智布道's avatar
智布道 已提交
174 175 176
        if (object.containsKey("NSP_STATUS")) {
            throw new AuthException(object.getString("error"));
        }
智布道's avatar
智布道 已提交
177 178 179 180 181
        if (object.containsKey("error")) {
            throw new AuthException(object.getString("sub_error") + ":" + object.getString("error_description"));
        }
    }
}