UrlBuilder.java 38.2 KB
Newer Older
智布道's avatar
智布道 已提交
1 2
package me.zhyd.oauth.utils;

3
import me.zhyd.oauth.config.AuthSource;
智布道's avatar
智布道 已提交
4 5 6 7 8 9 10 11 12 13 14 15

import java.text.MessageFormat;

/**
 * Url构建工具类
 *
 * @author yadong.zhang (yadong.zhang0415(a)gmail.com)
 * @version 1.0
 * @since 1.0
 */
public class UrlBuilder {

16
    private static final String GITHUB_ACCESS_TOKEN_PATTERN = "{0}?client_id={1}&client_secret={2}&code={3}&redirect_uri={4}";
智布道's avatar
智布道 已提交
17
    private static final String GITHUB_USER_INFO_PATTERN = "{0}?access_token={1}";
18
    private static final String GITHUB_AUTHORIZE_PATTERN = "{0}?client_id={1}&redirect_uri={2}&state={3}";
智布道's avatar
智布道 已提交
19

20 21 22 23
    private static final String GOOGLE_AUTHORIZE_PATTERN = "{0}?client_id={1}&response_type=code&scope=openid%20email%20profile&redirect_uri={2}&state={3}";
    private static final String GOOGLE_ACCESS_TOKEN_PATTERN = "{0}?client_id={1}&client_secret={2}&code={3}&redirect_uri={4}&grant_type=authorization_code";
    private static final String GOOGLE_USER_INFO_PATTERN = "{0}?id_token={1}";

智布道's avatar
智布道 已提交
24
    private static final String WEIBO_ACCESS_TOKEN_PATTERN = "{0}?client_id={1}&client_secret={2}&grant_type=authorization_code&code={3}&redirect_uri={4}";
25
    private static final String WEIBO_USER_INFO_PATTERN = "{0}?{1}";
26
    private static final String WEIBO_AUTHORIZE_PATTERN = "{0}?client_id={1}&response_type=code&redirect_uri={2}&state={3}";
智布道's avatar
智布道 已提交
27 28 29

    private static final String GITEE_ACCESS_TOKEN_PATTERN = "{0}?client_id={1}&client_secret={2}&grant_type=authorization_code&code={3}&redirect_uri={4}";
    private static final String GITEE_USER_INFO_PATTERN = "{0}?access_token={1}";
30
    private static final String GITEE_AUTHORIZE_PATTERN = "{0}?client_id={1}&response_type=code&redirect_uri={2}&state={3}";
智布道's avatar
智布道 已提交
31

智布道's avatar
智布道 已提交
32
    private static final String DING_TALK_QRCONNECT_PATTERN = "{0}?appid={1}&response_type=code&scope=snsapi_login&redirect_uri={2}&state={3}";
智布道's avatar
智布道 已提交
33 34
    private static final String DING_TALK_USER_INFO_PATTERN = "{0}?signature={1}&timestamp={2}&accessKey={3}";

35 36
    private static final String BAIDU_ACCESS_TOKEN_PATTERN = "{0}?client_id={1}&client_secret={2}&grant_type=authorization_code&code={3}&redirect_uri={4}";
    private static final String BAIDU_USER_INFO_PATTERN = "{0}?access_token={1}";
智布道's avatar
智布道 已提交
37
    private static final String BAIDU_AUTHORIZE_PATTERN = "{0}?client_id={1}&response_type=code&redirect_uri={2}&display=popup&state={3}";
38 39
    private static final String BAIDU_REVOKE_PATTERN = "{0}?access_token={1}";

40 41
    private static final String CSDN_ACCESS_TOKEN_PATTERN = "{0}?client_id={1}&client_secret={2}&grant_type=authorization_code&code={3}&redirect_uri={4}";
    private static final String CSDN_USER_INFO_PATTERN = "{0}?access_token={1}";
智布道's avatar
智布道 已提交
42
    private static final String CSDN_AUTHORIZE_PATTERN = "{0}?client_id={1}&response_type=code&redirect_uri={2}&state={3}";
43 44 45

    private static final String CODING_ACCESS_TOKEN_PATTERN = "{0}?client_id={1}&client_secret={2}&grant_type=authorization_code&code={3}";
    private static final String CODING_USER_INFO_PATTERN = "{0}?access_token={1}";
智布道's avatar
智布道 已提交
46
    private static final String CODING_AUTHORIZE_PATTERN = "{0}?client_id={1}&response_type=code&redirect_uri={2}&scope=user&state={3}";
47 48 49

    private static final String TENCENT_ACCESS_TOKEN_PATTERN = "{0}?client_id={1}&client_secret={2}&grant_type=authorization_code&code={3}";
    private static final String TENCENT_USER_INFO_PATTERN = "{0}?access_token={1}";
智布道's avatar
智布道 已提交
50
    private static final String TENCENT_AUTHORIZE_PATTERN = "{0}?client_id={1}&response_type=code&redirect_uri={2}&scope=user&state={3}";
51 52 53

