将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://<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响应中检索用户角色
我们首先需要阅读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:anthony@host.net Email:anthony@host.net Login:anthony@host.net 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)与授权(组和角色)集成相关推荐
- oidc auth2.0_将Auth0 OIDC(OAUTH 2)与授权(组和角色)集成
oidc auth2.0 如果您正在使用Auth0对多个现有应用程序中的用户进行身份验证和授权,则可能需要将下一个Web应用程序与Auth0集成. 有多种方法可以执行此操作,例如,如果要将Jenkin ...
- 详解OAuth 2.0授权协议(Bearer token)
OAuth 2.0授权协议 1 认证(Authentication) 2 授权(Authorization) 3 OAuth 2.0与认证机制的联系 4 详解OAuth 2.0授权协议 4.1 授权码 ...
- 基于 IdentityServer3 实现 OAuth 2.0 授权服务【密码模式(Resource Owner Password Credentials)】...
密码模式(Resource Owner Password Credentials Grant)中,用户向客户端提供自己的用户名和密码.客户端使用这些信息,向"服务商提供商"索要授权 ...
- OAuth认证与授权
什么是OAuth授权? 一.什么是OAuth协议 OAuth(开放授权)是一个开放标准. 允许第三方网站在用户授权的前提下访问在用户在服务商那里存储的各种信息. 而这种授权无需将用户提供用户名和密码提 ...
- OAUTH 2.0授权码授予
OAuth 2.0提供了许多安全性流程(或授权类型),以允许一个应用程序访问另一个应用程序中的用户数据. 在此博客中,我们将介绍OAuth 2.0授权:授权代码授权. 首先,有许多定义: 客户端 :用 ...
- OAuth 2.0——授权服务开发笔记(一)
一.概念 OAuth是一个关于授权(authorization)的开放网络标准,在全世界得到广泛应用,目前的版本是2.0版.因为1.0版设计的很繁琐,所以被抛弃了. OAuth 协议为用户资源的授权提 ...
- OAuth:每次授权暗中保护你的那个“MAN”
摘要:OAuth是一种授权协议,允许用户在不将账号口令泄露给第三方应用的前提下,使第三方应用可以获得用户在某个web服务上存放资源的访问权限. 背景 在传统模式下,用户的客户端在访问某个web服务提供 ...
- OAuth 2.0 授权框架 RFC6749翻译
最近要设计开放平台,调研时发现很多开放平台都是基于OAuth 2.0的,于是来学习一下文档.顺带翻译一遍. 原文:https://datatracker.ietf.org/doc/html/rfc67 ...
- 基于go-oauth2/oauth2实现OAuth 2.0 授权码方式
前言 本文基于go-oauth2/oauth2,参考go-oauth2/oauth2/example.go-oauth2/gin-server.llaoj/oauth2,结合beego框架实现OAut ...
最新文章
- 《将要淘汰的八种人》读后感
- 算法 - 时间复杂度
- 一个接口查询关联了十几张表,响应速度太慢?那就提前把它们整合到一起
- 团队项目-个人博客-4.20
- 从零打造聚合支付系统:一、浅谈聚合支付的核心价值
- 原型设计工具的对比评测记录(一)
- k8s查看pod的yaml文件_K8s-yaml的使用及命令
- 【chorme插件开发】第五节:纯js实现的功能插件实例
- Intel MKL 稀疏矩阵求解PARDISO 函数
- AtCoder Beginner Contest 083
- 2022秋招求职记录(图像 视觉 c++)
- 最强面试题整理第一弹:Python 基础面试题(附答案)
- 制作AR换装游戏(上篇AR识图)#1024程序员节#
- 所有计算机都可以安装win7,t570都可以装win7系统吗_win7 64位系统所有电脑都能装吗...
- 彗星通行证的积分规则是什么?
- 计算机第一启动设置u盘启动,如何进入bios,设置优盘为电脑第一启动顺序
- 2017 我所分享的技术文章总结(下)
- 关于SQLServer2005的学习笔记——CTE递归和模拟测试数据
- Vue+SpringBoot实现Excel在线预览功能(PS:添加样式比较费劲)
- unity 编辑器窗口 批量修改文件名字
热门文章
- ssl初一组周六模拟赛【2018.3.17】
- 信息学奥赛一本通1349-最优布线问题
- 2021“MINIEYE杯”中国大学生算法设计超级联赛(2)I love exam(背包)
- codeforces gym-101745 C-Infinite Graph Game 分块
- 简单的数学问题 洛谷 P1414 又是毕业季II
- Spring @Qualifier 注释
- java图形验证码生成工具类
- 谈谈Memcached与Redis
- jQuery动画与事件概念以及语法
- ssh(Spring+Spring mvc+hibernate)——Dept.hbm.xml