将Auth0 OIDC(OAUTH 2)与授权(组和角色)集成

如果您正在使用Auth0对多个现有应用程序中的用户进行身份验证和授权,则可能需要将下一个Web应用程序与Auth0集成。

有多种方法可以执行此操作,例如,如果要将Jenkins与Auth0集成,则可以使用SAML v2;否则,可以使用SAML v2。 这篇博客文章解释得很好 。

如果您的应用程序不支持SAML v2 或使其成为企业付费功能 ,则可能需要使用OAuth2(或OIDC )集成。

让我们以开源监视解决方案Grafana为例,并将其与Auth0集成。

使用Auth0对Grafana用户进行身份验证:只需阅读文档

Grafana官方文档将向您说明如何:

  • [server]root_url选项设置为正确的回调URL
  • 在Auth0中创建一个新客户端,将允许的回调Urls设置为https:///login/generic_oauth
  • 使用类似的配置来配置Grafana:
 ; not mandatory, but ; not mandatory, but super useful to debug OAuth interactions with Auth0  [log]  level = debug  [server]  root_url = https: ///  [auth.generic_oauth]  enabled = true  allow_sign_up = true  team_ids =  allowed_organizations =  name = Auth0  client_id =   client_secret =   scopes = openid profile email  auth_url = https: ///authorize  token_url = https: ///oauth/token  api_url = https: ///userinfo 

问题是……您将不会获得任何类型的授权。 您的所有Auth0用户都将能够登录Grafana,但默认情况下将被分配为Viewer角色。 这是因为Grafana需要从Auth0接收有关登录用户角色的其他信息。

 t= 2020 - 04 -14T11: 39 : 03 + 0000 lvl=dbug msg= "Received user info response" logger=oauth.generic_oauth raw_json= "{\"sub\":\"auth0|5e87486a85dd980c68d912c4\",\"nickname\":\"anthony\",\"name\":\"[email protected]\",\"picture\":\" https://s.gravatar.com/avatar/79033b96a632e4ea71b59fe9554c53a2?s=480&r=pg&d=https%3A%2F%2Fcdn.auth0.com%2Favatars%2Fan.png \",\"updated_at\":\"2020-04-14T11:39:02.862Z\",\"email\":\"[email protected]\",\"email_verified\":false}" data= "Name: [email protected], Displayname: , Login: , Username: , Email: [email protected], Upn: , Attributes: map]"  t= 2020 - 04 -14T11: 39 : 03 + 0000 lvl=dbug msg= "User info result" logger=oauth.generic_oauth result= "&{Id: Name:[email protected] Email:[email protected] Login:[email protected] Company: Role: Groups:]}"  t= 2020 - 04 -14T11: 39 : 03 + 0000 lvl=dbug msg= "OAuthLogin got user info" logger=oauth userInfo= "&{Id: Name:[email protected] Email:[email protected] Login:[email protected] Company: Role: Groups:]}" 

如果查看上面的Grafana调试日志,则会看到该用户已登录,但是由于未映射任何角色,因此为该用户分配了Viewer角色

Auth0中的授权:安装扩展,然后设置组和角色

在Auth0中,您首先需要添加Authorization扩展 ,然后将提示您配置扩展:

将Auth0 OIDC(OAUTH 2)与授权(组和角色)集成_第1张图片

完成后(确保启用“组和角色”,然后旋转并按发布规则),然后可以创建一些组

将Auth0 OIDC(OAUTH 2)与授权(组和角色)集成_第2张图片

然后,您可以将用户添加到Admin组

将Auth0 OIDC(OAUTH 2)与授权(组和角色)集成_第3张图片

如果您回到Auth0,更确切地说是规则面板,则会看到该扩展添加并激活了新规则 :

将Auth0 OIDC(OAUTH 2)与授权(组和角色)集成_第4张图片

不幸的是,这还不够:我们需要让Auth0丰富发送回Grafana的userinfo 在上一章中,我们看到了Grafana调试日志显示给我们:


   { 
     "sub" : "auth0|5e87486a85dd980c68d912c4" , 
     "nickname" : "anthony" , 
     "name" : "[email protected]" , 
     "picture" : " https://s.gravatar.com/avatar/79033b96a632e4ea71b59fe9554c53a2?s=480&r=pg&d=https%3A%2F%2Fcdn.auth0.com%2Favatars%2Fan.png " , 
     "updated_at" : "2020-04-14T11:39:02.862Z" , 
     "email" : "[email protected]" , 
     "email_verified" : false 
   } 

因此,要使用组信息丰富此json对象,我们需要创建另一个规则,以丰富用户个人资料; 让我们创建一个新规则(我将其命名为add-groups )并添加以下代码:

 function addAttributes(user, context, callback) { 
   const namespace = ' https://dahanne.net/ ' ; 
   context.idToken[namespace + 'groups' ] = user.groups; 
   callback( null , user, context);  } 

现在,我们应该对Auth0租户应用2条规则:

将Auth0 OIDC(OAUTH 2)与授权(组和角色)集成_第5张图片

如果您现在重新登录Grafana,您的Grafana个人资料将不会看到任何更改。 但是如果您查看日志,特别是raw_json userinfo对象中的raw_json ,则会注意到我们的规则添加了一个新字段:


   { 
     "sub" : "auth0|5db0908a8bc0400c5c05604e" , 
     "nickname" : "anthony" , 
     "name" : "[email protected]" , 
     "picture" : " https://s.gravatar.com/avatar/79033b96a632e4ea71b59fe9554c53a2?s=480&r=pg&d=https%3A%2F%2Fcdn.auth0.com%2Favatars%2Fan.png " , 
     "updated_at" : "2020-04-13T22:49:58.965Z" , 
     "email" : "[email protected]" , 
     "email_verified" : true , 
     " https://dahanne.net/groups " : [ 
       "Admin" 
     ] 
   } 

现在,我们需要指导Grafana如何读取这个新字段,并使用它来为我们的用户个人资料分配一个组。

返回到Grafana,使用JMESPath从Auth0响应中检索用户角色

我们首先需要阅读Grafana JMESPath的文档

从文档中,我们可以推断出我们需要这样的映射:

 role_attribute_path = contains( " https://dahanne.net/groups " [*], 'Admin' ) && 'Admin' || contains( || contains( " https://dahanne.net/groups " [*], 'Editor' ) && 'Editor' || 'Viewer' 

现在,如果您重新登录Grafana,并查看调试日志,您将看到Auth0中的新字段:

 lvl=dbug msg= "User info result" logger=oauth.generic_oauth result= "&{Id: Name:[email protected] Email:[email protected] Login:[email protected] Company: Role:Admin Groups:]}" 

当然,您在Grafana中的用户个人资料现已更新:

最后的话

尽管认证集成已被很好地证明,但我在弄清楚授权部分时还是遇到了麻烦……起初,我尝试在Auth0规则中丰富user对象,但只有丰富上下文idToken (感谢我的同事Brett帮助我解决了问题)那); 更重要的是,作为URL的名称空间也是必须的!

不过,在Grafana方面,开箱即用时一切都很好。 调试日志确实有帮助!

翻译自: https://www.javacodegeeks.com/2020/04/integrating-auth0-oidc-oauth-2-with-authorization-groups-and-roles.html

你可能感兴趣的:(将Auth0 OIDC(OAUTH 2)与授权(组和角色)集成)