    private static final String OSCHINA_ACCESS_TOKEN_PATTERN = "{0}?client_id={1}&client_secret={2}&grant_type=authorization_code&code={3}&redirect_uri={4}&dataType=json";
    private static final String OSCHINA_USER_INFO_PATTERN = "{0}?access_token={1}&dataType=json";
智布道's avatar
智布道 已提交
54
    private static final String OSCHINA_AUTHORIZE_PATTERN = "{0}?client_id={1}&response_type=code&redirect_uri={2}&state={3}";
55

智布道's avatar
智布道 已提交
56
    private static final String ALIPAY_AUTHORIZE_PATTERN = "{0}?app_id={1}&scope=auth_user&redirect_uri={2}&state={3}";
57

58
    private static final String QQ_ACCESS_TOKEN_PATTERN = "{0}?client_id={1}&client_secret={2}&grant_type=authorization_code&code={3}&redirect_uri={4}";
59
    private static final String QQ_USER_INFO_PATTERN = "{0}?oauth_consumer_key={1}&access_token={2}&openid={3}";
60
    private static final String QQ_AUTHORIZE_PATTERN = "{0}?client_id={1}&response_type=code&redirect_uri={2}&state={3}";
61
    private static final String QQ_OPENID_PATTERN = "{0}?access_token={1}&unionid={2}";
62

63
    private static final String WECHAT_AUTHORIZE_PATTERN = "{0}?appid={1}&redirect_uri={2}&response_type=code&scope=snsapi_login&state={3}#wechat_redirect";
64 65 66 67
    private static final String WECHAT_ACCESS_TOKEN_PATTERN = "{0}?appid={1}&secret={2}&code={3}&grant_type=authorization_code";
    private static final String WECHAT_REFRESH_TOKEN_PATTERN = "{0}?appid={1}&grant_type=refresh_token&refresh_token={2}";
    private static final String WECHAT_USER_INFO_PATTERN = "{0}?access_token={1}&openid={2}&lang=zh_CN";

68
    private static final String TAOBAO_AUTHORIZE_PATTERN = "{0}?response_type=code&client_id={1}&redirect_uri={2}&state={3}&view=web";
69 70
    private static final String TAOBAO_ACCESS_TOKEN_PATTERN = "{0}?client_id={1}&client_secret={2}&code={3}&redirect_uri={4}&grant_type=authorization_code";

71 72 73 74
    private static final String FACEBOOK_AUTHORIZE_PATTERN = "{0}?client_id={1}&redirect_uri={2}&state={3}&response_type=code&scope=";
    private static final String FACEBOOK_ACCESS_TOKEN_PATTERN = "{0}?client_id={1}&client_secret={2}&code={3}&redirect_uri={4}&grant_type=authorization_code";
    private static final String FACEBOOK_USER_INFO_PATTERN = "{0}?access_token={1}&fields=id,name,birthday,gender,hometown,email,devices,picture.width(400)";

75
    private static final String DOUYIN_AUTHORIZE_PATTERN = "{0}?client_key={1}&redirect_uri={2}&state={3}&response_type=code&scope=user_info";
S
skqing 已提交
76
    private static final String DOUYIN_ACCESS_TOKEN_PATTERN = "{0}?client_key={1}&client_secret={2}&code={3}&grant_type=authorization_code";
77 78 79
    private static final String DOUYIN_USER_INFO_PATTERN = "{0}?access_token={1}&open_id={2}";
    private static final String DOUYIN_REFRESH_TOKEN_PATTERN = "{0}?client_key={1}&refresh_token={2}&grant_type=refresh_token";

80 81 82 83 84 85 86 87 88 89
    private static final String LINKEDIN_AUTHORIZE_PATTERN = "{0}?client_id={1}&redirect_uri={2}&state={3}&response_type=code&scope=r_liteprofile%20r_emailaddress%20w_member_social";
    private static final String LINKEDIN_ACCESS_TOKEN_PATTERN = "{0}?client_id={1}&client_secret={2}&code={3}&redirect_uri={4}&grant_type=authorization_code";
    private static final String LINKEDIN_USER_INFO_PATTERN = "{0}?projection=(id,firstName,lastName,profilePicture(displayImage~:playableStreams))";
    private static final String LINKEDIN_REFRESH_TOKEN_PATTERN = "{0}?client_id={1}&client_secret={2}&refresh_token={3}&grant_type=refresh_token";

    private static final String MICROSOFT_AUTHORIZE_PATTERN = "{0}?client_id={1}&response_type=code&redirect_uri={2}&response_mode=query&scope=offline_access%20user.read%20mail.read&state={3}";
    private static final String MICROSOFT_ACCESS_TOKEN_PATTERN = "{0}?client_id={1}&client_secret={2}&scope=user.read%20mail.read&redirect_uri={3}&code={4}&grant_type=authorization_code";
    private static final String MICROSOFT_USER_INFO_PATTERN = "{0}";
    private static final String MICROSOFT_REFRESH_TOKEN_PATTERN = "{0}?client_id={1}&client_secret={2}&scope=user.read%20mail.read&redirect_uri={3}&refresh_token={4}&grant_type=refresh_token";

90
    private static final String MI_AUTHORIZE_PATTERN = "{0}?client_id={1}&redirect_uri={2}&response_type=code&scope=1%203%204%206&state={3}&skip_confirm=false";
91 92 93 94
    private static final String MI_ACCESS_TOKEN_PATTERN = "{0}?client_id={1}&client_secret={2}&redirect_uri={3}&code={4}&grant_type=authorization_code";
    private static final String MI_USER_INFO_PATTERN = "{0}?clientId={1}&token={2}";
    private static final String MI_REFRESH_TOKEN_PATTERN = "{0}?client_id={1}&client_secret={2}&redirect_uri={3}&refresh_token={4}&grant_type=refresh_token";

95 96 97 98
    private static final String TOUTIAO_ACCESS_TOKEN_PATTERN = "{0}?client_key={1}&client_secret={2}&code={3}&grant_type=authorize_code";
    private static final String TOUTIAO_USER_INFO_PATTERN = "{0}?client_key={1}&access_token={2}";
    private static final String TOUTIAO_AUTHORIZE_PATTERN = "{0}?client_key={1}&redirect_uri={2}&state={3}&response_type=code&auth_only=1&display=0";

99 100 101 102 103 104 105 106 107
    /**
     * 获取state,如果为空, 则默认去当前日期的时间戳
     *
     * @param state state
     */
    private static Object getState(String state) {
        return StringUtils.isEmpty(state) ? String.valueOf(System.currentTimeMillis()) : state;
    }

智布道's avatar
智布道 已提交
108 109 110
    /**
     * 获取githubtoken的接口地址
     *
111 112 113
     * @param clientId     github 应用的Client ID
     * @param clientSecret github 应用的Client Secret
     * @param code         github 授权前的code,用来换token
智布道's avatar
智布道 已提交
114
     * @param redirectUri  待跳转的页面
智布道's avatar
智布道 已提交
115
     * @return full url
智布道's avatar
智布道 已提交
116
     */
117 118
    public static String getGithubAccessTokenUrl(String clientId, String clientSecret, String code, String redirectUri) {
        return MessageFormat.format(GITHUB_ACCESS_TOKEN_PATTERN, AuthSource.GITHUB.accessToken(), clientId, clientSecret, code, redirectUri);
智布道's avatar
智布道 已提交
119 120 121 122 123 124
    }

