authentication - 授权端点如何知道用户已登录?
问题描述
我正在使用 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 |____________|
此时,浏览器只需要使用代码向访问令牌端点发出第二次请求,它就会收到访问令牌。
但是在这一切发生之前,我对授权服务器如何真正知道用户已登录感到有些困惑
- 授权服务器不应该验证用户以某种方式登录吗?
- 如果在上一步中,假设用户登录并从另一台服务器获取 cookie,那么如何从授权服务器的角度验证?服务器如何知道请求代码的用户是 John 而不是 Bob 或匿名用户?
解决方案
我将尝试使用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 发生的。
推荐阅读
- javascript - 如何在网站部分添加没有滚动条的页眉和页脚?
- r - tidyselect 更改了在 R 中选择函数时如何引用变量名的外部向量
- python - 在获取或创建 Django 中增加模型字段
- python - 我们可以在 tkinter 中嵌套两个 OptionMenu 小部件吗?
- python - 实现这种二维数值积分的计算速度更快的方法是什么?
- kubernetes - 一个 Kubernetes 应用程序有多少个线程?
- php - PHP在mysql表中创建用户
- laravel - 当我想在 laravel 5.8 中使用模型绑定时出现此错误
- c++ - 构建失败 arm-none-eabi-gcc
- python - 如何将 numpy 数组插入到数组的 numpy 数组中?