使用 Google id 令牌时如何构建 OAuth 流程?
How to build your OAuth flow when using Google id token?
我的客户端(前端)是一个原生移动应用程序(使用 Flutter 构建)。对于后端,我使用 Spring 通过 Rest API 端点公开资源。我想为我的应用程序实施 Google 登录。另外,我想为自己的端点使用 OAuth 流程。
我发现针对这种情况推荐的整体流程 Authenticate with a backend server。
所以据我了解过程是这样的:
我在我的本机应用程序中使用 google sing,当用户登录时它会收到令牌,然后应用程序将它发送到我的授权服务器 (AS)。然后 AS 直接向应用程序(即客户端)发送访问(+刷新)令牌。我们可以说它是一种密码授予类型,但 AS 不是使用用户和密码来识别用户,而是使用我们从 google 收到的令牌。当应用程序调用我的资源服务器 (RS) 时,它使用我的 AS 颁发的访问令牌。我对吗? PS 我画了一些图表来展示这个流程:
总而言之,问题是当您收到 google 令牌 ID 时如何构建您的 Oauth 流程?在这种情况下建议使用 密码授予类型 吗?考虑到我的客户已经收到 ID 令牌,使用 授权代码 流程是否有意义?
如果您的授权服务器 (AS) 支持,首选选项是执行此操作,这需要对您的应用进行零代码更改:
您的应用仅连接到您自己的 AS,并且仅使用来自您 AS 的令牌 - 您的应用使用授权代码流 (PKCE) 是标准做法
AS 重定向到 Google 并处理响应,将 Google 令牌交换为 AS 令牌,然后返回给应用程序
但是,如果您使用密码授予,这将不起作用,因为此流程不支持联合。如果有帮助,我的 visual blog post 有更多关于此设计模式的信息。
目标和权衡取舍
- 无论是否使用联合,用户体验 都应该相同
- 未来的可扩展性 值得考虑 - 如果您想在未来集成 3 个其他登录选项,我描述的模式通常会为您提供最佳选择
- UI 和 API 的技术简单性 也值得考虑 - 您要添加多少代码复杂性?
不幸的是,技术往往不完善。我希望至少我的评论能帮助您理解 OIDC 标准背后的目标。
您的代码和您使用的库
我会在这方面小心一点。 link you referred to 非常 Google 具体并专注于调用 Google API 以获取 Google 数据。如果这是你的目标,那很好,但如果你也想做非 Google 的事情,它可能会限制你。
我博客上的代码示例侧重于基于 OIDC 标准,从使用 standard messages 开始。这通过 AppAuth 库为我提供了未来最好的选择。虽然这并不容易 - 技术肯定比它应该的要难得多。
我的客户端(前端)是一个原生移动应用程序(使用 Flutter 构建)。对于后端,我使用 Spring 通过 Rest API 端点公开资源。我想为我的应用程序实施 Google 登录。另外,我想为自己的端点使用 OAuth 流程。
我发现针对这种情况推荐的整体流程 Authenticate with a backend server。 所以据我了解过程是这样的:
我在我的本机应用程序中使用 google sing,当用户登录时它会收到令牌,然后应用程序将它发送到我的授权服务器 (AS)。然后 AS 直接向应用程序(即客户端)发送访问(+刷新)令牌。我们可以说它是一种密码授予类型,但 AS 不是使用用户和密码来识别用户,而是使用我们从 google 收到的令牌。当应用程序调用我的资源服务器 (RS) 时,它使用我的 AS 颁发的访问令牌。我对吗? PS 我画了一些图表来展示这个流程:
总而言之,问题是当您收到 google 令牌 ID 时如何构建您的 Oauth 流程?在这种情况下建议使用 密码授予类型 吗?考虑到我的客户已经收到 ID 令牌,使用 授权代码 流程是否有意义?
如果您的授权服务器 (AS) 支持,首选选项是执行此操作,这需要对您的应用进行零代码更改:
您的应用仅连接到您自己的 AS,并且仅使用来自您 AS 的令牌 - 您的应用使用授权代码流 (PKCE) 是标准做法
AS 重定向到 Google 并处理响应,将 Google 令牌交换为 AS 令牌,然后返回给应用程序
但是,如果您使用密码授予,这将不起作用,因为此流程不支持联合。如果有帮助,我的 visual blog post 有更多关于此设计模式的信息。
目标和权衡取舍
- 无论是否使用联合,用户体验 都应该相同
- 未来的可扩展性 值得考虑 - 如果您想在未来集成 3 个其他登录选项,我描述的模式通常会为您提供最佳选择
- UI 和 API 的技术简单性 也值得考虑 - 您要添加多少代码复杂性?
不幸的是,技术往往不完善。我希望至少我的评论能帮助您理解 OIDC 标准背后的目标。
您的代码和您使用的库
我会在这方面小心一点。 link you referred to 非常 Google 具体并专注于调用 Google API 以获取 Google 数据。如果这是你的目标,那很好,但如果你也想做非 Google 的事情,它可能会限制你。
我博客上的代码示例侧重于基于 OIDC 标准,从使用 standard messages 开始。这通过 AppAuth 库为我提供了未来最好的选择。虽然这并不容易 - 技术肯定比它应该的要难得多。