    /**
     * 获取github用户详情的接口地址
     *
     * @param token github 应用的token
智布道's avatar
智布道 已提交
125
     * @return full url
智布道's avatar
智布道 已提交
126 127
     */
    public static String getGithubUserInfoUrl(String token) {
128
        return MessageFormat.format(GITHUB_USER_INFO_PATTERN, AuthSource.GITHUB.userInfo(), token);
智布道's avatar
智布道 已提交
129 130 131 132 133 134 135
    }

    /**
     * 获取github授权地址
     *
     * @param clientId    github 应用的Client ID
     * @param redirectUrl github 应用授权成功后的回调地址
136
     * @param state       随机字符串,用于保持会话状态,防止CSRF攻击
智布道's avatar
智布道 已提交
137
     * @return full url
智布道's avatar
智布道 已提交
138
     */
139
    public static String getGithubAuthorizeUrl(String clientId, String redirectUrl, String state) {
140
        return MessageFormat.format(GITHUB_AUTHORIZE_PATTERN, AuthSource.GITHUB.authorize(), clientId, redirectUrl, getState(state));
智布道's avatar
智布道 已提交
141 142 143 144 145
    }

    /**
     * 获取weibo token的接口地址
     *
146 147 148
     * @param clientId     weibo 应用的App Key
     * @param clientSecret weibo 应用的App Secret
     * @param code         weibo 授权前的code,用来换token
智布道's avatar
智布道 已提交
149
     * @param redirectUri  待跳转的页面
智布道's avatar
智布道 已提交
150
     * @return full url
智布道's avatar
智布道 已提交
151 152
     */
    public static String getWeiboAccessTokenUrl(String clientId, String clientSecret, String code, String redirectUri) {
153
        return MessageFormat.format(WEIBO_ACCESS_TOKEN_PATTERN, AuthSource.WEIBO.accessToken(), clientId, clientSecret, code, redirectUri);
智布道's avatar
智布道 已提交
154 155 156 157 158 159
    }

    /**
     * 获取weibo用户详情的接口地址
     *
     * @param token weibo 应用的token
智布道's avatar
智布道 已提交
160
     * @return full url
智布道's avatar
智布道 已提交
161
     */
162
    public static String getWeiboUserInfoUrl(String token) {
163
        return MessageFormat.format(WEIBO_USER_INFO_PATTERN, AuthSource.WEIBO.userInfo(), token);
智布道's avatar
智布道 已提交
164 165 166 167 168 169 170
    }

    /**
     * 获取weibo授权地址
     *
     * @param clientId    weibo 应用的Client ID
     * @param redirectUrl weibo 应用授权成功后的回调地址
171
     * @param state       随机字符串,用于保持会话状态,防止CSRF攻击
智布道's avatar
智布道 已提交
172
     * @return full url
智布道's avatar
智布道 已提交
173
     */
174
    public static String getWeiboAuthorizeUrl(String clientId, String redirectUrl, String state) {
175
        return MessageFormat.format(WEIBO_AUTHORIZE_PATTERN, AuthSource.WEIBO.authorize(), clientId, redirectUrl, getState(state));
智布道's avatar
智布道 已提交
176 177 178 179 180
    }

    /**
     * 获取gitee token的接口地址
     *
181 182 183
     * @param clientId     gitee 应用的Client ID
     * @param clientSecret gitee 应用的Client Secret
     * @param code         gitee 授权前的code,用来换token
智布道's avatar
智布道 已提交
184
     * @param redirectUri  待跳转的页面
智布道's avatar
智布道 已提交
185
     * @return full url
智布道's avatar
智布道 已提交
186 187
     */
    public static String getGiteeAccessTokenUrl(String clientId, String clientSecret, String code, String redirectUri) {
188
        return MessageFormat.format(GITEE_ACCESS_TOKEN_PATTERN, AuthSource.GITEE.accessToken(), clientId, clientSecret, code, redirectUri);
智布道's avatar
智布道 已提交
189 190 191 192 193 194
    }

    /**
     * 获取gitee用户详情的接口地址
     *
     * @param token gitee 应用的token
智布道's avatar
智布道 已提交
195
     * @return full url
智布道's avatar
智布道 已提交
196 197
     */
    public static String getGiteeUserInfoUrl(String token) {
198
        return MessageFormat.format(GITEE_USER_INFO_PATTERN, AuthSource.GITEE.userInfo(), token);
智布道's avatar
智布道 已提交
199 200 201 202 203 204 205
    }

    /**
     * 获取gitee授权地址
     *
     * @param clientId    gitee 应用的Client ID
     * @param redirectUrl gitee 应用授权成功后的回调地址
206
     * @param state       随机字符串,用于保持会话状态,防止CSRF攻击
智布道's avatar
智布道 已提交
207 208
     * @return json
     */
209 210
    public static String getGiteeAuthorizeUrl(String clientId, String redirectUrl, String state) {
        return MessageFormat.format(GITEE_AUTHORIZE_PATTERN, AuthSource.GITEE.authorize(), clientId, redirectUrl, getState(state));
智布道's avatar
智布道 已提交
211
    }
智布道's avatar
智布道 已提交
212 213 214 215 216 217

    /**
     * 获取钉钉登录二维码的地址
     *
     * @param clientId    钉钉 应用的App Id
     * @param redirectUrl 钉钉 应用授权成功后的回调地址
智布道's avatar
智布道 已提交
218
     * @param state       随机字符串,用于保持会话状态,防止CSRF攻击
智布道's avatar
智布道 已提交
219 220
     * @return full url
     */
智布道's avatar
智布道 已提交
221 222
    public static String getDingTalkQrConnectUrl(String clientId, String redirectUrl, String state) {
        return MessageFormat.format(DING_TALK_QRCONNECT_PATTERN, AuthSource.DINGTALK.authorize(), clientId, redirectUrl, getState(state));
智布道's avatar
智布道 已提交
223 224 225 226 227 228 229 230 231 232 233
    }

