import java.util.*; @Component public class GoogleLogin implements LoginHandler { public GoogleLogin() { LoginHandlerFactory.addHandler(AccountConstant.LoginTypeEnum.ByGoogle, this); } private static String verifyUrl = "https://www.googleapis.com/oauth2/v3/tokeninfo"; private final Logger log = LoggerFactory.getLogger(this.getClass()); private static final String DefaultDecode = "UTF-8"; @Autowired private AccountManager accountManager; @Autowired private UserForbiddenManager userForbiddenManager; @Autowired private SmsService smsService; @Autowired private AppThirdBindManager thirdBindManager; @Override public AccountThirdBO process(LoginRequest req) { if (StringUtils.isEmpty(req.getIdToken())) { throw new BusinessException(ResultEnum.PARA_ERR); } String provider = AccountConstant.ProviderEnum.google.toString(); AppThirdBindCfgBO bindCfgBO = thirdBindManager.getLoginAppThirdBindCfgBO(req.getAppPackageName(), DeviceTypeEnum.getDeviceTypeEnum(req.getDeviceType()), LoginTypeEnum.Google); if (bindCfgBO == null || StringUtils.isEmpty(bindCfgBO.getThirdAppId())) { throw new BusinessException(ResultEnum.CONFIG_PARAM_UNEXIST); } String thirdId = getGoogleTokenUnionId(req.getIdToken(), bindCfgBO.getThirdAppId()); AccountIndex accountIndex = accountManager.getAccountIndex(provider, thirdId); boolean unregistered = accountIndex == null; if (!unregistered) { accountManager.checkPhoneValidation(accountIndex.getUid()); } List<ThirdInfo> thirdInfoList = new ArrayList<>(); thirdInfoList.add(new ThirdInfo(provider, thirdId, thirdId, "")); return new AccountThirdBO(thirdInfoList, accountIndex == null ? null : accountIndex.getUid(), unregistered, false, unregistered); } private String getGoogleTokenUnionId(String idToken, String clientId) { //判断idToken是否为空或者null if (StringUtils.isEmpty(idToken)) { throw new BusinessException(ResultEnum.PARA_ERR); } Map<String, String> paramMap = new HashMap<>(); paramMap.put("id_token", idToken); String result = HttpInvokeUtil.httpPost(verifyUrl, paramMap,DefaultDecode); log.info("checkGoogleToken idToken:{} result:{}", idToken, result); if (StringUtils.isBlank(result)) { throw new BusinessException(ResultEnum.PARA_ERR); } JSONObject jsonObject = JSON.parseObject(result); String dataKey = "aud"; if (jsonObject.containsKey(dataKey)) { String aud = jsonObject.getString(dataKey); if (clientId.equals(aud)) { return jsonObject.get("sub").toString(); } } throw new BusinessException(ResultEnum.PARA_ERR); } }
google第三方登陆服务器校验
于 2021-03-04 15:02:50 首次发布