使用 Spring Boot 后端通过 Google Sign-In 进行 Android 登录

标签 android spring spring-boot google-signin spring-security-oauth2

如标题所述,我正在尝试将 Google 登录 API 与 Spring Boot 后端服务器一起使用,如 here 所述。

只是为了描述上下文,Spring 后端基本上是一个资源+身份验证服务器,目前通过 Google SSO 或简单的表单登录(类似于 here 所描述的)向包含前端网站的第二个 Spring Boot 应用程序提供 Oauth2 身份验证).

我最初的想法是模仿 @EnableOauth2Sso 注释,方法是简单地向 Android 应用程序提供访问 token 并将其作为“Bearer”附加到每个请求。 为此使用用户凭据非常简单:我只需向位于“/oauth/token”的服务器发出请求,使用用户插入的凭据作为身份验证,我就正确地收到了访问 token 。

现在,我完全不知道如何在 Android 中使用 Google API 构建类似的过程。我之前链接的教程页面描述了如何获取 token ID 以及服务器应如何验证它,但是在那之后我不知道该怎么做。

到目前为止,我已经成功地向安全链添加了一个过滤器,它只是像这样检查 token :

    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");
        }
    }

这确实创建了一个身份验证对象,但是如何在身份验证过滤后生成访问 token ?

回顾一下,到目前为止我有:

  1. Android 应用成功检索到 Google token ID 并将其发送到服务器

  2. 服务器成功拦截请求并验证 token

我基本上遗漏了第三点,即我向 Android 客户端返回正确的访问 token 。 这是一个简单的方案,可以更好地了解情况: Crappy scheme of the problem. Web frontend is working great, android is missing Google login.

是否有任何其他方式来验证 token 从服务器获取访问 token ,或者我是否应该完全更改 Android 上的身份验证过程?

最佳答案

据我所知:是的,您需要来自服务器的访问 token 。如果我理解正确的话,一个 webapp 已经通过后端的 Oauth 进行了身份验证,所以这里的过程是相似的:用 google-ID 加载用户并生成一个 token 。在我的应用程序中,我使用了有效期为 30 天的 JWT。如果 token 过期,应用中的谷歌身份验证通常仍然有效,因此可以使用谷歌 ID 续订 token 。使用 Oauth,您还可以直接发送刷新 token 。 重要的是,应用始终首先检查 Google 身份验证,并且仅在后端的第二个步骤中检查。

对于后端的身份验证过程,您可能需要为此手动实现专用的安全配置。看看 jhipster 项目,他们实现了一个自定义的 jwt-authentication,这可能会让您了解它是如何工作的。

关于使用 Spring Boot 后端通过 Google Sign-In 进行 Android 登录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51969297/

相关文章:

android - 如何在android EditText中添加千位分隔符.........?

android - 我如何知道加载的 URL 在 Android 中具有方法类型 POST?

android - 如何找到连接到手机 BT-PAN 的设备发布的 IP 地址

Spring注解基本问题

java - Spring4中从Service访问Repository时出现NullPointerException

java - Spring 验证 + Swagger 文档 : Based on conditions or values of other fields

java - spring boot CrudRepo 定义一个bean

mysql - 无法连接到 MySQL 的 Spring Boot 应用程序故障排除

java - 无法从本地文件系统播放音乐,但可以从SD卡播放

spring - 无法在 Spring Boot 应用程序中加载驱动程序类 : org. h2.Driver