    /**
     * 获取钉钉用户信息的地址
     *
     * @param signature 通过appSecret计算出来的签名值,签名计算方法:https://open-doc.dingtalk.com/microapp/faquestions/hxs5v9
     * @param timestamp 当前时间戳,单位是毫秒
     * @param accessKey 钉钉 应用的App Id
     * @return full url
     */
    public static String getDingTalkUserInfoUrl(String signature, String timestamp, String accessKey) {
234
        return MessageFormat.format(DING_TALK_USER_INFO_PATTERN, AuthSource.DINGTALK.userInfo(), signature, timestamp, accessKey);
智布道's avatar
智布道 已提交
235
    }
236 237 238 239

    /**
     * 获取baidu token的接口地址
     *
240 241 242
     * @param clientId     baidu 应用的API Key
     * @param clientSecret baidu 应用的Secret Key
     * @param code         baidu 授权前的code,用来换token
243 244 245 246
     * @param redirectUri  待跳转的页面
     * @return full url
     */
    public static String getBaiduAccessTokenUrl(String clientId, String clientSecret, String code, String redirectUri) {
247
        return MessageFormat.format(BAIDU_ACCESS_TOKEN_PATTERN, AuthSource.BAIDU.accessToken(), clientId, clientSecret, code, redirectUri);
248 249 250 251 252 253 254 255 256
    }

    /**
     * 获取baidu用户详情的接口地址
     *
     * @param token baidu 应用的token
     * @return full url
     */
    public static String getBaiduUserInfoUrl(String token) {
257
        return MessageFormat.format(BAIDU_USER_INFO_PATTERN, AuthSource.BAIDU.userInfo(), token);
258 259 260 261 262 263 264
    }

    /**
     * 获取baidu授权地址
     *
     * @param clientId    baidu 应用的API Key
     * @param redirectUrl baidu 应用授权成功后的回调地址
智布道's avatar
智布道 已提交
265
     * @param state       随机字符串,用于保持会话状态,防止CSRF攻击
266 267
     * @return json
     */
智布道's avatar
智布道 已提交
268 269
    public static String getBaiduAuthorizeUrl(String clientId, String redirectUrl, String state) {
        return MessageFormat.format(BAIDU_AUTHORIZE_PATTERN, AuthSource.BAIDU.authorize(), clientId, redirectUrl, getState(state));
270 271 272 273 274
    }

    /**
     * 获取收回baidu授权的地址
     *
275
     * @param accessToken baidu 授权登录后的token
276 277 278
     * @return json
     */
    public static String getBaiduRevokeUrl(String accessToken) {
279
        return MessageFormat.format(BAIDU_REVOKE_PATTERN, AuthSource.BAIDU.revoke(), accessToken);
280
    }
281 282 283 284

    /**
     * 获取csdn token的接口地址
     *
285 286 287
     * @param clientId     csdn 应用的App Key
     * @param clientSecret csdn 应用的App Secret
     * @param code         csdn 授权前的code,用来换token
288 289 290 291
     * @param redirectUri  待跳转的页面
     * @return full url
     */
    public static String getCsdnAccessTokenUrl(String clientId, String clientSecret, String code, String redirectUri) {
292
        return MessageFormat.format(CSDN_ACCESS_TOKEN_PATTERN, AuthSource.CSDN.accessToken(), clientId, clientSecret, code, redirectUri);
293 294 295 296 297 298 299 300 301
    }

    /**
     * 获取csdn用户详情的接口地址
     *
     * @param token csdn 应用的token
     * @return full url
     */
    public static String getCsdnUserInfoUrl(String token) {
302
        return MessageFormat.format(CSDN_USER_INFO_PATTERN, AuthSource.CSDN.userInfo(), token);
303 304 305 306 307 308 309
    }

    /**
     * 获取csdn授权地址
     *
     * @param clientId    csdn 应用的Client ID
     * @param redirectUrl csdn 应用授权成功后的回调地址
智布道's avatar
智布道 已提交
310
     * @param state       随机字符串,用于保持会话状态,防止CSRF攻击
311 312
     * @return full url
     */
智布道's avatar
智布道 已提交
313 314
    public static String getCsdnAuthorizeUrl(String clientId, String redirectUrl, String state) {
        return MessageFormat.format(CSDN_AUTHORIZE_PATTERN, AuthSource.CSDN.authorize(), clientId, redirectUrl, getState(state));
315 316 317 318 319
    }

    /**
     * 获取coding token的接口地址
     *
320 321 322
     * @param clientId     coding 应用的App Key
     * @param clientSecret coding 应用的App Secret
     * @param code         coding 授权前的code,用来换token
323 324 325
     * @return full url
     */
    public static String getCodingAccessTokenUrl(String clientId, String clientSecret, String code) {
326
        return MessageFormat.format(CODING_ACCESS_TOKEN_PATTERN, AuthSource.CODING.accessToken(), clientId, clientSecret, code);
327 328 329 330 331 332 333 334 335
    }

    /**
     * 获取coding用户详情的接口地址
     *
     * @param token coding 应用的token
     * @return full url
     */
    public static String getCodingUserInfoUrl(String token) {
336
        return MessageFormat.format(CODING_USER_INFO_PATTERN, AuthSource.CODING.userInfo(), token);
337 338 339 340 341 342 343
    }

    /**
     * 获取coding授权地址
     *
     * @param clientId    coding 应用的Client ID
     * @param redirectUrl coding 应用授权成功后的回调地址
智布道's avatar
智布道 已提交
344
     * @param state       随机字符串,用于保持会话状态,防止CSRF攻击
345 346
     * @return full url
     */
智布道's avatar
智布道 已提交
347 348
    public static String getCodingAuthorizeUrl(String clientId, String redirectUrl, String state) {
        return MessageFormat.format(CODING_AUTHORIZE_PATTERN, AuthSource.CODING.authorize(), clientId, redirectUrl, getState(state));
349 350
    }

351 352 353
    /**
     * 获取腾讯云开发者平台 token的接口地址
     *
354 355 356
     * @param clientId     coding 应用的App Key
     * @param clientSecret coding 应用的App Secret
     * @param code         coding 授权前的code,用来换token
357 358 359
     * @return full url
     */
    public static String getTencentCloudAccessTokenUrl(String clientId, String clientSecret, String code) {
360
        return MessageFormat.format(TENCENT_ACCESS_TOKEN_PATTERN, AuthSource.TENCENT_CLOUD.accessToken(), clientId, clientSecret, code);
361 362 363 364 365 366 367 368 369
    }

