通过带有Spring Boot后端的Google Sign-In登录Android

问题描述 投票:2回答:1

正如标题所说,我正在尝试使用带有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对象,但是如何在身份验证过滤后生成访问令牌?

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

  1. Android应用成功检索Google令牌ID并将其发送到服务器
  2. 服务器成功拦截请求并验证令牌

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

有没有其他方法可以验证令牌并从服务器获取访问令牌,还是应该完全更改Android上的身份验证过程?

android spring spring-boot google-signin spring-security-oauth2
1个回答
0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.