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

import me.zhyd.oauth.config.AuthConfig;
4
import me.zhyd.oauth.config.AuthDefaultSource;
5
import me.zhyd.oauth.config.AuthSource;
智布道's avatar
智布道 已提交
6
import me.zhyd.oauth.enums.AuthResponseStatus;
7
import me.zhyd.oauth.exception.AuthException;
智布道's avatar
智布道 已提交
8
import me.zhyd.oauth.model.AuthCallback;
智布道's avatar
智布道 已提交
9 10

/**
智布道's avatar
智布道 已提交
11 12
 * 授权配置类的校验器
 *
智布道's avatar
智布道 已提交
13
 * @author yadong.zhang (yadong.zhang0415(a)gmail.com)
智布道's avatar
智布道 已提交
14
 * @since 1.6.1-beta
智布道's avatar
智布道 已提交
15
 */
16
public class AuthChecker {
智布道's avatar
智布道 已提交
17 18

    /**
智布道's avatar
智布道 已提交
19
     * 是否支持第三方登录
智布道's avatar
智布道 已提交
20
     *
21
     * @param config config
22
     * @param source source
智布道's avatar
智布道 已提交
23
     * @return true or false
智布道's avatar
智布道 已提交
24
     * @since 1.6.1-beta
智布道's avatar
智布道 已提交
25
     */
26
    public static boolean isSupportedAuth(AuthConfig config, AuthSource source) {
不合群的混子's avatar
不合群的混子 已提交
27
        boolean isSupported = StringUtils.isNotEmpty(config.getClientId()) && StringUtils.isNotEmpty(config.getClientSecret()) && StringUtils.isNotEmpty(config.getRedirectUri());
28
        if (isSupported && AuthDefaultSource.ALIPAY == source) {
29 30
            isSupported = StringUtils.isNotEmpty(config.getAlipayPublicKey());
        }
31
        if (isSupported && AuthDefaultSource.STACK_OVERFLOW == source) {
32 33
            isSupported = StringUtils.isNotEmpty(config.getStackOverflowKey());
        }
34
        if (isSupported && AuthDefaultSource.WECHAT_ENTERPRISE == source){
35 36
            isSupported = StringUtils.isNotEmpty(config.getAgentId());
        }
37 38 39 40 41 42 43 44
        return isSupported;
    }

    /**
     * 检查配置合法性。针对部分平台, 对redirect uri有特定要求。一般来说redirect uri都是http://,而对于facebook平台, redirect uri 必须是https的链接
     *
     * @param config config
     * @param source source
智布道's avatar
智布道 已提交
45
     * @since 1.6.1-beta
46
     */
47
    public static void checkConfig(AuthConfig config, AuthSource source) {
48 49
        String redirectUri = config.getRedirectUri();
        if (!GlobalAuthUtil.isHttpProtocol(redirectUri) && !GlobalAuthUtil.isHttpsProtocol(redirectUri)) {
智布道's avatar
智布道 已提交
50
            throw new AuthException(AuthResponseStatus.ILLEGAL_REDIRECT_URI);
51
        }
52
        // facebook的回调地址必须为https的链接
53
        if (AuthDefaultSource.FACEBOOK == source && !GlobalAuthUtil.isHttpsProtocol(redirectUri)) {
智布道's avatar
智布道 已提交
54
            throw new AuthException(AuthResponseStatus.ILLEGAL_REDIRECT_URI);
55
        }
56
        // 支付宝在创建回调地址时,不允许使用localhost或者127.0.0.1
57
        if (AuthDefaultSource.ALIPAY == source && GlobalAuthUtil.isLocalHost(redirectUri)) {
智布道's avatar
智布道 已提交
58
            throw new AuthException(AuthResponseStatus.ILLEGAL_REDIRECT_URI);
59
        }
智布道's avatar
智布道 已提交
60
    }
61 62 63

    /**
     * 校验回调传回的code
智布道's avatar
智布道 已提交
64
     * <p>
65
     * {@code v1.10.0}版本中改为传入{@code source}和{@code callback},对于不同平台使用不同参数接受code的情况统一做处理
66
     *
智布道's avatar
智布道 已提交
67 68
     * @param source   当前授权平台
     * @param callback 从第三方授权回调回来时传入的参数集合
智布道's avatar
智布道 已提交
69
     * @since 1.8.0
70
     */
智布道's avatar
智布道 已提交
71 72
    public static void checkCode(AuthSource source, AuthCallback callback) {
        String code = callback.getCode();
73
        if (source == AuthDefaultSource.ALIPAY) {
智布道's avatar
智布道 已提交
74
            code = callback.getAuth_code();
75
        } else if (source == AuthDefaultSource.HUAWEI) {
智布道's avatar
智布道 已提交
76 77
            code = callback.getAuthorization_code();
        }
78
        if (StringUtils.isEmpty(code)) {
智布道's avatar
智布道 已提交
79
            throw new AuthException(AuthResponseStatus.ILLEGAL_CODE);
80 81
        }
    }
智布道's avatar
智布道 已提交
82
}