首页 > 解决方案 > 授权端点如何知道用户已登录?

问题描述

我正在使用 OAuth2 和 OpenID Connect 为分布式 Web 应用程序实现单点登录。授权服务器自行运行。我已经实现了访问令牌端点,目前正在尝试实现授权端点(用于授权代码流)。

这是我对应该发生的事情的理解


              GET http://authserver/authorize?client_id=1&
                                              state=BB&
 _________                                    scope=read_user&                ____________
|         |                                   redirect_uri=myapp/callback    |            |
|         |----------------------------------------------------------------> |            |
| Browser |                                                                  | AuthServer |
|         |<-----------------------------------------------------------------|            |
|_________|   302 myapp/callback?code=AAA&state=BB                           |____________|


此时,浏览器只需要使用代码向访问令牌端点发出第二次请求,它就会收到访问令牌。

但是在这一切发生之前,我对授权服务器如何真正知道用户已登录感到有些困惑

  1. 授权服务器不应该验证用户以某种方式登录吗?
  2. 如果在上一步中,假设用户登录并从另一台服务器获取 cookie,那么如何从授权服务器的角度验证?服务器如何知道请求代码的用户是 John 而不是 Bob 或匿名用户?

标签: authenticationoauth-2.0authorizationsingle-sign-onopenid-connect

解决方案


我将尝试使用RFC6749 The OAuth 2.0 Authorization Framework回答您的问题。请注意,这对 OpenID Connect 有效,因为它是 OAuth 2.0 的扩展

1 授权服务器不应该验证用户以某种方式登录吗?

3.1。授权端点状态如下,

授权端点用于与资源所有者交互并获得授权。授权服务器必须首先验证资源所有者的身份。授权服务器对资源所有者进行身份验证的方式(例如,用户名和密码登录、会话 cookie)超出了本规范的范围。

在重定向授权服务器对请求执行最终用户授权之前。这是以用户登录或上述所需机制的形式完成的。这是实际最终用户验证发生的地方。从您的问题的角度来看,这是登录。

2 如果在上一步中,假设用户登录并从另一台服务器获取 cookie,那么从授权服务器的角度如何验证?

我希望您了解有关 cookie 的基础知识。它们帮助基于浏览器的 Web 应用程序维护前端和后端之间的状态。

根据授权服务器配置,可以要求最终用户将登录状态标记为已记住。然后你的浏览器得到的是一个安全的cookie,它被存储在浏览器中。这是一个字符串,对最终用户没有任何意义,但在后端存在与登录用户(例如:- A1 - Bob,A2 - Alex)的相关性(考虑索引键)。

因此,下次用户打开浏览器并使用您的应用程序时,授权服务器会获取带有授权请求的 cookie。如果 cookie 没有过期/失效,授权服务器可以跳过登录对话框。正如第一部分所强调的,最终用户授权是通过 cookie 发生的。


推荐阅读