Oauth 2.0 使用GoogleID令牌时如何构建OAuth流?

Oauth 2.0 使用GoogleID令牌时如何构建OAuth流?,oauth-2.0,google-oauth,openid-connect,spring-security-oauth2,google-identity,Oauth 2.0,Google Oauth,Openid Connect,Spring Security Oauth2,Google Identity,我的客户端(前端)是一个本地移动应用程序(使用Flutter构建)。对于后端,我使用Spring通过RESTAPI端点公开资源。我想为我的应用程序实现Google登录。另外,我想使用OAuth流作为我自己的端点 我发现对于这种情况,建议使用总体流。 因此,据我所知,这个过程是这样的: 我在我的原生应用程序中使用google sing,当用户登录时它会接收令牌,然后应用程序会将其发送到我的授权服务器(AS)。然后就像直接向应用程序(即客户端)发送访问(+刷新)令牌一样。我们可以说这是一种密码授予类

我的客户端(前端)是一个本地移动应用程序(使用Flutter构建)。对于后端,我使用Spring通过RESTAPI端点公开资源。我想为我的应用程序实现Google登录。另外,我想使用OAuth流作为我自己的端点

我发现对于这种情况,建议使用总体流。 因此,据我所知,这个过程是这样的:

我在我的原生应用程序中使用google sing,当用户登录时它会接收令牌,然后应用程序会将其发送到我的授权服务器(AS)。然后就像直接向应用程序(即客户端)发送访问(+刷新)令牌一样。我们可以说这是一种密码授予类型,但不是使用用户和密码来识别用户,而是使用我们从谷歌收到的令牌。当应用程序调用我的资源服务器(RS)时,它使用我的AS颁发的访问令牌。我说得对吗?PS我画了一些图表来显示这个流程:


总之,问题是当您收到google令牌id时,如何构建Oauth流?对于这种情况,是否建议使用密码授权类型?考虑到我的客户端已经收到id令牌,使用授权代码流是否有意义?

如果您的授权服务器(AS)支持此功能,首选选项是这样做,这应该不需要对您的应用程序进行任何代码更改:

  • 您的应用程序仅连接到您自己的AS,并且仅使用来自您的AS的令牌-您的应用程序使用授权代码流(PKCE)是标准的

  • AS重定向到Google并处理响应,将Google令牌交换为AS令牌,然后返回到应用程序

但是,如果您使用密码授权,这将不起作用,因为此流不支持联合。如果有帮助的话,我有更多关于这种设计模式的信息

目标和权衡

  • 无论您是否使用federation,用户体验都应相同
  • 未来的可扩展性值得考虑-如果您想在将来集成3个其他登录选项,我描述的模式通常会为您提供最佳选项
  • 技术上的简单性对于您的UI和API也是值得考虑的-您增加了多少代码复杂性
不幸的是,这项技术往往不完美。我希望我的评论至少能帮助您理解OIDC标准背后的目标

您的代码和使用的库

在这方面我会小心一点。这是一个非常特定于谷歌的应用程序,专注于调用谷歌API来获取谷歌数据。如果这是你的目标,那么这很好,但如果你还想做非谷歌的事情,这可能会限制你


我博客上的代码示例侧重于基于OIDC标准,这从使用开始。这给了我未来最好的选择,通过AppAuth库。但这并不容易——这项技术肯定比它应该的困难得多。

在任何情况下都不建议使用密码授权类型,但我将google id令牌视为凭据(我创建用户并根据id令牌在数据库中识别他们)。谷歌把它们发送给我的客户。据我所知,授权代码流是为了不与客户端共享您的凭据,但在本例中,它们已经存在于我的客户端应用程序中,因为goole将其发送到我的移动应用程序。那么我该怎么办呢?1)我的移动应用程序除了谷歌搜索之外没有其他登录选项,这会影响什么吗?2) 用户现在的流程是什么样子的?他会做同样的事情:点击谷歌标志,输入谷歌凭证,你就完成了。因此,当您将google登录代码放在客户端中时,用户不会感觉到与此方法有任何不同。您能否为此提供一些代码解决方案?我理解您的方法,但所有这些重定向的实现让我感到困惑。PS我发现了这个解决方案:google向客户端发送授权代码(而不是发送id令牌)此代码被发送到服务器,服务器将此代码交换为访问令牌和id令牌。所以我觉得这种方法比仅仅接收id令牌更安全。那你觉得这个怎么样?我知道你的方法应该更好,但是实现有点让我困惑。好吧-我在上面的答案中添加了一些内容-恐怕没有快速的答案-但是最好的选择通常是充分利用标准