热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

可视化软件grafana如何用oauth实现第三方授权登录

前言无论是什么行业的企业或业务,有时候我们需要查看历史数据---了解业务,

前言



    无论是什么行业的企业或业务,有时候我们需要查看历史数据---了解业务,总结规律,发现异常。

    grafana作为数据可视化软件之一,支持多种数据源,可灵活配置图表,得到你想要的数据呈现效果,也有很多开放的api,方便和其他系统集成,也就是说grafana直接读取你的数据,至于如何展示,在它上面设置就可以了,而且开源、免费。如果数据量多,需要高性能,可以把数据存在influxDb等时序数据库。

    但是遗憾的是,系统本身没有中文版本,如果需要汉化:可参考我之前的这篇文章:https://blog.csdn.net/koppel/article/details/90272136。


    近期需要做grafana的权限控制,虽然官网有介绍多种方式,但是不够详细,网上的帖子也比较旧,想做好还是要花一些时间的。一年前写的上面这篇简短的文章也有四千多阅读量, 有人关注grafana也说明了物联网和大数据的发展迅速,因此这次把oauth的也记录下来,给大家参考。



需求



我自己有业务的管理后台,不同的管理员有不同的项目权限,同时自己服务器部署了grafana。之前是使用了匿名登录(auth.anonymous enable=true),所有人都能看到所有项目,现在希望在自己的管理后台点击按钮跳转到grafana后台,也有对应的权限。


想实现的效果就是:

1、能不能那边登录了,这边自动登录

2、用户仅能查看自己项目的图表数据。

3、除了登录,权限管理能不能也同步

   

使用自带的权限管理功能



如果不开发,使用自带的权限也是可以的。


    grafana有几个概念:user用户org组织、team团队、role角色。项目中只有一个组织,据说创建多个组织需要重新配置数据源。系统默认三个角色。grafana从6.4以上支持role mapping,如果没猜错的话,会支持更多的角色,但是由于我用的是6.2,默认只有admin、viewer和editor三个角色。

    上面两种都不太合适做权限管理。但是可以通过team充当角色。人可以属于team,team又和dashboard关联。


这样做的好处:

    不需要开发。

坏处:

    需要手动维护权限。如果你有自己的系统,那又要在grafana维护权限,权限改动两边都要更新,可能遗忘导致两边权限不一致。


使用oauth登录


为什么没选择ldap?

    除了oauth,grafana还支持ldap(轻型目录访问协议),但是应该需要搭建服务,而oauth是更主流的方案。


目录:

步骤1:修改grafana配置文件

步骤2:开发三个接口

步骤3:调试和验证



步骤1:修改grafana配置文件


我的文件在/etc/grafana/grafana.ini

[server]

root_url = http://xxx.com:3000

这里的root_url需要修改为真实的地址,因为授权回调的redirect_uri是这个。


配置oauth

[auth.generic_oauth]

enabled = true

name = OAuth

allow_sign_up = true

client_id = some_id

client_secret = some_secret

scopes = user:email,read:org

auth_url = http://xxx.com/login/oauth/authorize

token_url = http://xxx.com/login/oauth/token

api_url = http://xxx.com/login/oauth/userinfo


这里主要是需要后端提供三个接口:

auth_url是授权接口。token_url是获取token。api_url是获取用户信息接口,下文会继续介绍。


配置好之后可以重启grafana:

./bin/grafana-server -cOnfig="/etc/grafana/grafana.ini"


步骤2:开发三个接口


这里主要介绍请求流程,入参和返回值的形式,假设uid是123456。

我是把uid作为code,同时作为token,在实际的项目中,后端最好使用JWT做token的验证。(关于JWT可自行百度)。


接口1:get请求

请求地址:

https://xxx.com/login/oauth/authorize?access_type=online&client_id=some_id&redirect_uri=http%3A%2F%2Fxxx.com%3A3000%2Flogin%2Fgeneric_oauth&response_type=code&scope=user%3Aemail+read%3Aorg&state=JAh0jkpkBbBW4mkVHpWnylC9eJk1pvwAQgWar6bAXxQ%3D


接口返回做重定向:

http://xxx.com:3000/login/generic_oauth?state={state}&code=123456


接口2:post请求

请求地址:

http://xxx.com/login/oauth/token

post参数:

{"code":"123456","grant_type":"authorization_code","redirect_uri":"http://xxx.com:3000/login/generic_oauth"}

返回值:

{

    "access_token": "123456",

    "token_type": "Bearer",

    "expiry_in": "",

     "refresh_token": ""

}


接口3

get请求

header:

authorization:Bearer 123456

返回值:

{

"name":"test",

"email":"test@test"

}


