【问题标题】:Should I reuse OAuth 2.0 access tokens?我应该重复使用 OAuth 2.0 访问令牌吗?
【发布时间】:2016-05-28 23:11:35
【问题描述】:

我正在根据 OAuth 2.0 构建授权服务器。

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

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


我的想法:

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

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

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

【问题讨论】:

    标签: security oauth oauth-2.0


    【解决方案1】:

    请注意,我不是安全专家,此解释 是我对oauth的一般想法。我在文章中提到这一点的原因 开始是因为我看到您基于创建自己的身份验证服务器 在 oauth 2.0 协议上,这意味着有些人可能会 使用您的服务器进行身份验证,因此我不希望您这样做 有错误的概念。


    session-oauth 不匹配

    我想首先清除不混合会话和 oauth 的问题。恕我直言,这些是通常一起工作的两个独立的东西。

    1. Oauth 协议只是为应用/用户提供访问令牌,应用/用户可以通过该访问令牌向您的服务器查询与令牌相关的数据。

    2. 另一方面,

      Session 取决于应用程序本身。一旦某个应用程序收到令牌,他们就会使用它进行会话。当用户登录或注销时,会话被销毁,而不是 oauth。


    那么oauth token的命运如何?

    从服务器的角度来看,您的每个令牌都应在特定时间段后过期。这就对了。服务器不知道其他任何事情。它为您提供令牌,然后在 'n' 秒后过期。

    但是,应用可能会决定要撤销访问令牌。也许他们的网站被黑了,或者他们完成了所有的 api 调用。然后他们可以向您的服务器发送一个特殊请求,告诉您强制使令牌过期。


    那么用户打开多个会话应该怎么办?

    绝对没有。 作为 oauth 服务提供商,您根本不关心会话。您所知道的是,如果应用要求您提供令牌,您就给他们一个。

    不过,我也会回答您有关会话的问题。 您应该为同一个用户生成不同的会话吗?我会说是的。如果你有相同的会话,那么如果你从一台机器上注销,并在第二台机器上刷新页面,由于会话已过期,你的其他浏览器/机器也会自然注销。


    那么 github 是如何做到不显示额外条目的呢?

    我不为他们工作,所以我不知道。但我猜他们会检查每个会话,如果两个或多个会话与同一用户相关联,他们知道该用户必须使用许多设备。然后,当您的一台设备向 github 发送一些请求时,它们可以从 IP 地址猜测您所在的位置,如果您的许多机器从同一个地方发出请求,那么您必须使用多台机器。如果没有,那么可能有攻击者也在使用您的帐户。

    这就是 AFAIK 银行预测恶意用户的方式 - 不是唯一的方法,它们有时还可以预测您用于访问银行记录的模式,如果该模式不同,您的帐户很有可能被盗用。

    所以现在你可能会问我,你真的确定 我应该根据应用程序的要求创建尽可能多的令牌吗?

    这是我不太确定的部分。据我所知,oauth 有两件事。谷歌这两个术语以了解更多信息:

    1. 刷新令牌:此令牌不是您的访问令牌。此令牌永不过期,一旦您的访问令牌过期,您可以使用此令牌获取新的访问令牌。此令牌也应保密。
    2. 离线访问类型: google、facebook等很多oauth提供者也支持这种模式。这种模式基本上允许您延长访问令牌的到期时间。例如。而不是访问令牌的正常到期时间(例如 1 小时),对于离线令牌,您可能有 1 年左右的到期时间。

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

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

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


    我应该存储我的身份验证令牌吗?

    如果您的应用需要,您可以这样做,但不建议在任何地方使用,因为它可能会被泄露。令牌应该在给定的时间限制内提取数据并在再次需要时重新发布令牌。但是,您当然可以根据需要存储它们。

    另一方面,“离线”令牌预计会被存储。如果你愿意,你可以加密它们,但如果范围不是太广,我根本不会打扰。

    【讨论】:

      猜你喜欢
      • 2012-02-26
      • 2019-10-11
      • 2011-02-10
      • 2015-06-24
      • 2017-05-04
      • 2012-07-11
      • 1970-01-01
      • 2015-04-01
      • 2011-11-09
      相关资源
      最近更新 更多