package cn.lili.modules.connect.util; import cn.lili.cache.Cache; import cn.lili.modules.connect.config.AuthConfig; import cn.lili.modules.connect.config.ConnectAuth; import cn.lili.modules.connect.config.ConnectAuthEnum; import cn.lili.modules.connect.entity.dto.AuthCallback; import cn.lili.modules.connect.entity.enums.AuthResponseStatus; import cn.lili.modules.connect.exception.AuthException; import org.apache.commons.lang3.StringUtils; /** * 授权配置类的校验器 * * @author yadong.zhang (yadong.zhang0415(a)gmail.com) * @since 1.6.1-beta */ public class AuthChecker { /** * 是否支持第三方登录 * * @param config config * @param connectAuth source * @return true or false * @since 1.6.1-beta */ public static boolean isSupportedAuth(AuthConfig config, ConnectAuth connectAuth) { boolean isSupported = StringUtils.isNotEmpty(config.getClientId()) && StringUtils.isNotEmpty(config.getClientSecret()) && StringUtils.isNotEmpty(config.getRedirectUri()); if (isSupported && ConnectAuthEnum.ALIPAY == connectAuth) { isSupported = StringUtils.isNotEmpty(config.getAlipayPublicKey()); } return isSupported; } /** * 检查配置合法性。针对部分平台, 对redirect uri有特定要求。一般来说redirect uri都是http://,而对于facebook平台, redirect uri 必须是https的链接 * * @param config config * @param connectAuth source * @since 1.6.1-beta */ public static void checkConfig(AuthConfig config, ConnectAuth connectAuth) { String redirectUri = config.getRedirectUri(); if (!GlobalAuthUtils.isHttpProtocol(redirectUri) && !GlobalAuthUtils.isHttpsProtocol(redirectUri)) { throw new AuthException(AuthResponseStatus.ILLEGAL_REDIRECT_URI, connectAuth); } //支付宝在创建回调地址时,不允许使用localhost或者106.124.130.167 if (ConnectAuthEnum.ALIPAY == connectAuth && GlobalAuthUtils.isLocalHost(redirectUri)) { //The redirect uri of alipay is forbidden to use localhost or 106.124.130.167 throw new AuthException(AuthResponseStatus.ILLEGAL_REDIRECT_URI, connectAuth); } } /** * 校验回调传回的code *
* {@code v1.10.0}版本中改为传入{@code source}和{@code callback},对于不同平台使用不同参数接受code的情况统一做处理 * * @param connectAuth 当前授权平台 * @param callback 从第三方授权回调回来时传入的参数集合 * @since 1.8.0 */ public static void checkCode(ConnectAuth connectAuth, AuthCallback callback) { String code = callback.getCode(); if (connectAuth == ConnectAuthEnum.ALIPAY) { code = callback.getAuthCode(); } if (StringUtils.isEmpty(code)) { throw new AuthException(AuthResponseStatus.ILLEGAL_CODE, connectAuth); } } /** * 校验回调传回的{@code state},为空或者不存在 *
* {@code state}不存在的情况只有两种: * 1. {@code state}已使用,被正常清除 * 2. {@code state}为前端伪造,本身就不存在 * * @param state {@code state}一定不为空 */ public static void checkState(String state, ConnectAuth connectAuth, Cache cache) { if (StringUtils.isEmpty(state) || !cache.hasKey(state)) { throw new AuthException(AuthResponseStatus.ILLEGAL_STATUS, connectAuth); } } }