    /**
     * 获取腾讯云开发者平台用户详情的接口地址
     *
     * @param token coding 应用的token
     * @return full url
     */
    public static String getTencentCloudUserInfoUrl(String token) {
370
        return MessageFormat.format(TENCENT_USER_INFO_PATTERN, AuthSource.TENCENT_CLOUD.userInfo(), token);
371 372 373 374 375 376 377
    }

    /**
     * 获取腾讯云开发者平台授权地址
     *
     * @param clientId    coding 应用的Client ID
     * @param redirectUrl coding 应用授权成功后的回调地址
智布道's avatar
智布道 已提交
378
     * @param state       随机字符串,用于保持会话状态,防止CSRF攻击
379 380
     * @return full url
     */
智布道's avatar
智布道 已提交
381 382
    public static String getTencentCloudAuthorizeUrl(String clientId, String redirectUrl, String state) {
        return MessageFormat.format(TENCENT_AUTHORIZE_PATTERN, AuthSource.TENCENT_CLOUD.authorize(), clientId, redirectUrl, getState(state));
383 384
    }

385 386 387
    /**
     * 获取oschina token的接口地址
     *
388 389 390
     * @param clientId     oschina 应用的App Key
     * @param clientSecret oschina 应用的App Secret
     * @param code         oschina 授权前的code,用来换token
391 392 393 394
     * @param redirectUri  待跳转的页面
     * @return full url
     */
    public static String getOschinaAccessTokenUrl(String clientId, String clientSecret, String code, String redirectUri) {
395
        return MessageFormat.format(OSCHINA_ACCESS_TOKEN_PATTERN, AuthSource.OSCHINA.accessToken(), clientId, clientSecret, code, redirectUri);
396 397 398 399 400 401 402 403 404
    }

    /**
     * 获取oschina用户详情的接口地址
     *
     * @param token oschina 应用的token
     * @return full url
     */
    public static String getOschinaUserInfoUrl(String token) {
405
        return MessageFormat.format(OSCHINA_USER_INFO_PATTERN, AuthSource.OSCHINA.userInfo(), token);
406 407 408 409 410 411 412
    }

    /**
     * 获取oschina授权地址
     *
     * @param clientId    oschina 应用的Client ID
     * @param redirectUrl oschina 应用授权成功后的回调地址
智布道's avatar
智布道 已提交
413
     * @param state       随机字符串,用于保持会话状态,防止CSRF攻击
414 415
     * @return full url
     */
智布道's avatar
智布道 已提交
416 417
    public static String getOschinaAuthorizeUrl(String clientId, String redirectUrl, String state) {
        return MessageFormat.format(OSCHINA_AUTHORIZE_PATTERN, AuthSource.OSCHINA.authorize(), clientId, redirectUrl, getState(state));
418
    }
419

420 421 422
    /**
     * 获取qq token的接口地址
     *
423 424 425
     * @param clientId     qq 应用的App Key
     * @param clientSecret qq 应用的App Secret
     * @param code         qq 授权前的code,用来换token
426 427 428 429
     * @param redirectUri  待跳转的页面
     * @return full url
     */
    public static String getQqAccessTokenUrl(String clientId, String clientSecret, String code, String redirectUri) {
430
        return MessageFormat.format(QQ_ACCESS_TOKEN_PATTERN, AuthSource.QQ.accessToken(), clientId, clientSecret, code, redirectUri);
431 432 433 434 435
    }

    /**
     * 获取qq用户详情的接口地址
     *
智布道's avatar
智布道 已提交
436 437 438
     * @param clientId qq 应用的clientId
     * @param token    qq 应用的token
     * @param openId   qq 应用的openId
439 440
     * @return full url
     */
441
    public static String getQqUserInfoUrl(String clientId, String token, String openId) {
442
        return MessageFormat.format(QQ_USER_INFO_PATTERN, AuthSource.QQ.userInfo(), clientId, token, openId);
443 444 445 446 447 448 449
    }

    /**
     * 获取qq授权地址
     *
     * @param clientId    qq 应用的Client ID
     * @param redirectUrl qq 应用授权成功后的回调地址
智布道's avatar
智布道 已提交
450
     * @param state       随机字符串,用于保持会话状态,防止CSRF攻击
451 452
     * @return full url
     */
智布道's avatar
智布道 已提交
453 454
    public static String getQqAuthorizeUrl(String clientId, String redirectUrl, String state) {
        return MessageFormat.format(QQ_AUTHORIZE_PATTERN, AuthSource.QQ.authorize(), clientId, redirectUrl, getState(state));
455 456 457 458 459
    }

    /**
     * 获取qq授权地址
     *
460 461 462
     * @param url     获取qqopenid的api接口地址
     * @param token   qq 应用授权的token
     * @param unionid 是否需要获取unionid,默认为false。注:获取unionid需要单独发送邮件申请权限,请个人视情况而定。参考链接:http://wiki.connect.qq.com/unionid%E4%BB%8B%E7%BB%8D
463 464
     * @return full url
     */
465 466
    public static String getQqOpenidUrl(String url, String token, boolean unionid) {
        return MessageFormat.format(QQ_OPENID_PATTERN, url, token, unionid ? 1 : 0);
467 468
    }

469 470 471 472 473
    /**
     * 获取alipay授权地址
     *
     * @param clientId    alipay 应用的Client ID
     * @param redirectUrl alipay 应用授权成功后的回调地址
智布道's avatar
智布道 已提交
474
     * @param state       随机字符串,用于保持会话状态,防止CSRF攻击
475 476
     * @return full url
     */
智布道's avatar
智布道 已提交
477 478
    public static String getAlipayAuthorizeUrl(String clientId, String redirectUrl, String state) {
        return MessageFormat.format(ALIPAY_AUTHORIZE_PATTERN, AuthSource.ALIPAY.authorize(), clientId, redirectUrl, getState(state));
479
    }
480 481 482 483

