我正在尝试创建一个项目,将 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 + 后端服务进行社交登录的要点?有没有更简单/更好的实施方法?这感觉像是应该经常遇到的事情,但是大多数文档在描述它应该如何工作时都相当混乱。