请注意,我不是安全专家,这个解释是我对oauth的一般理解。提及这点是因为我看到你正在基于OAuth 2.0协议创建自己的认证服务器,这意味着将来一些人可能会使用您的服务器进行身份验证,因此我不希望你有错误的概念。
先澄清一下:不要混淆session和oauth,它们通常一起使用但是是两个独立的东西。
1. OAuth协议只是简单地通过访问令牌为应用程序/用户提供查询与该令牌相关数据的权限。
2. 另一方面,session则取决于应用程序本身。一旦某个应用程序接收到令牌,它们将从中创建一个会话。当用户登录或注销时,会话被销毁,而不是OAuth。
那么,OAuth令牌的命运是什么?
从服务器的角度来看,每个令牌都应在一定时间后过期。就是这样。服务器不知道其他任何东西。它给你令牌,然后在“n”秒后将其过期。
但是,应用程序可能会决定要撤销访问令牌。也许他们的网站被黑客攻击了,或者他们完成了所有api调用。然后他们可以向您的服务器发送一个特殊请求,告诉您强制使令牌过期。
那么,我应该怎么处理用户开启多个会话的情况?
作为OAuth服务提供商,你根本不需要考虑会话。你只需要知道如果应用程序向你请求令牌,你就给他们一个即可。
然而,我也会回答有关session的问题。 同一用户应该生成不同的session吗? 我认为是的。如果你使用同一个session,在一个机器上注销后,在第二个机器上刷新页面,由于session已过期,你的其他浏览器/设备也会自然注销。
那么GitHub如何管理以不显示额外条目呢?
我不在他们工作,所以我不知道。但我猜他们会检查每个session,如果两个或多个session与同一用户相关联,他们就知道该用户必须在使用多个设备。然后当你的某个设备向GitHub发送请求时,他们可以从IP地址推测出你的位置,如果许多机器都从同一地方发出请求,那么你肯定在使用多台机器。否则,可能有攻击者也在使用你的账号。
AFAIK,这就是银行预测恶意用户的方式之一 - 而不是唯一的方式,他们有时还会预测你访问银行记录的模式,如果该模式不同,很有可能你的账号被攻陷了。
现在你可能会问我:“你真的确定我应该根据应用程序的需求创建尽可能多的令牌吗?”
这就是我不太确定的部分。从我所看到的来看,OAuth有两个东西。搜索以下这两个术语的更多信息:
- Refresh Token: 这个token不是你的access token。这个token永远不会过期,一旦你的access token过期,你可以使用这个token来获取一个新的access token。这个token也需要保密。
- 离线访问类型: 许多OAuth提供者(如Google和Facebook)还支持此模式。该模式基本上允许你延长你的access token的有效期。例如,与正常的access token到期时间(例如1小时)相比,对于离线令牌,你可能拥有1年左右的到期时间。
“我应该重复使用OAuth 2.0访问令牌吗?”的答案
是的,该令牌应在给定的过期时间内被使用多次(谷歌将其设置为1小时)。
当其过期后,使用刷新令牌获取另一个访问令牌,并根据需要使用它。不断重复这个过程。
如果您的用户无法在线启动Oauth过程,并且您没有刷新令牌,则应用程序需要具有“离线”令牌。
我应该存储我的授权令牌吗?
如果您的应用程序需要,您可以存储它们,但由于可能会泄漏,这并不是推荐的做法。令牌应在给定的时间限制内提取数据,并在需要时重新发行令牌。但是,如果您想要,您肯定可以将它们存储。
另一方面,“离线”令牌预计应存储。如果您愿意,可以对它们进行加密,但如果范围不太广泛,我完全不会费心。