代码参考(php laravel):


    namespace App\Http\Controllers\BigData;
    use App\Http\Controllers\Controller;
    use Illuminate\Http\Request;
    use \LeanCloud\Query as LeanQuery;
    use Auth;


    class OAuthController extends Controller {


    public function auth(Request $request) {
    if (Auth::user() == NULL) {
    return response()->json(["msg" => "not login"]);
    }
    $redirect_uri = $request->input("redirect_uri");
    $state = $request->input("state");
    $url = $redirect_uri . "?state=" . $state . "&code=" . Auth::user()->objectId;
    return response()->redirectTo($url);
    }


    // code 换取 token
    public function token(Request $request) {
    $myObj = new \stdClass();
    $myObj->access_token = $request->input("code");
    $myObj->token_type = "Bearer";// jwt要是这个
    $myObj->expiry_in = "";
    $myObj->refresh_token = "";
    $myJSON = json_encode($myObj);
    return response($myJSON);
    }


    public function userinfo(Request $request) {
    $header_auth = \Request::header("authorization");
    $uid = substr($header_auth, 7);
    if (!$uid) {
    return response()->json(["msg" => ""]);
    }
    // 根据uid获取用户
    $query = new LeanQuery("_User");
    $data = $query->get($uid);
    $nickName = $data->get("nickName");
    $email = $data->get("username") . "@test";// 需要是电子邮箱格式
    return response()->json(["email" => $email, "name" => $nickName]);
    }


    }



    步骤3:调试和验证

    首先访问http://xxx.com:3000/login要能看到登录页面的oauth入口,证明配置生效了


        点击按钮后,会请求:http://xxx.com:3000/login/generic_oauth。我们需要开发提供的三个oauth接口,都是在login/generic_oauth里面静默调用的。

        先请求第一个auth_url接口获取code。然后拿code请求第二个token_url接口,获取token。然后把token放到header中请求第三个api_url接口。然后根据第三接口返回的email和name自动注册登录。

        调试过程中如果接口有问题,grafana会把接口的返回值比如报错,都打印到日志中,查看日志中的信息即可。




        oauth自动登录开发好之后,可以调用grafana的api开发权限管理:让指定的team拥有dashboard的查看权限,让用户属于某些team。api参考文档:https://grafana.com/docs/grafana/latest/http_api/dashboard_permissions/



        至此,你的grafana就可以和现有项目无缝衔接,使用更加方便。


        本文的部分内容来自mediam,查看原文:

    https://medium.com/@manivannan_data/grafana-generic-oauth-login-authentication-c31a1ce56a45



    推荐阅读
    • Skywalking系列博客1安装单机版 Skywalking的快速安装方法
      本文介绍了如何快速安装单机版的Skywalking,包括下载、环境需求和端口检查等步骤。同时提供了百度盘下载地址和查询端口是否被占用的命令。 ... [详细]
    • 知识图谱——机器大脑中的知识库
      本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
    • http:my.oschina.netleejun2005blog136820刚看到群里又有同学在说HTTP协议下的Get请求参数长度是有大小限制的,最大不能超过XX ... [详细]
    • 计算机存储系统的层次结构及其优势
      本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
    • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
    • 本文介绍了在使用Python中的aiohttp模块模拟服务器时出现的连接失败问题,并提供了相应的解决方法。文章中详细说明了出错的代码以及相关的软件版本和环境信息,同时也提到了相关的警告信息和函数的替代方案。通过阅读本文,读者可以了解到如何解决Python连接服务器失败的问题,并对aiohttp模块有更深入的了解。 ... [详细]
    • 本文介绍了在mac环境下使用nginx配置nodejs代理服务器的步骤,包括安装nginx、创建目录和文件、配置代理的域名和日志记录等。 ... [详细]
    • WebSocket与Socket.io的理解
      WebSocketprotocol是HTML5一种新的协议。它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送 ... [详细]
    • Whatsthedifferencebetweento_aandto_ary?to_a和to_ary有什么区别? ... [详细]
    • 本文介绍了一个适用于PHP应用快速接入TRX和TRC20数字资产的开发包,该开发包支持使用自有Tron区块链节点的应用场景,也支持基于Tron官方公共API服务的轻量级部署场景。提供的功能包括生成地址、验证地址、查询余额、交易转账、查询最新区块和查询交易信息等。详细信息可参考tron-php的Github地址:https://github.com/Fenguoz/tron-php。 ... [详细]
    • Gitlab接入公司内部单点登录的安装和配置教程
      本文介绍了如何将公司内部的Gitlab系统接入单点登录服务,并提供了安装和配置的详细教程。通过使用oauth2协议,将原有的各子系统的独立登录统一迁移至单点登录。文章包括Gitlab的安装环境、版本号、编辑配置文件的步骤,并解决了在迁移过程中可能遇到的问题。 ... [详细]
    • Sleuth+zipkin链路追踪SpringCloud微服务的解决方案
      在庞大的微服务群中,随着业务扩展,微服务个数增多,系统调用链路复杂化。Sleuth+zipkin是解决SpringCloud微服务定位和追踪的方案。通过TraceId将不同服务调用的日志串联起来,实现请求链路跟踪。通过Feign调用和Request传递TraceId,将整个调用链路的服务日志归组合并,提供定位和追踪的功能。 ... [详细]
    • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
    • 本文介绍了一个React Native新手在尝试将数据发布到服务器时遇到的问题,以及他的React Native代码和服务器端代码。他使用fetch方法将数据发送到服务器,但无法在服务器端读取/获取发布的数据。 ... [详细]
    • Android日历提醒软件开源项目分享及使用教程
      本文介绍了一款名为Android日历提醒软件的开源项目,作者分享了该项目的代码和使用教程,并提供了GitHub项目地址。文章详细介绍了该软件的主界面风格、日程信息的分类查看功能,以及添加日程提醒和查看详情的界面。同时,作者还提醒了读者在使用过程中可能遇到的Android6.0权限问题,并提供了解决方法。 ... [详细]
    author-avatar
    吴秋仪6_913
    这个家伙很懒,什么也没留下!
    PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
    Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有