通过带有 Spring Boot 后端的 Google Sign-In 登录 Android
Posted
技术标签:
【中文标题】通过带有 Spring Boot 后端的 Google Sign-In 登录 Android【英文标题】:Android login via Google Sign-In with a Spring Boot backend 【发布时间】:2019-01-28 20:37:03 【问题描述】:正如标题所说,我正在尝试将 Google Sign-In API 与 Spring Boot 后端服务器一起使用,如 here 所述。
只是为了描述上下文,Spring后端基本上是一个资源+身份验证服务器,目前正在通过Google SSO或简单的表单登录(类似于@ 987654322@).
我最初的想法是模仿 @EnableOauth2Sso 注释,只需向 android 应用程序提供访问令牌,并将其作为“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");
这确实可以创建一个身份验证对象,但是如何在身份验证过滤后生成访问令牌?
回顾一下,到目前为止我有:
Android 应用成功检索到 Google 令牌 ID 并将其发送到服务器
服务器成功拦截请求并验证令牌
我基本上错过了将正确的访问令牌返回给 Android 客户端的第三点。 这是一个简单的方案,可以更好地了解情况:
还有其他方法可以验证令牌并从服务器获取访问令牌,还是我应该完全更改 Android 上的身份验证程序?
【问题讨论】:
嗨。你能不能告诉我?你完成了这个任务吗? 您好,很抱歉回复晚了。是的,我做到了,不幸的是,这是一个古老的大学项目,我手头没有源代码了。但是我可以简要解释一下我最终是如何解决这个问题的:在 android App 上使用 Google SDK,这会返回一个令牌,您可以将其发送给自定义令牌授予者到 Spring 后端(请参阅here for example。基本上您发送 SDK 令牌到自定义 oauth2 端点并通过标准 Google API 对其进行验证,以便返回令牌或拒绝它。 【参考方案1】:据我所知:是的,您需要来自服务器的访问令牌。如果我理解正确,webapp 已经通过后端的 Oauth 进行了身份验证,所以这里的过程类似:使用 google-ID 加载用户并生成令牌。在我的应用程序中,我使用了有效期为 30 天的 JWT。如果令牌过期了,应用中的谷歌身份验证通常仍然有效,因此可以使用谷歌 ID 来更新令牌。使用 Oauth,您还可以直接发送刷新令牌。 重要的是,应用始终首先检查 Google 身份验证,并且仅在后端检查第二步。
对于后端的身份验证过程,您可能需要为此手动实现专用的安全配置。看看 jhipster 项目,他们实现了一个自定义 jwt-authentication,它可以让您了解它是如何工作的。
【讨论】:
以上是关于通过带有 Spring Boot 后端的 Google Sign-In 登录 Android的主要内容,如果未能解决你的问题,请参考以下文章
获取 JWT 后,带有 Spring Boot 后端的 Angular 在现有路由上返回 404
带有 AsyncRestTemplate Netty 客户端的 Spring Boot 失败
部署 Spring Boot + Angular 应用程序时出现问题
带有 Spring Data 的 Spring Boot Maven 多模块项目