    /**
     * 获取微信 授权地址
     *
484 485
     * @param clientId    微信 应用的appid
     * @param redirectUrl 微信 应用授权成功后的回调地址
智布道's avatar
智布道 已提交
486
     * @param state       随机字符串,用于保持会话状态,防止CSRF攻击
487 488
     * @return full url
     */
智布道's avatar
智布道 已提交
489 490
    public static String getWeChatAuthorizeUrl(String clientId, String redirectUrl, String state) {
        return MessageFormat.format(WECHAT_AUTHORIZE_PATTERN, AuthSource.WECHAT.authorize(), clientId, redirectUrl, getState(state));
491 492 493 494 495
    }

    /**
     * 获取微信 token的接口地址
     *
496 497 498
     * @param clientId     微信 应用的appid
     * @param clientSecret 微信 应用的secret
     * @param code         微信 授权前的code,用来换token
499 500 501
     * @return full url
     */
    public static String getWeChatAccessTokenUrl(String clientId, String clientSecret, String code) {
502
        return MessageFormat.format(WECHAT_ACCESS_TOKEN_PATTERN, AuthSource.WECHAT.accessToken(), clientId, clientSecret, code);
503 504 505 506 507
    }

    /**
     * 获取微信 用户详情的接口地址
     *
508 509
     * @param token  微信 应用返回的 access token
     * @param openId 微信 应用返回的openId
510 511 512
     * @return full url
     */
    public static String getWeChatUserInfoUrl(String token, String openId) {
513
        return MessageFormat.format(WECHAT_USER_INFO_PATTERN, AuthSource.WECHAT.userInfo(), token, openId);
514 515 516 517 518
    }

    /**
     * 获取微信 刷新令牌 地址
     *
519 520
     * @param clientId     微信 应用的appid
     * @param refreshToken 微信 应用返回的刷新token
521 522 523
     * @return full url
     */
    public static String getWeChatRefreshUrl(String clientId, String refreshToken) {
524
        return MessageFormat.format(WECHAT_REFRESH_TOKEN_PATTERN, AuthSource.WECHAT.refresh(), clientId, refreshToken);
525
    }
526 527 528 529

    /**
     * 获取Taobao token的接口地址: 淘宝的授权登录,在这一步就会返回用户信息
     *
530 531 532
     * @param clientId     taobao 应用的App Key
     * @param clientSecret taobao 应用的App Secret
     * @param code         taobao 授权前的code,用来换token
533 534 535 536
     * @param redirectUri  待跳转的页面
     * @return full url
     */
    public static String getTaobaoAccessTokenUrl(String clientId, String clientSecret, String code, String redirectUri) {
537
        return MessageFormat.format(TAOBAO_ACCESS_TOKEN_PATTERN, AuthSource.TAOBAO.accessToken(), clientId, clientSecret, code, redirectUri);
538 539 540 541 542 543 544
    }

    /**
     * 获取Taobao授权地址
     *
     * @param clientId    Taobao 应用的Client ID
     * @param redirectUrl Taobao 应用授权成功后的回调地址
智布道's avatar
智布道 已提交
545
     * @param state       随机字符串,用于保持会话状态,防止CSRF攻击
546 547
     * @return full url
     */
智布道's avatar
智布道 已提交
548 549
    public static String getTaobaoAuthorizeUrl(String clientId, String redirectUrl, String state) {
        return MessageFormat.format(TAOBAO_AUTHORIZE_PATTERN, AuthSource.TAOBAO.authorize(), clientId, redirectUrl, getState(state));
550
    }
551 552 553 554 555 556

    /**
     * 获取Google授权地址
     *
     * @param clientId    google 应用的Client ID
     * @param redirectUrl google 应用授权成功后的回调地址
智布道's avatar
智布道 已提交
557
     * @param state       随机字符串,用于保持会话状态,防止CSRF攻击
558 559
     * @return full url
     */
智布道's avatar
智布道 已提交
560 561
    public static String getGoogleAuthorizeUrl(String clientId, String redirectUrl, String state) {
        return MessageFormat.format(GOOGLE_AUTHORIZE_PATTERN, AuthSource.GOOGLE.authorize(), clientId, redirectUrl, getState(state));
562 563 564 565 566
    }

    /**
     * 获取Google token的接口地址
     *
567 568 569
     * @param clientId     google 应用的Client ID
     * @param clientSecret google 应用的Client Secret
     * @param code         google 授权前的code,用来换token
570 571 572 573
     * @param redirectUri  待跳转的页面
     * @return full url
     */
    public static String getGoogleAccessTokenUrl(String clientId, String clientSecret, String code, String redirectUri) {
574
        return MessageFormat.format(GOOGLE_ACCESS_TOKEN_PATTERN, AuthSource.GOOGLE.accessToken(), clientId, clientSecret, code, redirectUri);
575 576 577 578 579 580 581 582 583
    }

    /**
     * 获取Google用户详情的接口地址
     *
     * @param token google 应用的token
     * @return full url
     */
    public static String getGoogleUserInfoUrl(String token) {
584
        return MessageFormat.format(GOOGLE_USER_INFO_PATTERN, AuthSource.GOOGLE.userInfo(), token);
585
    }
586 587 588 589 590 591

    /**
     * 获取Facebook授权地址
     *
     * @param clientId    Facebook 应用的Client ID
     * @param redirectUrl Facebook 应用授权成功后的回调地址
智布道's avatar
智布道 已提交
592
     * @param state       随机字符串,用于保持会话状态,防止CSRF攻击
593 594
     * @return full url
     */
智布道's avatar
智布道 已提交
595 596
    public static String getFacebookAuthorizeUrl(String clientId, String redirectUrl, String state) {
        return MessageFormat.format(FACEBOOK_AUTHORIZE_PATTERN, AuthSource.FACEBOOK.authorize(), clientId, redirectUrl, getState(state));
597 598 599 600 601 602 603 604 605 606 607 608
    }

