我应该重复使用OAuth 2.0访问令牌吗?

10

我正在构建一个 OAuth 2.0 授权服务器。

同时,有一个第三方 Web 应用程序(客户端)正在使用我的授权服务器。它是一个常规的 Web 应用程序,用户可能与该应用程序建立了多个活动会话(例如,在办公室和家庭机器上,或仅在同一台机器上运行的几个 Web 浏览器中)。

我的授权服务器为 Client 发布了一次访问令牌 #1(带有或不带有刷新令牌,在这里并不重要)。当用户开始与 Client 建立新会话时,授权服务器是否应该为该新会话向 Client 应用程序提供相同的访问令牌 #1,还是应该发出新的 #2 令牌?


我的想法:

从安全性角度考虑,新令牌听起来更好,但是如果用户想管理他的授权,他将看到每个 Client 会话的单独条目,这可能会很混乱。

例如,GitHub 返回以前已经授权的客户端相同的令牌,在我的 GitHub 帐户的“应用程序”页面上,无论我启动了多少会话,我只会看到每个应用程序的一个条目,这很方便。

但是,这种方法意味着我必须以可逆的方式(明文或使用某些已知密钥加密)在授权或资源服务器中存储访问令牌,而不是使用不可逆的哈希(就像通常使用密码时所做的那样,存储 bcrypt、pbkdf2 或类似方法的 salt 和密码哈希值)。

1个回答

10
请注意,我不是安全专家,这个解释是我对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有两个东西。搜索以下这两个术语的更多信息:

  1. Refresh Token: 这个token不是你的access token。这个token永远不会过期,一旦你的access token过期,你可以使用这个token来获取一个新的access token。这个token也需要保密。
  2. 离线访问类型: 许多OAuth提供者(如Google和Facebook)还支持此模式。该模式基本上允许你延长你的access token的有效期。例如,与正常的access token到期时间(例如1小时)相比,对于离线令牌,你可能拥有1年左右的到期时间。

“我应该重复使用OAuth 2.0访问令牌吗?”的答案

是的,该令牌应在给定的过期时间内被使用多次(谷歌将其设置为1小时)。 当其过期后,使用刷新令牌获取另一个访问令牌,并根据需要使用它。不断重复这个过程。

如果您的用户无法在线启动Oauth过程,并且您没有刷新令牌,则应用程序需要具有“离线”令牌。


我应该存储我的授权令牌吗?

如果您的应用程序需要,您可以存储它们,但由于可能会泄漏,这并不是推荐的做法。令牌应在给定的时间限制内提取数据,并在需要时重新发行令牌。但是,如果您想要,您肯定可以将它们存储。

另一方面,“离线”令牌预计应存储。如果您愿意,可以对它们进行加密,但如果范围不太广泛,我完全不会费心。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接