问题描述
我的客户端(前端)是一个本地移动应用程序(使用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库,这给了我最好的未来选择。不过,这并不容易-这项技术肯定比应做的要难得多。