【问题标题】:Authentication with OAuth and JWT but without OpenID Connect使用 OAuth 和 JWT 但没有 OpenID Connect 的身份验证
【发布时间】:2015-09-02 01:52:22
【问题描述】:

我想知道我是否真的需要 OpenID Connect 在 OAuth2 之上提供身份验证。在我看来,如果我生成 JWT (JWE) 作为我的访问令牌并将用户声明、角色/权限等存储在访问令牌中,则不需要 OpenID Connect 的 id 令牌。资源服务器可以验证每个请求的访问令牌。或者,我可以保持访问令牌很小,只让它存储一个会话 ID 并使用声明/角色/权限填充该会话。我也可以在会话中放置一个过期值并支持滑动过期等,甚至不处理刷新令牌。我是否错过了 OpenID Connect 的真正意义?

更新

我刚刚意识到我需要稍微澄清一下我的问题。如果我建立了一个允许用户通过 Google 登录的网站,我就会看到 OpenID Connect 是多么必要。我允许某人基于某些 OAuth 授权流程访问我的网站,但该流程不能证明已发生身份验证。但是,如果我正在构建一堆服务,并且只想发布令牌来访问这些服务资源,那么 OAuth 还不够吗?如果我希望这些令牌包含角色/声明以便我可以在我的服务中做出授权决策,那么包含角色/声明的 JWT 还不够吗?如果感觉在这种情况下不需要 OpenID Connect。

【问题讨论】:

    标签: session authentication oauth authorization openid-connect


    【解决方案1】:

    通过要求访问令牌是 JWT,同意进入 JWT 的用户声明,在其中放置过期/颁发时间戳,并确保您以加密方式验证您实际正在执行的令牌的颁发者与 OpenID Connect 所做的事情完全相同:“分析”OAuth 2.0,使其可以提供用户身份验证/身份信息。

    更新:

    但如果您不需要用户身份验证语义,您可以坚持使用 OAuth 2.0。您可以使用 JWT 作为访问令牌,以便资源服务器(API)可以验证和检查访问令牌并找出客户端代表谁执行操作。但请注意,拥有该令牌并不意味着用户当时在场(并且已通过身份验证)。

    【讨论】:

    • 感谢您的回答!我刚刚意识到我需要澄清一下我的问题。如果我建立了一个允许用户通过 Google 登录的网站,我就会看到 OpenID Connect 是多么必要。我允许某人基于某些 OAuth 授权流程访问我的网站,但该流程不能证明已发生身份验证。但是,如果我正在构建一堆服务,并且只想发布令牌来访问这些服务资源,那么 OAuth 还不够吗?如果我希望这些令牌包含角色/声明以便我可以在我的服务中做出授权决策,那么 JWT 还不够吗?
    • 这听起来确实像标准的 OAuth 2.0,其中客户端向资源服务器 (=API) 提供结构化的 JWT,并且 API 知道如何验证令牌并使用其中的声明。它不提供身份验证,但允许委派对客户端的访问。
    • 谢谢,这是我等待的确认。我的同事想要引入 OpenID Connect 并让 API 使用 id_token。我认为这是因为他们认为声明属于 id_token(由规范支持)而不是访问令牌(不是由 OAuth 定义)。但是,由于 OpenID Connect、依赖方(OAuth 客户端)是唯一使用 id_token 的,我们必须考虑我们的 API RP?!这似乎是对 OpenID Connect 旨在解决的问题的误解。
    • 如果您更新您的答案,确认 OAuth + JWT 足以满足我的方案并且包含声明的 JWT 可以用作访问令牌,我可以接受。再次感谢!
    猜你喜欢
    • 2011-12-04
    • 2016-06-28
    • 1970-01-01
    • 2018-07-01
    • 2022-01-06
    • 2021-09-07
    • 2019-03-14
    • 2018-07-03
    • 2017-01-01
    相关资源
    最近更新 更多