3

在我的 Web 应用程序中,我想提供将经过身份验证的用户从我的仪表板传递到Grafana的能力。

一旦用户使用凭据登录我的仪表板,我的应用程序上就会显示一个指向 Grafana 仪表板的链接。当用户单击该链接时,他/她将被重定向到 Grafana 页面并自动登录,而不显示 Grafana 登录页面。我不希望我的用户必须遇到第二个登录屏幕,他们会因为输入的用户名/密码而感到困惑。

我已经按照Automatic login to grafana from web applicationAuto login to grafana dashboardAuto 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

4

1 回答 1

5

经过一番挖掘,我找到了使用 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 配置文件,该文件位于/etc/grafana/grafana.iniUbuntu / Debian、/usr/local/etc/grafana/grafana.iniMAC、<GRAFANA_PROJECT_FOLDER>/conf/custom.iniWindows 上。

取消注释这些行并输入您的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>

第四步:重启 Grafana 服务器。

  • sudo service grafana-server restart(Ubuntu / Debian)
  • brew services restart grafana(苹果电脑)

有关示例和详细说明,请查看我的Github 存储库

于 2019-08-19T19:02:16.233 回答