OAuth身份验证授权

时间:2018-07-03 15:32:22

标签: security oauth jwt

我对OAuth的使用完全感到困惑,我不确定如何在我的szenario中使用oauth。目前,我使用的是“纯” JWT方法,如下所示:

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

现在我正在考虑OAuth的用法,但是我很困惑如何使用它来实现szenario。

  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)我看不到用户角色起作用的地步。当我有一些操作(其余端点)时,仅允许“管理员”或“客户”使用。我认为无法定义它们。

您看到我有点困惑,我希望有人可以澄清所有事情。 非常感谢 克里斯

2 个答案:

答案 0 :(得分:0)

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

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

希望对您有帮助。

答案 1 :(得分:0)

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

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

相关问题