使用 Grafana API 进行自动身份验证
Posted
技术标签:
【中文标题】使用 Grafana API 进行自动身份验证【英文标题】:Automatic Authentication using Grafana API 【发布时间】:2019-12-14 19:16:10 【问题描述】:在我的 Web 应用程序中,我希望能够将经过身份验证的用户从我的仪表板传递到 Grafana。
一旦用户使用凭据登录我的仪表板,我的应用程序上就会显示一个指向 Grafana 仪表板的链接。当用户单击该链接时,他/她将被重定向到 Grafana 页面并自动登录,而不显示 Grafana 登录页面。我不希望我的用户必须遇到第二个登录屏幕,他们会在输入什么用户名/密码时感到困惑。
我关注了Automatic login to grafana from web application、Auto login to grafana dashboard、Auto login to grafana from Web application using credentials or token 和Automatic login by token url,但没有运气。我找不到合适且干净的解决方案。
我正在使用安装在 Ubuntu Server 18.04 上的 Grafana v6.2.5。
我该如何实现它?任何帮助将不胜感激。
服务器详细信息:Ubuntu Server 18.04、Apache 2.4.29
【问题讨论】:
这看起来像是 SSO 的任务。到处使用 OIDC,问题就解决了。 如何整合它?我的应用程序是使用 php 7.0 开发的。 对于可能感兴趣的人,这里有一篇关于 node.js 实现反向代理的好文章。 techitmore.com/javascript/… 【参考方案1】:经过一番挖掘,我找到了使用 Grafana 的Generic OAuth Authentication 的解决方法。
第 1 步:创建包含以下代码的文件。
GrafanaOAuth.php
:
<?php
declare(strict_types=1);
class GrafanaOAuth
protected $user;
/**
* Create a new GrafanaOAuth instance.
* @param array $user
* @return void
*/
public function __construct(array $user)
$this->user = $user;
/**
* Redirect to authentication URL.
* @param string $state
* @return void
*/
public function auth(string $state): void
$state = urlencode($state);
$url = "http://localhost:3000/login/generic_oauth?state=$state&code=cc536d98d27750394a87ab9d057016e636a8ac31";
header("Location: $url");
/**
* User access token.
* @return void
*/
public function token(): void
$token = [
'access_token' => $this->user['access_token'],
'token_type' => 'Bearer',
'expiry_in' => '1566172800', // 20.08.2019
'refresh_token' => $this->user['refresh_token']
];
echo json_encode($token);
/**
* User credentials.
* @return void
*/
public function user(): void
$user = [
'username' => $this->user['username'],
'email' => $this->user['email']
];
echo json_encode($user);
oauth/auth.php
:
<?php
declare(strict_types=1);
require __DIR__ . '/../GrafanaOAuth.php';
/**
* Fetch the details of Grafana user from your database.
*/
$user = [
'username' => 'nbayramberdiyev',
'email' => 'nbayramberdiyev@outlook.com',
'dasboard_id' => 'oNNhAtdWz',
'access_token' => md5(uniqid('nbayramberdiyev', true)),
'refresh_token' => md5(uniqid('nbayramberdiyev', true))
];
(new GrafanaOAuth($user))->auth($_GET['state']);
oauth/token.php
:
<?php
declare(strict_types=1);
header('Content-Type: application/json');
require __DIR__ . '/../GrafanaOAuth.php';
/**
* Fetch the details of Grafana user from your database.
*/
$user = [
'username' => 'nbayramberdiyev',
'email' => 'nbayramberdiyev@outlook.com',
'dasboard_id' => 'oNNhAtdWz',
'access_token' => md5(uniqid('nbayramberdiyev', true)),
'refresh_token' => md5(uniqid('nbayramberdiyev', true))
];
(new GrafanaOAuth($user))->token();
oauth/user.php
:
<?php
declare(strict_types=1);
header('Content-Type: application/json');
require __DIR__ . '/../GrafanaOAuth.php';
/**
* Fetch the details of Grafana user from your database.
*/
$user = [
'username' => 'nbayramberdiyev',
'email' => 'nbayramberdiyev@outlook.com',
'dasboard_id' => 'oNNhAtdWz',
'access_token' => md5(uniqid('nbayramberdiyev', true)),
'refresh_token' => md5(uniqid('nbayramberdiyev', true))
];
(new GrafanaOAuth($user))->user();
custom.js
:
$(function()
'use strict';
if (location.pathname === '/login')
location.href = $('a.btn-service--oauth').attr('href');
);
第 2 步: 编辑 Grafana 配置文件,该文件位于 Ubuntu / Debian 上的 /etc/grafana/grafana.ini
、MAC 上的 /usr/local/etc/grafana/grafana.ini
、Windows 上的 <GRAFANA_PROJECT_FOLDER>/conf/custom.ini
。
取消注释这些行并输入您的client_id
、client_secret
、auth_url
、token_url
、api_url
:
#################################### Generic OAuth ##########################
[auth.generic_oauth]
;enabled = true
;name = OAuth
;allow_sign_up = false
;client_id = some_id
;client_secret = some_secret
;scopes = user:email,read:org
;auth_url =
;token_url =
;api_url =
像这样:
#################################### Generic OAuth ##########################
[auth.generic_oauth]
enabled = true
name = OAuth
allow_sign_up = false
client_id = YOUR_APP_CLIENT_ID
client_secret = YOUR_APP_CLIENT_SECRET
scopes = user:email,read:org
auth_url = http://foo.bar/oauth/auth.php
token_url = http://foo.bar/oauth/token.php
api_url = http://foo.bar/oauth/user.php
第 3 步:将custom.js
放入/usr/share/grafana/public/build/index.html
文件(Ubuntu / Debian)中<body>
标记的底部。
第 4 步:重启 Grafana 服务器。
sudo service grafana-server restart
(Ubuntu / Debian)
brew services restart grafana
(MAC)
例子和详细解释可以看我的Github repo。
【讨论】:
以上是关于使用 Grafana API 进行自动身份验证的主要内容,如果未能解决你的问题,请参考以下文章