    /**
     * 获取Facebook token的接口地址
     *
     * @param clientId     Facebook 应用的Client ID
     * @param clientSecret Facebook 应用的Client Secret
     * @param code         Facebook 授权前的code,用来换token
     * @param redirectUri  待跳转的页面
     * @return full url
     */
    public static String getFacebookAccessTokenUrl(String clientId, String clientSecret, String code, String redirectUri) {
609
        return MessageFormat.format(FACEBOOK_ACCESS_TOKEN_PATTERN, AuthSource.FACEBOOK.accessToken(), clientId, clientSecret, code, redirectUri);
610 611 612 613 614 615 616 617 618
    }

    /**
     * 获取Facebook用户详情的接口地址
     *
     * @param token Facebook 应用的token
     * @return full url
     */
    public static String getFacebookUserInfoUrl(String token) {
619
        return MessageFormat.format(FACEBOOK_USER_INFO_PATTERN, AuthSource.FACEBOOK.userInfo(), token);
620
    }
621 622 623 624 625 626

    /**
     * 获取Douyin授权地址
     *
     * @param clientId    Douyin 应用的Client ID
     * @param redirectUrl Douyin 应用授权成功后的回调地址
智布道's avatar
智布道 已提交
627
     * @param state       随机字符串,用于保持会话状态,防止CSRF攻击
628 629
     * @return full url
     */
智布道's avatar
智布道 已提交
630 631
    public static String getDouyinAuthorizeUrl(String clientId, String redirectUrl, String state) {
        return MessageFormat.format(DOUYIN_AUTHORIZE_PATTERN, AuthSource.DOUYIN.authorize(), clientId, redirectUrl, getState(state));
632 633 634 635 636 637 638 639 640 641 642
    }

    /**
     * 获取Douyin token的接口地址
     *
     * @param clientId     Douyin 应用的Client ID
     * @param clientSecret Douyin 应用的Client Secret
     * @param code         Douyin 授权前的code,用来换token
     * @return full url
     */
    public static String getDouyinAccessTokenUrl(String clientId, String clientSecret, String code) {
643
        return MessageFormat.format(DOUYIN_ACCESS_TOKEN_PATTERN, AuthSource.DOUYIN.accessToken(), clientId, clientSecret, code);
644 645 646 647 648 649 650 651 652 653
    }

    /**
     * 获取Douyin用户详情的接口地址
     *
     * @param token  Douyin 应用的token
     * @param openId 用户在当前应用的唯一标识 通过token接口获取
     * @return full url
     */
    public static String getDouyinUserInfoUrl(String token, String openId) {
654
        return MessageFormat.format(DOUYIN_USER_INFO_PATTERN, AuthSource.DOUYIN.userInfo(), token, openId);
655 656 657 658 659
    }

    /**
     * 获取Douyin 刷新令牌 地址
     *
660 661
     * @param clientId     Douyin 应用的client_key
     * @param refreshToken Douyin 应用返回的refresh_token
662 663 664
     * @return full url
     */
    public static String getDouyinRefreshUrl(String clientId, String refreshToken) {
665
        return MessageFormat.format(DOUYIN_REFRESH_TOKEN_PATTERN, AuthSource.DOUYIN.refresh(), clientId, refreshToken);
666 667 668 669 670 671 672
    }

    /**
     * 获取Linkedin授权地址
     *
     * @param clientId    Linkedin 应用的Client ID
     * @param redirectUrl Linkedin 应用授权成功后的回调地址
智布道's avatar
智布道 已提交
673
     * @param state       随机字符串,用于保持会话状态,防止CSRF攻击
674 675
     * @return full url
     */
智布道's avatar
智布道 已提交
676 677
    public static String getLinkedinAuthorizeUrl(String clientId, String redirectUrl, String state) {
        return MessageFormat.format(LINKEDIN_AUTHORIZE_PATTERN, AuthSource.LINKEDIN.authorize(), clientId, redirectUrl, state);
678 679 680 681 682 683 684 685
    }

    /**
     * 获取Linkedin token的接口地址
     *
     * @param clientId     Linkedin 应用的Client ID
     * @param clientSecret Linkedin 应用的Client Secret
     * @param code         Linkedin 授权前的code,用来换token
686
     * @param redirectUrl  Linkedin 应用授权成功后的回调地址
687 688 689
     * @return full url
     */
    public static String getLinkedinAccessTokenUrl(String clientId, String clientSecret, String code, String redirectUrl) {
690
        return MessageFormat.format(LINKEDIN_ACCESS_TOKEN_PATTERN, AuthSource.LINKEDIN.accessToken(), clientId, clientSecret, code, redirectUrl);
691 692 693 694 695 696 697 698
    }

    /**
     * 获取Linkedin用户详情的接口地址
     *
     * @return full url
     */
    public static String getLinkedinUserInfoUrl() {
699
        return MessageFormat.format(LINKEDIN_USER_INFO_PATTERN, AuthSource.LINKEDIN.userInfo());
700 701 702 703 704
    }

    /**
     * 获取Linkedin 刷新令牌 地址
     *
705
     * @param clientId     Linkedin 应用的client_key
706
     * @param clientSecret Linkedin 应用的Client Secret
707
     * @param refreshToken Linkedin 应用返回的refresh_token
708 709 710
     * @return full url
     */
    public static String getLinkedinRefreshUrl(String clientId, String clientSecret, String refreshToken) {
711
        return MessageFormat.format(LINKEDIN_REFRESH_TOKEN_PATTERN, AuthSource.LINKEDIN.refresh(), clientId, clientSecret, refreshToken);
712
    }
713 714 715 716 717 718

    /**
     * 获取微软授权地址
     *
     * @param clientId    微软 应用的Client ID
     * @param redirectUrl 微软 应用授权成功后的回调地址
智布道's avatar
智布道 已提交
719
     * @param state       随机字符串,用于保持会话状态,防止CSRF攻击
720 721
     * @return full url
     */
智布道's avatar
智布道 已提交
722 723
    public static String getMicrosoftAuthorizeUrl(String clientId, String redirectUrl, String state) {
        return MessageFormat.format(MICROSOFT_AUTHORIZE_PATTERN, AuthSource.MICROSOFT.authorize(), clientId, redirectUrl, getState(state));
724 725 726 727 728 729 730 731 732 733 734
    }

