OAuth2 流程中用户身份验证的混乱:在哪里验证用户凭据?

问题描述 投票:0回答:1

我正在开发一个 Web 应用程序,需要使用 OAuth2 实现身份验证系统。但是,我对这个新的 OAuth2 身份验证服务应该如何工作有点困惑。

Obs:我正在 Node.js 中开发此服务。

我当前的身份验证服务接收用户名和密码,如果它们有效(并且位于我的用户表中),则会生成访问令牌并将其返回给我的客户端。


我正在创建的新服务有一个授权路径 (/authorize),为我的客户端生成 code_auth。 请求/授权:

方法:GET 网址:http://localhost:3013/authorize?scope=read&redirect_uri=http://localhost:3014


之后,我就有了获取令牌(/token)的路由,它接收auth_code并返回access_token。 请求/token:

方法:POST 网址:http://localhost:3007/token 请求正文:

{ 
   "authorization_code": "CODE_AUTH", 
   "client_id": "CLIENT_ID", 
   "client_secret": "CLIENT_SECRET" 
}

但是由于我是 OAuth2.0 的新手,我无法理解我之前的服务所执行的用户名和密码验证在此流程中的位置。在 OAuth2 中,我在哪里检查我的用户是否是有效用户?是在 /token 路由中将用户名和密码与 auth_code 一起传递,还是这样做不正确?

authentication oauth-2.0 oauth jwt authorization
1个回答
0
投票

您的新服务(授权服务器)应在对

/authorize
端点的第一个请求中执行用户身份验证。这并不意味着您必须将用户名和密码与该请求一起发送。通常,它的工作原理如下:

  1. 您向
    /authorize
    端点发送请求。浏览器将随此请求一起发送任何会话 cookie。
  2. 您的服务器检查会话cookie。我们假设 cookie 还不存在。然后服务器响应一个 HTML 页面,其中显示登录表单。
  3. 您输入用户名和密码并提交表格。它可以提交到任何 URL,例如
    /authenticate
  4. 服务器验证用户名和密码。如果正确,它会生成一个授权代码,保存它并发回一个重定向响应,该响应还设置一个会话 cookie。所以你会得到这样的东西:
HTTP 303
Set-Cookie: session_id=1234abcd
Location: http://localhost:3014?code=aaabbb

浏览器将保存 cookie 并使用授权代码将用户重定向到您的回调。您现在可以用代码交换访问令牌。

在后续登录尝试中,您的浏览器将发送会话 cookie,因此在第 2 点中您将获得第 4 点的响应,无需再次重新进行身份验证(即,只要会话在服务器端有效)。

这种方法还为您提供了改进身份验证的良好空间。在第 2 点和第 4 点的响应之间,您可以轻松添加更多身份验证行为。例如。您可以要求用户提供两步验证码,也可以从提供不同的验证方法开始,例如:使用 Google 登录、使用 Facebook 登录、使用用户名和密码登录、使用密码登录等。

© www.soinside.com 2019 - 2024. All rights reserved.