使用Google ID令牌时如何建立OAuth流?

问题描述

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

我发现针对这种情况Authenticate with a backend server建议使用总体流程。 据我了解,过程是这样的

我在本机应用程序中使用google sing,当用户登录时它会收到令牌,然后该应用程序将其发送到我的授权服务器(AS)。然后,AS只是直接向应用程序(即客户端)发送访问(+刷新)令牌。我们可以说这是一种密码授予类型,但是AS不会使用用户名和密码来标识用户,而是使用从Google那里收到的令牌。当应用程序调用我的资源服务器(RS)时,它将使用我的AS发出的访问令牌。我对吗? PS我画了一些图显示此流程:

[https://drive.google.com/file/d/1mvB6InwLAJeVe8DRqPFodyPRAz6lzUhK/view][2].

总而言之,问题是当您收到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库,这给了我最好的未来选择。不过,这并不容易-这项技术肯定比应做的要难得多。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...