    /**
     * 获取微软 token的接口地址
     *
     * @param clientId     微软 应用的Client ID
     * @param clientSecret 微软 应用的Client Secret
     * @param redirectUrl  微软 应用授权成功后的回调地址
     * @param code         微软 授权前的code,用来换token
     * @return full url
     */
735
    public static String getMicrosoftAccessTokenUrl(String clientId, String clientSecret, String redirectUrl, String code) {
736
        return MessageFormat.format(MICROSOFT_ACCESS_TOKEN_PATTERN, AuthSource.MICROSOFT.accessToken(), clientId, clientSecret, redirectUrl, code);
737 738 739 740 741 742 743 744
    }

    /**
     * 获取微软用户详情的接口地址
     *
     * @return full url
     */
    public static String getMicrosoftUserInfoUrl() {
745
        return MessageFormat.format(MICROSOFT_USER_INFO_PATTERN, AuthSource.MICROSOFT.userInfo());
746 747 748 749 750
    }

    /**
     * 获取微软 刷新令牌 地址
     *
751
     * @param clientId     微软 应用的client_key
752 753
     * @param clientSecret 微软 应用的Client Secret
     * @param redirectUrl  微软 应用授权成功后的回调地址
754
     * @param refreshToken 微软 应用返回的refresh_token
755 756 757
     * @return full url
     */
    public static String getMicrosoftRefreshUrl(String clientId, String clientSecret, String redirectUrl, String refreshToken) {
758
        return MessageFormat.format(MICROSOFT_REFRESH_TOKEN_PATTERN, AuthSource.MICROSOFT.refresh(), clientId, clientSecret, redirectUrl, refreshToken);
759
    }
760 761 762 763 764 765

    /**
     * 获取小米授权地址
     *
     * @param clientId    小米 应用的Client ID
     * @param redirectUrl 小米 应用授权成功后的回调地址
智布道's avatar
智布道 已提交
766
     * @param state       随机字符串,用于保持会话状态,防止CSRF攻击
767 768
     * @return full url
     */
智布道's avatar
智布道 已提交
769 770
    public static String getMiAuthorizeUrl(String clientId, String redirectUrl, String state) {
        return MessageFormat.format(MI_AUTHORIZE_PATTERN, AuthSource.MI.authorize(), clientId, redirectUrl, getState(state));
771 772 773 774 775 776 777 778 779 780 781 782
    }

    /**
     * 获取小米 token的接口地址
     *
     * @param clientId     小米 应用的Client ID
     * @param clientSecret 小米 应用的Client Secret
     * @param redirectUrl  小米 应用授权成功后的回调地址
     * @param code         小米 授权前的code,用来换token
     * @return full url
     */
    public static String getMiAccessTokenUrl(String clientId, String clientSecret, String redirectUrl, String code) {
783
        return MessageFormat.format(MI_ACCESS_TOKEN_PATTERN, AuthSource.MI.accessToken(), clientId, clientSecret, redirectUrl, code);
784 785 786 787 788 789 790 791 792 793
    }

    /**
     * 获取小米用户详情的接口地址
     *
     * @param clientId 小米 应用的client_key
     * @param token    token
     * @return full url
     */
    public static String getMiUserInfoUrl(String clientId, String token) {
794
        return MessageFormat.format(MI_USER_INFO_PATTERN, AuthSource.MI.userInfo(), clientId, token);
795 796 797 798 799 800 801 802 803 804 805 806
    }

    /**
     * 获取小米 刷新令牌 地址
     *
     * @param clientId     小米 应用的client_key
     * @param clientSecret 小米 应用的Client Secret
     * @param redirectUrl  小米 应用授权成功后的回调地址
     * @param refreshToken 小米 应用返回的refresh_token
     * @return full url
     */
    public static String getMiRefreshUrl(String clientId, String clientSecret, String redirectUrl, String refreshToken) {
807
        return MessageFormat.format(MI_REFRESH_TOKEN_PATTERN, AuthSource.MI.refresh(), clientId, clientSecret, redirectUrl, refreshToken);
808
    }
809 810 811 812 813 814

    /**
     * 获取今日头条授权地址
     *
     * @param clientId    今日头条 应用的Client ID
     * @param redirectUrl 今日头条 应用授权成功后的回调地址
智布道's avatar
智布道 已提交
815
     * @param state       随机字符串,用于保持会话状态,防止CSRF攻击
816 817
     * @return full url
     */
智布道's avatar
智布道 已提交
818 819
    public static String getToutiaoAuthorizeUrl(String clientId, String redirectUrl, String state) {
        return MessageFormat.format(TOUTIAO_AUTHORIZE_PATTERN, AuthSource.TOUTIAO.authorize(), clientId, redirectUrl, getState(state));
820 821 822 823 824 825 826 827 828 829 830
    }

    /**
     * 获取今日头条 token的接口地址
     *
     * @param clientId     今日头条 应用的Client ID
     * @param clientSecret 今日头条 应用的Client Secret
     * @param code         今日头条 授权前的code,用来换token
     * @return full url
     */
    public static String getToutiaoAccessTokenUrl(String clientId, String clientSecret, String code) {
831
        return MessageFormat.format(TOUTIAO_ACCESS_TOKEN_PATTERN, AuthSource.TOUTIAO.accessToken(), clientId, clientSecret, code);
832 833 834 835 836 837 838 839 840 841
    }

    /**
     * 获取今日头条用户详情的接口地址
     *
     * @param clientId 今日头条 应用的client_key
     * @param token    token
     * @return full url
     */
    public static String getToutiaoUserInfoUrl(String clientId, String token) {
842
        return MessageFormat.format(TOUTIAO_USER_INFO_PATTERN, AuthSource.TOUTIAO.userInfo(), clientId, token);
843
    }
智布道's avatar
智布道 已提交
844
}