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 首次发布
本文介绍了一个用于处理Google登录请求的Java类。该类实现了LoginHandler接口,并通过验证ID令牌来获取用户的唯一标识符(sub),用于后续的账户管理和第三方绑定操作。
2332





