【问题标题】:OAuth authentication authorizationOAuth认证授权
【发布时间】:2018-12-11 23:43:29
【问题描述】:

我对 OAuth 的使用完全感到困惑,我不确定如何在我的场景中使用 oauth。目前我使用“纯”JWT 方法,看起来像这样:

  1. 客户端(JavaScript 应用程序)将登录名和密码发送到我的 Rest-Endpoint(服务器 (Java))。
  2. 服务器验证用户信息,读取/生成一些用户角色并将其包装在 JWT 令牌中(带有秘密)
  3. 服务器将 JWT Token 发送回客户端
  4. 客户端将使用 Authorizationen Header 执行额外的 Rest-Calls
  5. 服务器根据角色/用户使用私有密钥和大访问权限验证 Token

现在我想到了 OAuth 的用法,但我很困惑如何使用它来实现场景。

  1. 我在“auth0”注册了一个应用程序。
  2. 我使用一个JS库重定向到auth0的登录过程,通过auth0账号登录并消费id_token和access_token

= 我可以将 id_token(带有 RSA256 的 JWT)发送到我的 rest api,使用公共证书对其进行验证,并可以提取一些用户信息

但是:

a) 我读到我不应该使用 id_token 来访问我的 api。相反,我应该使用 access_token (不是 JWT 格式,不会给我任何有关用户的信息)并使用 access_token 来查询用户信息?每个请求都应该是这样吗?!

b) 我没有看到用户角色发挥作用的地方。当我有一些只允许“管理员”或“客户”使用的操作(休息端点)时。我看不出有任何定义它们的可能性。

你看我有点困惑,我希望有人能澄清所有事情。 非常感谢 克里斯

【问题讨论】:

    标签: security oauth jwt


    【解决方案1】:

    a) 您使用的两个令牌都应该是 JWT 格式,并且您应该使用 access_token 进行经过身份验证的查询。 access_token 不一定包含有关用户的信息,因此在服务器端,您通常只能确定令牌是由令牌服务发出的并且是有效的。如果所有这些检查都通过了,您应该接受它作为经过身份验证的用户。

    b) 用户角色可以像许多其他东西一样作为附加声明(例如角色=admin、datawriter 或 role=customer、listreader)放入 access_token 的有效负载部分。

    希望对你有帮助。

    【讨论】:

      【解决方案2】:

      a) 听起来您获得的是 opaque access_token 而不是 JWT。您需要在 Auth0 中创建一个 API(类似于您已经创建的应用程序/客户端)。然后在进行身份验证时将该标识符传递到 audience 参数中。然后你应该得到一个 JWT,它会有一个 sub 参数,它是用户的 Auth0 ID,它可以帮助你识别用户是谁。如果您需要将更多标识信息放入令牌中,我相信您也可以使用 Auth0 规则。有关不透明与 JWT 访问令牌的完整说明,请参见此处:https://auth0.com/docs/tokens/access-token

      b) 角色很棘手。我相信 Auth0 会建议您在 API 上创建范围,然后在登录期间请求所需的范围。然后,Auth0 规则将用作一种“胶水”,以调整已请求但不允许经过身份验证的用户的范围。他们还有一个授权扩展,您可以使用它来帮助促进其中的一些。另一种选择可能是将角色信息存储在用户元数据中,并使用规则将该信息放入令牌中。最后,我们选择的选项是不使用 Auth0 来定义我们的角色。我们让 Auth0 进行身份验证,一旦通过身份验证,我们就会检查系统中的访问权限以了解事物的授权方面。很多选择。

      【讨论】:

        猜你喜欢
        • 2020-02-21
        • 2019-02-15
        • 2018-02-07
        • 2016-02-15
        • 2018-07-25
        • 2018-05-29
        • 2010-11-14
        • 2021-11-08
        相关资源
        最近更新 更多