将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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/339744.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

power of two java_LeetCode算法题-Power Of Two(Java实现)

这是悦乐书的第194次更新&#xff0c;第200篇原创01 看题和准备今天介绍的是LeetCode算法题中Easy级别的第56题(顺位题号是231)。给定一个整数&#xff0c;写一个函数来确定它是否是2的幂。例如&#xff1a;输入&#xff1a;1输出&#xff1a;true说明&#xff1a;2^0 1输入&a…

tomee_一罐将其全部统治:Apache TomEE + Shrinkwrap == JavaEE引导

tomee警告&#xff1a;我不是Spring Boot的专家。 我发现很多事情对此非常有趣&#xff0c;并且当然可以真正改善您的日常工作。 而且&#xff0c;我对Spring Boot没有任何反对&#xff0c;也没有开发或使用它的人。 但是我认为社区高估了该产品。 一年前&#xff0c;我开始收…

java比较equlse_java基础知识要点

一、抽象&#xff1a;二、封装&#xff1a;有了封装才有数据类型&#xff01;个体更多的设置为封装体&#xff0c;这样更加安全。该公开的公开(方法)&#xff0c;该隐藏的隐藏(属性)&#xff0c;配置一个访问窗口方法的调用(按值传递和按引用传递)1、在栈中分配空间(暂时给方法…

使用Spring Boot和Project Reactor处理SQS消息

我最近参与了一个项目&#xff0c;在该项目中&#xff0c;我不得不有效地处理通过AWS SQS Queue流入的大量消息。 在这篇文章&#xff08;可能还有一篇&#xff09;中&#xff0c;我将介绍使用出色的Project Reactor处理消息的方法。 以下是我要进行的设置&#xff1a; 设置本…

java commons lang 随机数_Apache Common-lang组件里随机数工具类RandomStringUtils的一个bug...

现在本文也转到了我自己的博客上&#xff0c;地址&#xff1a;月城小馆Apache Common组件是java开发中常用的工具&#xff0c;其中的common-lang包是java基本数据类型的处理工具&#xff0c;包括数字、字符串、日期时间等多种工具类。在org.apache.commons.lang包中有一个随机数…

初级测试开发面试题_初级开发人员在编写单元测试时常犯的错误

初级测试开发面试题自从我编写第一个单元测试以来已经有10年了。 从那时起&#xff0c;我不记得我已经编写了成千上万的单元测试。 老实说&#xff0c;我在源代码和测试代码之间没有任何区别。 对我来说是同一回事。 测试代码是源代码的一部分。 在过去的3-4年中&#xff0c;我…

java文件读写详细介绍_java文件读写操作大全

