正如标题所说,我正在尝试使用带有Spring Boot后端服务器的Google Sign-In API,如here所述。
仅仅为了描述上下文,Spring后端基本上是一个资源+认证服务器,它目前通过Google SSO或简单的表单登录(类似于描述的here)向包含前端网站的第二个Spring启动应用程序提供Oauth2身份验证。
我最初的想法是通过简单地为Android应用程序提供访问令牌来模仿@ EnableOauth2Sso注释,并将其作为“Bearer”附加到每个请求。使用用户凭据非常简单:我只是在“/ oauth / token”向服务器发出请求,使用用户插入的凭据作为身份验证,并且我正确地接收了访问令牌。
现在,我完全不知道如何在Android中使用Google API构建类似的程序。我之前链接的教程页面描述了如何获取令牌ID以及服务器应如何验证它,但之后我不知道该怎么做。
到目前为止,我已经设法在安全链中添加一个过滤器,只需像这样检查令牌:
private Authentication attemptOpenIDAuthentication(@NonNull String tokenString){
String clientId = authServices.getClientId();
GoogleIdTokenVerifier verifier = new GoogleIdTokenVerifier.Builder(transport, factory)
.setAudience(Arrays.asList(clientId, androidClient))
.build();
try {
GoogleIdToken token = verifier.verify(tokenString);
if (token != null) {
return authServices.loadAuthentication(token.getPayload());
} else {
throw new InvalidTokenException("ID token is null");
}
} catch (GeneralSecurityException | IOException e) {
throw new BadCredentialsException("Could not validate ID token");
}
}
这确实管理了创建Authentication对象,但是如何在身份验证过滤后生成访问令牌?
回顾一下,到目前为止我有:
我基本上错过了向Android客户端返回正确访问令牌的第三点。在这里,您是一个简单的方案,以更好地了解情况:
有没有其他方法可以验证令牌并从服务器获取访问令牌,还是应该完全更改Android上的身份验证过程?
据我所知:是的,您需要来自服务器的访问令牌。如果我理解正确,则已经通过后端的Oauth对webapp进行了身份验证,因此此过程类似于:使用google-ID加载用户并生成令牌。在我的应用程序中,我使用了一个有效期为30天的JWT。如果令牌过期,则应用中的Google身份验证通常仍然有效,因此可以使用Google ID续订令牌。使用Oauth,您还可以直接发送刷新令牌。重要的是,应用程序始终首先检查Google身份验证,并且仅在后端的第二步中检查。
对于后端的身份验证过程,您可能需要为此手动实现专用的securityConfiguration。看看jhipster项目,他们实现了一个自定义的jwt-authentication,可以让你知道它是如何工作的。