什么是正确的授权码 OAuth2 流程?

Posted

技术标签:

【中文标题】什么是正确的授权码 OAuth2 流程?【英文标题】:What is the proper Authorization Code OAuth2 flow? 【发布时间】:2020-11-23 17:39:12 【问题描述】:

我目前对 OAuth2.0 授权代码流程不熟悉,我已经阅读了很多关于它的文章,目前我仍然不知道如何正确实施它。到目前为止,我对流程的了解:

    用户使用 OAuth 登录 用户被重定向到授权服务器获取授权码 权限/范围回调 重定向到授权服务器以获取访问令牌以换取授权码 使用访问令牌重定向回客户端 客户端使用访问令牌访问资源服务器。

现在,我仍然困惑的是登录验证应该从哪里来(用户名的登录 - 密码)?是否在进入 OAuth 流程之前进行单独的验证,一旦用户有效,就应该返回流程?

【问题讨论】:

【参考方案1】:

我有一些资源可以解释OAuth 2.0 using Google Sign in as an example。让我试着根据你的问题改写一下。

我们以用户使用“使用 Google 登录”登录对讲机为例。

    用户按下“使用 Google 登录”按钮。这将重定向到身份提供者/authorize 端点(每个提供者可能不同),这些端点会转到他们的登录页面。 用户被重定向到 Google 的帐户页面。如果尚未登录,用户可以在此处输入他们的 Google 电子邮件/密码。 Google 使用 authorization_code 重定向回对讲机(例如,它重定向到 https://intercom.com/authcallback?code=XYZ...) Intercom 的后端服务器发送 authorization_codeclient_idclient_secret(来自他们在 google 的项目),并接收 access_token(通常发送到 /token 端点) Intercom 然后可以使用access_token 从 Google 访问用户的个人资料。

为了回答您的问题,用户可以在 OAuth 提供商的页面中输入他们的电子邮件/密码。请记住,OAuth 2.0 并未指定提供商如何对用户进行身份验证。这意味着,OAuth 提供者可以通过不同的方式验证他们的用户,例如电子邮件/密码、email magic-link, SMS OTP 等。您的网站应该相信 OAuth 提供者他们正在为您正确地验证用户。


一些额外的资源可以帮助您更多地了解 OAuth 2.0:

How to store the OAuth 2.0 access and refresh token in your front end Picking the right OAuth 2.0 flow

【讨论】:

感谢您的回复,这意味着登录验证与流程是分开的,对吧?从提供者成功登录后,将调用授权端点? 是的,登录验证与流程分开。您将调用 /authorize 端点以转到 Google 的登录页面。所以在登录成功之前会调用授权端点。 1. 调用/authorize 进入谷歌登录页面 2. 用户在谷歌登录页面登录成功 3. 谷歌重定向回你的应用到example.com/authcallback?code=123...等等【参考方案2】:

登录验证来了(登录用户名 - 密码)?

OAuth 2.0 NOT an Authentication protocol

The OAuth 2.0 specification defines a delegation protocol

用户名 - 密码的任何使用都在 OAuth 2.0 之外,您应该查看 Open ID Connect,它是建立在 OAuth 2.0 之上的身份验证协议。

Best current Practice for Authorization Code flow 是在 OAuth 或 OpenID Connect 上使用 PKCE。

【讨论】:

感谢您的回复。您能否解释一下用户何时被重定向到单独的登录页面?那是什么流程?它也是 OAuth 的一部分吗?这就是我现在困惑的部分【参考方案3】:

通常的解决方案是使用成熟的安全库将 OAuth 2.0 和 Open Id Connect 从您的代码中外部化。当您不熟悉这种类型的安全性时,会有一个学习曲线。我的资源会让您了解它们是如何组合在一起的:

Code Sample Tutorial Blog Post

您集成的库取决于您使用的技术堆栈。以上资源适用于单页应用和 NodeJS API。

【讨论】:

以上是关于什么是正确的授权码 OAuth2 流程?的主要内容,如果未能解决你的问题,请参考以下文章

OAuth2.0系列之授权码模式实践教程

oauth2.0授权码模式详解

#yyds干货盘点# OAuth2.0授权码模式实战

oauth2.0的授权流程详解

Spring Security---Oauth2详解

从0开始设计Oauth2.0 - 授权码模式