OpenId / OAuth 2 流 - 使用 AWS Cognito 的场景

Posted

技术标签:

【中文标题】OpenId / OAuth 2 流 - 使用 AWS Cognito 的场景【英文标题】:OpenId / OAuth 2 Flows - Scenarios with AWS Cognito 【发布时间】:2021-11-16 23:00:44 【问题描述】:

我想请朋友帮忙。

本质上是关于 openId/oauth 流,我对流类型有点困惑。

目前我正在进行一个现代化项目,我需要为旧组件和新组件建立新的身份验证/授权流程。

我的疑问是关于我应该做什么以及我应该从授权服务器使用哪个实现,即:

流程 1 和流程 3

用户将向 Web MVC 应用程序提供登录凭据,它应该在 cognito 中进行身份验证,返回一个令牌。 (1a / 1b) (3a / 3b) 在后续与 BFF 1 / 2 和其他微服务的交互中,我会传递相同的令牌,对吧?在后端验证此令牌的正确方法是什么? (4)

流程2

一些外部用户能够使用 API 使用基本凭据(登录名/密码)访问系统。 在现代化场景中,应该向他们表明什么?客户 ID/客户密码?还是可以使用登录名/密码获取token?

非常感谢您的帮助

【问题讨论】:

【参考方案1】:

这些流程都不是 OAuth2,严格来说,您的图表与 OpenID 无关。

在随后与 BFF 1 / 2 和其他微服务的交互中,我 会传递相同的令牌,对吧?

是的,您可以使用访问令牌或 id 令牌来授权未来的请求。

在后端验证此令牌的正确方法是什么?

cognito 生成的令牌都是非对称签名的 JWT。您可以使用任何 JOSE/JWT 库来验证签名。 https://jwt.io/ 在页面底部有一个很好的列表。 Cognito 目前不支持令牌自省,因此您的资源无法将令牌传递给 cognito 进行验证,如图所示。

一些外部用户能够使用基本 API 访问系统 凭据(登录名/密码)。在现代化场景中,什么 应该向他们说明吗?客户 ID/客户密码?或者可以吗 使用登录名/密码获取令牌?

这应该是客户端凭据授予。但是,Cognito 的实现相当草率,并且不支持旋转密钥。此外,如果您依赖 ID 令牌,则此授权类型不支持这些令牌。密码授予在技术上由 cognito 支持,但允许任何用户通过客户端使用用户名和密码进行身份验证。最好的选择可能是创建自定义身份验证质询并通过它处理您的身份验证。

【讨论】:

以上是关于OpenId / OAuth 2 流 - 使用 AWS Cognito 的场景的主要内容,如果未能解决你的问题,请参考以下文章

需要帮助使用 React-native、Spring Rest Api 和 ADFS 4.0 实施 OpenID 连接/OAuth2 流

OpenID Connect Core 1.0使用授权码流验证(下)

使用 Oauth2/OpenID 连接构建 Web-API

在集成测试中使用 oauth/openid 进行身份验证

.NET开源OpenID和OAuth解决方案Thinktecture IdentityServer

OpenId 连接和 OAuth 2.0 密码授予 - 有啥区别?