package com.sf.oauth.utils; import cn.hutool.core.util.StrUtil; import com.sf.common.constant.HttpStatus; import com.sf.oauth.config.AuthConfig; import com.sf.oauth.enums.AuthDefaultSource; import com.sf.oauth.config.AuthSource; import com.sf.oauth.exception.AuthException; import com.sf.oauth.domain.AuthCallback; /** * 授权配置类的校验器 * * @author ZK */ public class AuthChecker { /** * 是否支持第三方登录 * * @param config config * @param source source * @return true or false */ public static boolean isSupportedAuth(AuthConfig config, AuthSource source) { return StrUtil.isNotEmpty(config.getClientId()) && StrUtil.isNotEmpty(config.getClientSecret()) && null != source; } /** * 检查配置合法性。针对部分平台, 对redirect uri有特定要求。一般来说redirect uri都是http://, * 而对于部分平台, redirect uri 必须是https的链接 * * @param config config * @param source source */ public static void checkConfig(AuthConfig config, AuthSource source) { String redirectUri = config.getRedirectUri(); if (StrUtil.isEmpty(redirectUri)) { throw new AuthException(HttpStatus.BAD_REQUEST, "Illegal redirect uri", source); } if (!AuthUtils.isHttpProtocol(redirectUri) && !AuthUtils.isHttpsProtocol(redirectUri)) { throw new AuthException(HttpStatus.BAD_REQUEST, "Illegal redirect uri", source); } } /** * 校验回调传回的code *
* {@code v1.10.0}版本中改为传入{@code source}和{@code callback},对于不同平台使用不同参数接受code的情况统一做处理 * * @param source 当前授权平台 * @param callback 从第三方授权回调回来时传入的参数集合 */ public static void checkCode(AuthSource source, AuthCallback callback) { if (StrUtil.isEmpty(callback.getCode())) { throw new AuthException(HttpStatus.UNAUTHORIZED,"Illegal code", source); } } /** * 校验回调传回的{@code state},为空或者不存在 *
* {@code state}不存在的情况只有两种: * 1. {@code state}已使用,被正常清除 * 2. {@code state}为前端伪造,本身就不存在 * * @param state {@code state}一定不为空 * @param source {@code source}当前授权平台 */ public static void checkState(String state, AuthSource source) { if (StrUtil.isEmpty(state)) { throw new AuthException(HttpStatus.UNAUTHORIZED,"Illegal state", source); } } }