我正在根据OAuth 2.0构建授权服务器。
还有一个第三方Web应用程序(客户端)正在使用我的授权服务器。它是一个常规的Web应用程序,并且用户可能与此应用程序建立了多个事件 session (例如,办公室和家用计算机,或者同一台计算机上只有几个Web浏览器)。
我的授权服务器为客户端发出一次访问 token #1(带有或不带有刷新 token ,在这里不是很重要)。当用户启动与客户端的新 session 时,授权服务器应为该客户端应用程序为该新 session 赋予相同的访问 token #1还是应该发行新的#2 token ?
我的思想:
从安全角度来看,新 token 听起来可能更好,但是如果用户想要管理其授权,则他将为每个Client session 看到一个单独的条目,这可能很麻烦。
例如,GitHub为先前授权的客户端返回相同的 token ,并且在我的GitHub帐户的“应用程序”页面上,无论我启动了多少 session ,每个应用程序仅看到一个条目,这很方便。
但是,这种方法意味着我必须以可逆方式(纯文本格式或使用某些已知 key 加密)将访问 token 存储在“授权”或“资源”服务器中,而不是使用不可逆的哈希(就像您通常使用密码那样,存储盐和密码哈希)来自bcrypt,pbkdf2或类似的名称)。
最佳答案
Please be advised that I am not a security expert and this explanation is my general idea of oauth. Reason why I mentioned this in the beginning is because I see you are CREATING YOUR OWN AUTH SERVER based on oauth 2.0 protocol, which means down the road some people might be using your server for authentication, and thus I don't want you to have the wrong concept.
session -oauth不匹配
我想首先清除不要混用 session 和oauth的内容。这是恕我直言通常可以一起工作的两个独立的东西。
那么,oauth token 的命运是什么?
从服务器的角度来看,您的每个 token 都应在特定时间段后到期。这就对了。服务器什么都不知道。它为您提供 token ,然后在“n”秒后过期。
但是,应用程序可能会决定要撤消访问 token 。也许他们的网站被黑了,或者所有的api调用都完成了。然后,他们可以向您的服务器发送一个特殊请求,告诉您强制使 token 过期。
那么用户打开多个 session 该怎么办?
绝对没有。 作为oauth服务提供商,您根本不需要担心 session 。您所知道的是,如果应用程序要求您提供 token ,则给他们一个。
但是,我也会回答您有关 session 的问题。 是否应该为同一用户生成不同的 session ? 我会说是的。如果您具有相同的 session ,则从一台计算机注销,然后在第二台计算机上刷新页面,因为 session 已过期,因此其他浏览器/计算机也将自然注销。
那么github如何不显示多余的条目呢?
好吧,我不为他们工作,所以我不知道。但是我想他们会检查每个 session ,并且如果两个或多个 session 与同一用户相关联,他们知道该用户必须使用许多设备。然后,当您的一台设备向github发送一些请求时,他们可以从IP地址猜测您的位置,并且如果您的许多计算机都在同一位置发出请求,则您必须使用多台计算机。如果不是,则可能是一些攻击者也在使用您的帐户。
这就是AFAIK银行预测恶意用户的方式-不仅是唯一的方式,它们有时还会预测您用来访问银行记录的模式,如果该模式不同,则很有可能您的帐户被盗用。
因此,现在您可能会问我,您真的确定我应该创建与应用程序要求的一样多的 token 吗?
这是我不太确定的部分。从我所看到的,oauth有两件事。 Google提供这两个术语以获取更多信息:
回答以下问题:“我应该重用OAuth 2.0访问 token 吗?”
是的,在给定的有效期内, token 应被使用多次(Google将其设置为1小时)。
过期后,请使用刷新 token 来获取另一个访问 token ,并根据需要多次使用它。继续重复该过程。
如果您的用户不在线让您启动oauth流程,并且您没有刷新 token ,则该应用程序需要具有“离线” token 。
我应该存储我的身份验证 token 吗?
如果您的应用程序需要它,则可以,但由于可能被泄漏,因此不建议使用。 token 应在给定的期限内提取数据,并在需要时重新发行 token 。但是,如果需要,您当然可以存储它们。
另一方面,预计将存储“脱机” token 。您可以根据需要对其进行加密,但是如果范围不太广,我也不会打扰。
关于security - 我应该重用OAuth 2.0访问 token 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35453468/