如果您正在使用Auth0对多个现有应用程序中的用户进行身份验证和授权,则可能需要将下一个Web应用程序与Auth0集成。
有多种方法可以执行此操作,例如,如果要将Jenkins与Auth0集成,则可以使用SAML v2;否则,可以使用SAML v2。 这篇博客文章解释得很好 。
如果您的应用程序不支持SAML v2 或使其成为企业付费功能 ,则可能需要使用OAuth2(或OIDC )集成。
让我们以开源监视解决方案Grafana为例,并将其与Auth0集成。
使用Auth0对Grafana用户进行身份验证:只需阅读文档
- 将
[server]
的root_url
选项设置为正确的回调URL - 在Auth0中创建一个新客户端,将允许的回调Urls设置为
https://<grafana domain>/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: //<grafana domain>/ [auth.generic_oauth] enabled = true allow_sign_up = true team_ids = allowed_organizations = name = Auth0 client_id = <client id> client_secret = <client secret> scopes = openid profile email auth_url = https: //<domain>/authorize token_url = https: //<domain>/oauth/token api_url = https: //<domain>/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\":\"anthony@host.net\",\"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\":\"anthony@host.net\",\"email_verified\":false}" data= "Name: anthony@host.net, Displayname: , Login: , Username: , Email: anthony@host.net, Upn: , Attributes: map]" t= 2020 - 04 -14T11: 39 : 03 + 0000 lvl=dbug msg= "User info result" logger=oauth.generic_oauth result= "&{Id: Name:anthony@host.net Email:anthony@host.net Login:anthony@host.net Company: Role: Groups:]}" t= 2020 - 04 -14T11: 39 : 03 + 0000 lvl=dbug msg= "OAuthLogin got user info" logger=oauth userInfo= "&{Id: Name:anthony@host.net Email:anthony@host.net Login:anthony@host.net Company: Role: Groups:]}"
如果查看上面的Grafana调试日志,则会看到该用户已登录,但是由于未映射任何角色,因此为该用户分配了Viewer
角色
Auth0中的授权:安装扩展,然后设置组和角色
在Auth0中,您首先需要添加Authorization扩展 ,然后将提示您配置扩展:
完成后(确保启用“组和角色”,然后旋转并按发布规则),然后可以创建一些组
然后,您可以将用户添加到Admin组
如果您回到Auth0,更确切地说是规则面板,则会看到该扩展添加并激活了新规则 :
不幸的是,这还不够:我们需要让Auth0丰富发送回Grafana的userinfo
; 在上一章中,我们看到了Grafana调试日志显示给我们:
{
"sub" : "auth0|5e87486a85dd980c68d912c4" ,
"nickname" : "anthony" ,
"name" : "anthony@host.net" ,
"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" : "anthony@host.net" ,
"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条规则:
如果您现在重新登录Grafana,您的Grafana个人资料将不会看到任何更改。 但是如果您查看日志,特别是raw_json
userinfo
对象中的raw_json
,则会注意到我们的规则添加了一个新字段:
{
"sub" : "auth0|5db0908a8bc0400c5c05604e" ,
"nickname" : "anthony" ,
"name" : "anthony@host.net" ,
"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" : "anthony@host.net" ,
"email_verified" : true ,
" https://dahanne.net/groups " : [
"Admin"
]
}
现在,我们需要指导Grafana如何读取这个新字段,并使用它来为我们的用户个人资料分配一个组。
返回到Grafana,使用JMESPath从Auth0响应中检索用户角色
从文档中,我们可以推断出我们需要这样的映射:
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:anthony@host.net Email:anthony@host.net Login:anthony@host.net Company: Role:Admin Groups:]}"
当然,您在Grafana中的用户个人资料现已更新:
最后的话
尽管认证集成已被很好地证明,但我在弄清楚授权部分时还是遇到了麻烦……起初,我尝试在Auth0规则中丰富user
对象,但只有丰富上下文idToken
(感谢我的同事Brett帮助我解决了问题)那); 更重要的是,作为URL的名称空间也是必须的!
不过,在Grafana方面,开箱即用时一切都很好。 调试日志确实有帮助!