可以使用 OAuth2 授权码作为成功登录的证明吗?

Posted

技术标签:

【中文标题】可以使用 OAuth2 授权码作为成功登录的证明吗?【英文标题】:Is it okay to use an OAuth2 authorization code as proof of a successful login? 【发布时间】:2021-02-06 22:34:28 【问题描述】:

我有一个包含电子邮件和密码的数据库,以及一个 Flutter 应用程序,该应用程序允许这些用户通过提供他们的电子邮件和密码(老式方式)来登录应用程序。

现在,其中一些用户是组织的一部分,该组织拥有一个单独的网站,他们使用 Microsoft/Office 365 帐户登录。当然,他们也希望能够使用他们的 Office 365 帐户登录我的应用程序,而不必在应用程序中记住和输入与他们通常在其组织网站上使用的密码不同的密码。

所以我一直在查看他们的网站,该网站使用 Microsoft Azure 作为后端。从他们当前的登录页面我可以找到tenantIDclientIDredirectURLscope。由此我可以从login.microsoftonline.com 授权端点获取授权码。但是,由于我的应用未在组织 Azure 帐户中注册,因此我没有 clientSecret,因此我无法调用令牌端点并获得 idToken

我正在使用 WebView 来显示他们组织网站的登录信息,因此当他们被重定向时,我可以从重定向 URL 中获取授权代码。

所以我的问题是我是否可以直接使用授权码来验证用户是否已使用其 Office 365 帐户成功登录?我只需要知道该用户在该组织有一个帐户,并且他们可以提供有效的电子邮件和密码来登录。

如果他们被重定向到带有授权代码的重定向 URL,则表示他们已成功登录。然后我可以根据提供给 Office 365 授权端点的电子邮件认为他们也登录了我的应用程序。因为如果他们无法登录 Office 365,他们就不会获得授权码,对吧?

【问题讨论】:

【参考方案1】:

不,授权代码仅对身份提供者有意义,在本例中为 Azure AD。它对您的应用程序没有任何证明。 您可以在授权 URL 中尝试response_type=code+id_token。 如果 ID 令牌已配置为可从授权端点返回(这在应用注册配置中完成),您将获得一个可以验证的签名 id 令牌。

【讨论】:

是的,我意识到这是正确的做法,如果相关组织设置他们的 Azure 配置以便我的应用程序具有这种访问权限,我会这样做。但我仍然很好奇我所提议的是否可能。你说授权码除了对身份服务器没有任何意义。授权码到底是什么?能否以某种方式解码,还是真的只是一个随机字符串? 至少我从未见过任何与解码相关的东西。我猜它是由 Azure AD 加密的。

以上是关于可以使用 OAuth2 授权码作为成功登录的证明吗?的主要内容,如果未能解决你的问题,请参考以下文章

OAuth2.0 初识

OAuth2.0 - 介绍与使用 及 授权码模式讲解

如何获取谷歌登录swift 4的OAuth2授权码

OAuth2.0 授权码模式

OAuth2.0 - 自定义模式授权 - 短信验证码登录

通过微信扫码登录剖析 oauth2 认证授权技术