首页 > 解决方案 > 结合 android 客户端、spring-boot 后端和 Oauth2 社交登录的最佳实践

问题描述

我正在尝试创建一个项目,将 Android 客户端与后端的 spring-boot 微服务架构相结合。客户端应用程序将通过一系列 Rest API 与后端通信,但这样做时需要登录/身份验证。对于身份验证/授权,这将通过使用 Oauth2 的 3rd 方/社交登录 - 即 google/facebook 等来完成。

似乎有很多文档解释了 Oauth2 协议的工作原理,包括资源所有者通过授权服务器授予访问权限、代码和令牌交换、重定向到客户端以及使用提供的令牌从资源服务器访问资源。我遵循了以下指南:

https://developers.google.com/identity/protocols/oauth2/native-app

我已经使用它来指导配置带有登录按钮的基本应用程序,该按钮可用于检索令牌。我现在的问题是我需要做的是扩展 3rd 方登录以涵盖应用程序和 spring-boot 后端之间其余 API 通信的身份验证。

有许多指南和教程(例如https://spring.io/guides/tutorials/spring-boot-oauth2/)解释了如何使用社交登录配置 spring-boot Web 应用程序,但这些似乎都不相关鉴于客户端是一个正在执行社交登录的移动应用程序,因此我不能 100% 确定如何进行。

据我所知,这两种身份验证必须分开处理。

我目前的想法是,一旦客户端通过身份验证并接收到 Oauth2 令牌,该令牌将需要作为发布请求正文中的表单参数直接发送到后端“登录”微服务。然后,“登录”微服务将对它收到的令牌执行自己的验证,如下所示:

https://developers.google.com/identity/sign-in/web/backend-auth

如果令牌由后端服务器验证,它将有权访问请求的资源。我的意图是使用 google 资源 ident 字段作为数据库主键。然后可以将其与我的服务器端数据库中保存的记录进行比较,以检查它是否对应于有效用户。如果接收到的令牌是有效的并且提取的身份与现有数据库记录的身份匹配,则登录请求是有效的。这类似于检查用户名和密码哈希。

正如指南建议的那样,为了避免每次调用 API 时都需要重新验证令牌,后端服务器应该创建一个会话或生成自己的令牌以按照传统的 Web 服务器授权发送回客户端。在这种情况下,它将通过 spring-boot 休息控制器在后端完成,并使用从 android 客户端发送的 volley https 请求。

如果登录无效,则不返回令牌/cookie 会话 ID,并且 API 响应将指示“无效令牌”或“未找到现有用户”。

下图是对上述内容的总结:

认证流程

这种方法对于 Oauth2 是否明智,还是我在这里错过了使用 android + 后端服务进行社交登录的要点?有没有更简单/更好的实施方法?这感觉像是应该经常遇到的事情,但是大多数文档在描述它应该如何工作时都相当混乱。

标签: androidspring-bootoauth-2.0social-authentication

解决方案


在使用外部访问令牌(例如 Facebook 等发行的令牌)时,您遇到了一个常见问题:

  • 您需要多种身份验证方法
  • 您希望控制微服务接收的令牌

但来自 Facebook 的令牌并非设计用于您自己的 API。

OAuth 旨在使每个软件提供商都使用自己的授权。服务器 (AS) - 管理与 Google / Facebook(以及可能的许多其他提供商)的连接 - 然后在每种情况下为 API 颁发相同的令牌。这将意味着您的应用程序和 API 需要处理的事情要少得多。

避免将社交登录包直接集成到您的 Android 应用程序中,而只需使用标准 OpenID Connect - 通过AppAuth 库

我的博客文章解释了这种模式及其好处。您可以使用许多免费或低成本的 AS 实现,这将使您的架构更简单,并以最简单的代码提供最佳的未来设计选项。


推荐阅读