【问题标题】:OAuth2 returning JWT in place of access_tokenOAuth2 返回 JWT 代替 access_token
【发布时间】:2014-12-25 16:00:21
【问题描述】:

我目前正在使用 bshaffer PHP 库 here 构建 OAuth2 提供程序。

我发现 IETF draft specifications 概述了具体调用 JSON Web 令牌用作授权授予和客户端身份验证的实现。

然而,我感兴趣的实现是返回一个 JWT 代替常规访问令牌,如 here 所示。在死链接的情况下,访问令牌响应粘贴在下面。

{    
    "access_token":"eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJpZCI6IjYzMjIwNzg0YzUzODA3ZjVmZTc2Yjg4ZjZkNjdlMmExZTIxODlhZTEiLCJjbGllbnRfaWQiOiJUZXN0IENsaWVudCBJRCIsInVzZXJfaWQiOm51bGwsImV4cGlyZXMiOjEzODAwNDQ1NDIsInRva2VuX3R5cGUiOiJiZWFyZXIiLCJzY29wZSI6bnVsbH0.PcC4k8Q_etpU-J4yGFEuBUdeyMJhtpZFkVQ__sXpe78eSi7xTniqOOtgfWa62Y4sj5Npta8xPuDglH8Fueh_APZX4wGCiRE1P4nT4APQCOTbgcuCNXwjmP8znk9F76ID2WxThaMbmpsTTEkuyyUYQKCCdxlIcSbVvcLZUGKZ6-g",
    "client_id":"CLIENT_ID",
    "user_id":null,
    "expires":1382630473,
    "scope":null
}

它返回一个 JWT 来代替定期生成的访问令牌以进行正常的授权授予。客户端和用户凭据授予对我来说更重要,因为我们只处理第一方 API 访问。

这个实现似乎很理想,因为我不需要维护生成的令牌的存储,从而限制了所需的基础设施数量。在某些时候,如果我们向第三方开放 API,我们将需要一个用于各种 pub/priv 密钥的密钥库,以验证每个客户端的令牌,并限制某些不法分子窃取加密密钥的风险。

我觉得这是一个很好的实现,依赖于非对称加密和 SSL/TLS。但是有没有我遗漏的潜在安全风险?

【问题讨论】:

  • 与您的问题相切,您获得的令牌示例不使用标准 JWT 声明。例如,它有 client_id 而不是 sub(这可能来自旧规范,当前要求在这里:tools.ietf.org/html/draft-ietf-oauth-jwt-bearer-11#section-3
  • 谢谢!我从中提取响应的文档必须是过时的,v1.5 正在生成一个带有“sub”、“iss”等的令牌。感谢仔细检查。
  • 一个缺点是您无法在没有令牌数据库的情况下撤销已发行的 JWT 令牌。

标签: oauth oauth-2.0 jwt


【解决方案1】:

JWT 上的签名只会保护令牌内部的任何声明不被篡改,但不能保护令牌外部的声明。因此,结构中的expires 字段不受保护,可以被篡改。

为了防止被篡改,您想使用exp claim

两个有效的解决方案是:

  1. 仔细检查expiresexp
  2. 删除expires 并使用exp

根据您的要求,您可能更喜欢其中一种。就个人而言,我会保持简单并使用(2)

【讨论】:

  • 我喜欢你关于 exp 的建议。问题:如果我正在实施 refresh_token 流程,我应该将刷新令牌添加为 JWT 中的声明还是将其添加为 refresh_token JSON 属性?
  • 我建议您将其添加为 refresh_token JSON 属性。注销时,您可以撤销 access_token 或 refresh_token
猜你喜欢
  • 2022-08-11
  • 1970-01-01
  • 2017-05-30
  • 2015-08-10
  • 2012-01-03
  • 1970-01-01
  • 1970-01-01
  • 2012-01-11
  • 1970-01-01
相关资源
最近更新 更多