一.获得控制台用户输入的信息public String getInputMessage() throws IOException...{System.out.println("请输入您的命令∶");byte buffer[]new byte[1024];int countSystem.in.read(buffer);char[] chnew char[count-2];//最后两位为结束符&#xff0c;删去不要f…

使用SoapUI调用安全WCF SOAP服务–第1部分,该服务

在这个由三部分组成的传奇中&#xff0c;我将演示如何使用SoapUI API工具来调用安全的SOAP服务。 首先&#xff0c;我将专注于创建服务&#xff0c;在接下来的文章中它将充当被测系统。 使用基本身份验证传输安全性机制维护对该服务中资源的访问。 Windows Communication Foun…

java简单系统_Java简单学生管理系统

Java简单学生管理系统这个不需要手动输入&#xff0c;笔记记录//studentpublic class student(){private String id;//学号private String name;//姓名private int age;//年龄public String getId() {return id;}public void setId(String id) {this.id id;}public String get…

github和maven_在github上托管Maven存储库(包含源代码和javadoc)

github和maven如何通过maven使其他开发人员可以使用小型开源库&#xff1f; 一种方法是将其部署在Maven Central Repository上 。 我想要做的是将其部署到github &#xff0c;因此我可以自由地对其进行修改。 这篇文章将告诉您如何做到这一点。 我将工件部署到github的典型方法…

kafka java编程demo_Kafka简单客户端编程实例

今天&#xff0c;我们给大家带来一篇如何利用Kafka的API进行客户端编程的文章&#xff0c;这篇文章很简单&#xff0c;就是利用Kafka的API创建一个生产者和消费者&#xff0c;生产者不断向Kafka写入消息&#xff0c;消费者则不断消费Kafka的消息。下面是具体的实例代码。一、创…

java我的世界极限生存_我的世界 1.7.10 极限生存整合包

整合包介绍&#xff1a;最近总有人觉得Minecraft很无聊&#xff0c;没有什么可玩的&#xff0c;或者觉得生存太简单 那么就来试试这个吧&#xff0c;全部是增强怪物的MOD&#xff0c;保证不无聊&#xff0c;保证不简单 基本上没有增加一些新的东西&#xff0c;只增加了几种怪物…

具有InlfuxDB的Spring Boot和Micrometer第1部分:基础项目

对于那些关注此博客的人来说&#xff0c;难怪我倾向于大量使用InfluxDB。 我喜欢这样一个事实&#xff0c;它是一个真正的单一用途的数据库&#xff08;时间序列&#xff09;&#xff0c;具有许多功能&#xff0c;并且还带有企业支持。 Spring也是我选择的工具之一。 因此&…

Gradle善良:仅添加包装用于战争

我的同事Tom Wetjens 在Maven中撰写了博客文章仅打包依赖项 。 当我们想在WAR文件中包含依赖项时&#xff0c;他展示了一种Maven解决方案&#xff0c;而在其他任何作用域中都没有使用。 在这篇博客中&#xff0c;我们将看到我们如何在Gradle中解决这个问题。 假设我们在项目中…

java递归api_javaAPI_IO流基础_递归使用

IO流_递归1.递归概述递归指的是方法定义中调用自身方法的情况。2.递归的注意事项(1).要有出口&#xff0c;否则就是死递归(2).次数不能太多&#xff0c;否则就内存溢出(3).构造方法不能递归使用[不然在创建对象的时候就会内存溢出]3.递归解决问题的思想(1).分解法:把问题细分为…

PIT,JUnit 5和Gradle –仅需额外的一行配置

在Gradle&#xff08;带有gradle-pitest-plugin 1.4.7&#xff09;中发现简单&#xff0c;经过改进的PIT和JUnit 5配置。 不可否认&#xff0c;如今JUnit 5越来越受欢迎。 虽然为JUnit 5提供了一个专用于PIT的插件&#xff0c;并且gradle-pitest-plugin支持了很多年&#xff0…

apache camel_使用WildFly 8在Java EE7中自举Apache Camel

apache camel从Camel版本2.10开始&#xff0c;支持CDI&#xff08;JSR-299&#xff09;和DI&#xff08;JSR-330&#xff09;。 这为在Java EE容器中以及在独立的Java SE或CDI容器中开发和部署Apache Camel项目提供了新的机会。 是时候尝试一下并熟悉它了。 骆驼到底是什么&am…

python中可变参数怎么传递的呢_在python中,你可以在命名参数后传递可变参数吗?...

can you pass variadic arguments after named parameters?Python 3.4.3&#xff1a;答案是肯定的.如果要调用仅命名固定参数的函数,请将可变参数放在函数定义中def function(*args, bob, sally):print(args, bob, sally)values [1, 2, 3, 4]function(bob"Hi bob",…

Hibernate中保存与持久性以及saveOrUpdate之间的区别

保存与保存或更新与持久保存在Hibernate中 save和saveOrUpdate之间的区别是什么或save和persist之间的区别是任何Hibernate面试中常见的面试问题&#xff0c;就像Hibernate中get和load方法之间的区别一样。 Hibernate Session类提供了几种方法&#xff0c;可以通过诸如save&am…

java的log计算_Java普通对数(log)计算方法

Java给我提供的数学计算的工具类Math计算对数的函数有两个&#xff1a;/*** Returns the natural logarithm (base e) of a {code double}* value. Special cases:* If the argument is NaN or less than zero, then the result* is NaN.* If the argument is positive infinit…