AuthChecker.java 3.2 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.AuthSource;
5 6
import me.zhyd.oauth.exception.AuthException;
import me.zhyd.oauth.request.ResponseStatus;
智布道's avatar
智布道 已提交
7 8

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

    /**
智布道's avatar
智布道 已提交
18
     * 是否支持第三方登录
智布道's avatar
智布道 已提交
19
     *
20
     * @param config config
21
     * @param source source
智布道's avatar
智布道 已提交
22 23
     * @return true or false
     */
24 25 26 27 28 29 30 31 32 33 34 35 36 37
    public static boolean isSupportedAuth(AuthConfig config, AuthSource source) {
        boolean isSupported = StringUtils.isNotEmpty(config.getClientId()) && StringUtils.isNotEmpty(config.getClientSecret()) && StringUtils.isNotEmpty(config.getRedirectUri());
        if (isSupported && AuthSource.ALIPAY == source) {
            isSupported = StringUtils.isNotEmpty(config.getAlipayPublicKey());
        }
        return isSupported;
    }

    /**
     * 检查配置合法性。针对部分平台, 对redirect uri有特定要求。一般来说redirect uri都是http://,而对于facebook平台, redirect uri 必须是https的链接
     *
     * @param config config
     * @param source source
     */
38
    public static void checkConfig(AuthConfig config, AuthSource source) {
39 40 41 42
        String redirectUri = config.getRedirectUri();
        if (!GlobalAuthUtil.isHttpProtocol(redirectUri) && !GlobalAuthUtil.isHttpsProtocol(redirectUri)) {
            throw new AuthException(ResponseStatus.ILLEGAL_REDIRECT_URI);
        }
43
        // facebook的回调地址必须为https的链接
44 45 46
        if (AuthSource.FACEBOOK == source && !GlobalAuthUtil.isHttpsProtocol(redirectUri)) {
            throw new AuthException(ResponseStatus.ILLEGAL_REDIRECT_URI);
        }
47 48 49 50
        // 支付宝在创建回调地址时,不允许使用localhost或者127.0.0.1
        if (AuthSource.ALIPAY == source && GlobalAuthUtil.isLocalHost(redirectUri)) {
            throw new AuthException(ResponseStatus.ILLEGAL_REDIRECT_URI);
        }
智布道's avatar
智布道 已提交
51
    }
52 53 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

    /**
     * 校验回调传回的code
     *
     * @param code 回调时传回的code
     */
    public static void checkCode(String code) {
        if (StringUtils.isEmpty(code)) {
            throw new AuthException(ResponseStatus.ILLEGAL_CODE);
        }
    }

    /**
     * 校验state的合法性防止被CSRF
     *
     * @param newState      新的state,一般为回调时传回的state(可能被篡改)
     * @param originalState 原始的state,发起授权时向第三方平台传递的state
     */
    public static void checkState(String newState, String originalState) {
        // 如果原始state为空,表示当前平台未使用state
        if (StringUtils.isEmpty(originalState)) {
            return;
        }
        // 如果授权之前使用了state,但是回调时未返回state,则表示当前请求为非法的请求,可能正在被CSRF攻击
        if (StringUtils.isEmpty(newState)) {
            throw new AuthException(ResponseStatus.ILLEGAL_REQUEST);
        }
        // 如果授权前后的state不一致,则表示当前请求为非法的请求,新的state可能为伪造
        if (!newState.equals(originalState)) {
            throw new AuthException(ResponseStatus.ILLEGAL_REQUEST);
        }
    }
智布道's avatar
智布道 已提交
84
}