Oauth 2.0 使用GoogleID令牌时如何构建OAuth流?
我的客户端(前端)是一个本地移动应用程序(使用Flutter构建)。对于后端,我使用Spring通过RESTAPI端点公开资源。我想为我的应用程序实现Google登录。另外,我想使用OAuth流作为我自己的端点 我发现对于这种情况,建议使用总体流。 因此,据我所知,这个过程是这样的: 我在我的原生应用程序中使用google sing,当用户登录时它会接收令牌,然后应用程序会将其发送到我的授权服务器(AS)。然后就像直接向应用程序(即客户端)发送访问(+刷新)令牌一样。我们可以说这是一种密码授予类型,但不是使用用户和密码来识别用户,而是使用我们从谷歌收到的令牌。当应用程序调用我的资源服务器(RS)时,它使用我的AS颁发的访问令牌。我说得对吗?PS我画了一些图表来显示这个流程: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)。然后就像直接向应用程序(即客户端)发送访问(+刷新)令牌一样。我们可以说这是一种密码授予类
总之,问题是当您收到google令牌id时,如何构建Oauth流?对于这种情况,是否建议使用密码授权类型?考虑到我的客户端已经收到id令牌,使用授权代码流是否有意义?如果您的授权服务器(AS)支持此功能,首选选项是这样做,这应该不需要对您的应用程序进行任何代码更改:
- 您的应用程序仅连接到您自己的AS,并且仅使用来自您的AS的令牌-您的应用程序使用授权代码流(PKCE)是标准的
- AS重定向到Google并处理响应,将Google令牌交换为AS令牌,然后返回到应用程序
- 无论您是否使用federation,用户体验都应相同
- 未来的可扩展性值得考虑-如果您想在将来集成3个其他登录选项,我描述的模式通常会为您提供最佳选项
- 技术上的简单性对于您的UI和API也是值得考虑的-您增加了多少代码复杂性
我博客上的代码示例侧重于基于OIDC标准,这从使用开始。这给了我未来最好的选择,通过AppAuth库。但这并不容易——这项技术肯定比它应该的困难得多。在任何情况下都不建议使用密码授权类型,但我将google id令牌视为凭据(我创建用户并根据id令牌在数据库中识别他们)。谷歌把它们发送给我的客户。据我所知,授权代码流是为了不与客户端共享您的凭据,但在本例中,它们已经存在于我的客户端应用程序中,因为goole将其发送到我的移动应用程序。那么我该怎么办呢?1)我的移动应用程序除了谷歌搜索之外没有其他登录选项,这会影响什么吗?2) 用户现在的流程是什么样子的?他会做同样的事情:点击谷歌标志,输入谷歌凭证,你就完成了。因此,当您将google登录代码放在客户端中时,用户不会感觉到与此方法有任何不同。您能否为此提供一些代码解决方案?我理解您的方法,但所有这些重定向的实现让我感到困惑。PS我发现了这个解决方案:google向客户端发送授权代码(而不是发送id令牌)此代码被发送到服务器,服务器将此代码交换为访问令牌和id令牌。所以我觉得这种方法比仅仅接收id令牌更安全。那你觉得这个怎么样?我知道你的方法应该更好,但是实现有点让我困惑。好吧-我在上面的答案中添加了一些内容-恐怕没有快速的答案-但是最好的选择通常是充分利用标准