【问题标题】:Best practice for combining android client, spring-boot backend and Oauth2 social login结合 android 客户端、spring-boot 后端和 Oauth2 社交登录的最佳实践
【发布时间】:2024-05-29 19:50:02
【问题描述】:

我正在尝试创建一个项目,该项目将 Android 客户端与后端的 spring-boot 微服务架构相结合。客户端应用程序将通过一系列 Rest API 与后端通信,但这样做时需要登录/身份验证。对于身份验证/授权,这将通过第 3 方/社交登录完成 - 即使用 Oauth2 的 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 rest 控制器在后端完成,并使用从 android 客户端发送的 volley https 请求。

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

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

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

【问题讨论】:

    标签: android spring-boot oauth-2.0 social-authentication


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

      最近更新 更多