我正在根据OAuth 2.0构建授权服务器。
还有一个使用我的授权服务器的第三方Web应用程序(客户端)。这是一个常规的Web应用程序,用户可能会使用此应用程序建立多个活动会话(例如,办公室和家庭计算机,或同一台计算机上的几个Web浏览器)。
我的授权服务器为客户端发出一次访问令牌#1(带或不带刷新令牌,这里不是那么重要)。当用户与客户端启动新会话时,授权服务器是否应该为客户端应用程序提供该新会话的相同访问令牌#1,还是应该发出新的#2令牌?
我的想法:
从安全的角度来看,新令牌可能听起来更好,但如果用户想要管理他的授权,他将看到每个客户端会话的单独条目,这可能是混乱的。
例如,GitHub为以前授权的客户端返回相同的令牌,并且在我的GitHub帐户的“应用程序”页面上,我看到每个应用程序只有一个条目,无论我启动了多少个会话,这很方便。 / p>
然而,这种方法意味着我必须以可逆方式(纯文本或使用某些已知密钥加密)在授权或资源服务器中存储访问令牌,而不是使用不可逆的散列(就像您通常使用密码,存储盐一样)和密码哈希来自bcrypt,pbkdf2或类似的东西)。
答案 0 :(得分:5)
请注意,我不是安全专家和此解释 是我对oauth的总体看法。我之所以提到这一点的原因 开始是因为我看到你创建自己的AUTH SERVER 关于oauth 2.0协议,这意味着一些人可能会在路上 使用您的服务器进行身份验证,因此我不希望您这样做 有错误的概念。
我想首先明确这一点,不要混合会话和oauth。这些是通常在恕我直言中共同发现的两件事。
Oauth 协议只是为应用/用户提供访问令牌,通过该令牌,应用/用户可以向服务器查询与令牌相关的数据。
会话取决于应用程序本身。一旦某个应用程序收到令牌,他们就会进行会话。当用户登录或注销时,会话被销毁,而不是oauth。
从服务器的角度来看,每个令牌都应该在一段时间后过期。这就对了。服务器不知道其他任何事情。它会为您提供令牌,然后在'n'秒后过期。
但是,应用可能会决定撤消访问令牌。也许他们的网站被黑了,或者他们可能已经完成了所有api调用。然后他们可以向您的服务器发送一个特殊请求,告诉您强制使令牌过期。
绝对没有。作为oauth服务提供商,您根本不关心会话。所有你知道的是,如果应用程序要求你提供令牌,你可以给他们一个。
但是,我也会回答你关于会话的问题。 你应该为同一个用户产生不同的会话吗?我会说是的。如果你有相同的会话,那么如果你从一台机器注销,并在第二台机器上刷新页面,由于会话已经过期,你的其他浏览器/机器也会自然退出。
嗯,我不为他们工作,所以我不知道。但我猜他们会检查每个会话,如果两个或多个会话与同一个用户关联,他们就知道用户必须使用许多设备。然后,当您的某个设备向github发送一些请求时,他们可以从您的IP地址猜测您的位置,如果您的许多计算机正在从同一个地方发出请求,那么您必须使用多台计算机。如果没有,那么也许一些攻击者也在使用您的帐户。
这就是AFAIK银行预测恶意用户的方式 - 不是唯一的方式,他们有时也会预测您用来访问银行记录的模式,如果这种模式不同,很可能会导致您的帐户遭到入侵。< / p>
这是我不太确定的部分。从我所看到的,oauth有两件事。谷歌这两个术语获取更多信息:
是的,该令牌应该在给定的到期时间内被使用多次(谷歌将它设置为1小时)。 在它过期后,使用刷新令牌获取另一个访问令牌并根据需要多次使用它。继续重复这个过程。
如果您的用户不在线启动oauth流程,并且您没有刷新令牌,则该应用需要具有“离线”令牌。
如果您的应用需要,您可以使用,但由于可能会泄露,因此无法推荐。令牌应该在给定的时间限制内提取数据,并在需要时重新发出令牌。但是,如果你愿意,你肯定可以存储它们。
另一方面,预计将存储“离线”令牌。如果你愿意,你可以对它们进行加密,但是如果范围不是太广泛,我就不会费心了。