security - 我应该重用OAuth 2.0访问 token 吗?

标签 security oauth oauth-2.0

我正在根据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 协议(protocol)仅向应用程序/用户提供访问 token ,通过该访问 token ,应用程序/用户可以查询您的服务器以获取与 token 关联的数据。
  • 另一方面, session 取决于应用程序本身。一旦某些应用收到 token ,他们便会进行 session 。当用户登录或注销时, 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提供这两个术语以获取更多信息:
  • 刷新 token :此 token 不是您的访问 token 。该 token 永不过期,一旦您的访问 token 过期,您就可以使用此 token 获取新的访问 token 。此 token 也应保密。
  • 脱机访问类型:许多oauth提供程序(例如google和facebook)也支持此模式。基本上,此模式使您可以延长访问 token 的到期时间。例如。而不是正常的访问 token 到期时间(例如1小时),对于脱机 token ,您的到期时间可能为1年左右。

  • 回答以下问题:“我应该重用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/

    相关文章:

    security - 能否依靠HTTPS协议(protocol)实现Web session 管理

    外部 OAuth 登录后 Django 重定向到上一页

    perl - 使用 LWP::Authen::OAuth2 访问受 OAuth2 保护的 Google API 时出现问题

    php - 保护 secret 数据免遭泄露

    c# - RegistrySecurity 访问被拒绝。 C#

    java - 如何在 Apache Camel 中使用 Oauth header 调用 REST API?

    multithreading - 如何在多线程应用程序中刷新OAUTH2 BOX token

    java - 如何管理多个微服务中的安全上下文

    javascript - 什么可以保护我的 Facebook 应用程序不被冒充?

    c# - Facebook 登录 "Keep me logged in to"不工作