业务系统与Grafana进行菜单集成

Grafana支持多种认证方式,包括基本认证、OAuth2、LDAP等。为了集成您自己的登录系统,您可能需要使用Grafana的OAuth2服务器或JWT(JSON Web Token)认证插件,本文主要介绍通过JWT方式与Grafana进行菜单集成。Grafana版本为10.0

1.修改Grafana配置文件grafana.ini

[auth.jwt]
enabled = true
header_name =  jwt_token
username_claim = sub
# JWT签名认证文件的路径,即为上面的jwks.json文件存放路径,这里放在安装路径的conf文件夹下
jwk_set_file = /etc/grafana/jwks.json
cache_ttl = 60m
expect_claims = {"iss": "xxxxxxxxxxxxx"} #必须和生成token的值一样
auto_sign_up = true
url_login = true
allow_assign_grafana_admin = true

2.使用以下地址生成JWK

使用https://mkjwk.org/生成JWK

复制生成的shared key set 到文件jwks.json中,jwks.json文件内容如下:

{
    "keys": [
        {
            "kty": "oct",
            "use": "sig",
            "kid": "dL1y2NhzGXV18rFrd0Y57VG2pCOY00IftNKjipOESlA",
            "k": "Tv1bLjjLOmahUVfJCcmRIVhfNtm6mJ-zEngYFNmHKGCC2uMbE29DlDbEX295RwyyuTSAoxIypGpYkoUmL-VEJg1A__jNdbKPqFnPsRa2z7p5pnZgqvLaxaw-Bgx5LrtpCUGSFMOJKvDMB8OfrCqXpD8IgjVwkhzbcpjwQZ2JWNQfzQH5-JqlDMqVvjqsfJ2JFozX2igKirvYO_8QBOg-zuvLLgcyyW4Nw207drz5rMo0E14N5cHfypN7AO5y4ac0F_OnfA2LSPuACCcLdDOCVZaZgBCcp2KeIZ8KZdD1QEkLgleGvq5QUgZbIoXH59p7Xpt7QUjhX2z5xNghAblyxg",
            "alg": "HS256"
        }
    ]
}

3.修改后重启Grafana,让配置信息生效

4.使用JAVA生成JWT

        <dependencies>
        <!-- Spring Web -->
        <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- JWT 支持 -->
        <dependency>
        <groupId>io.jsonwebtoken</groupId>
        <artifactId>jjwt-api</artifactId>
        <version>0.11.5</version>
        </dependency>
        <dependency>
        <groupId>io.jsonwebtoken</groupId>
        <artifactId>jjwt-impl</artifactId>
        <version>0.11.5</version>
        <scope>runtime</scope>
        </dependency>
        <dependency>
        <groupId>io.jsonwebtoken</groupId>
        <artifactId>jjwt-jackson</artifactId>
        <version>0.11.5</version>
        <scope>runtime</scope>
        </dependency>
        </dependencies>
/**
type参数是指grafana的登录用户名,
grafana 有三种权限Admin、Editor、Viewer,针对三种角色创建了3个账号分别是
admin\editor\viewer,针对页面集成情况,调用接口时分别传不同参数,生成有对应角色的token
此方式业务系统账号,并非和grafana一一对应
**/
public  String createJwtToken(String type) {
    	//上面json文件中的kid
         String kid="dL1y2NhzGXV18rFrd0Y57VG2pCOY00IftNKjipOESlA"
         //上面json文件中的k
         String SECRET_KEY="Tv1bLjjLOmahUVfJCcmRIVhfNtm6mJ-zEngYFNmHKGCC2uMbE29DlDbEX295RwyyuTSAoxIypGpYkoUmL-VEJg1A__jNdbKPqFnPsRa2z7p5pnZgqvLaxaw-Bgx5LrtpCUGSFMOJKvDMB8OfrCqXpD8IgjVwkhzbcpjwQZ2JWNQfzQH5-JqlDMqVvjqsfJ2JFozX2igKirvYO_8QBOg-zuvLLgcyyW4Nw207drz5rMo0E14N5cHfypN7AO5y4ac0F_OnfA2LSPuACCcLdDOCVZaZgBCcp2KeIZ8KZdD1QEkLgleGvq5QUgZbIoXH59p7Xpt7QUjhX2z5xNghAblyxg"   
         SecretKey secretKey =  Keys.hmacShaKeyFor(Base64.getUrlDecoder().decode(SECRET_KEY));
        long currentTimeMillis = System.currentTimeMillis();
        Map<String, Object> extraHeaders = new HashMap<>();
        //把kid放入到请求头中
        extraHeaders.put("kid", kid);
        extraHeaders.put("type", "JWT");
        return Jwts.builder()
                .setHeaderParams(extraHeaders)
                //账号
                .claim("sub", type)
                //与服务器时间不一致,避免时间校验失败,所以当前时间减去1小时,如果时间一致无需此操作
                .claim("iat", (currentTimeMillis - 1*60*60*1000) /1000)
                .claim("exp", (currentTimeMillis + 2*60*60*1000) /1000)
                 //与grafana.ini配置文件中 expect_claims 值一样
                .claim("iss", "xxxxxxxxxxxxx")
                .signWith(secretKey, SignatureAlgorithm.HS256)
                .compact();
    }
```java
或者使用原生JWTAPI生成token
public String createToken(String type) {
    // 2. 生成 JWT Token
    Algorithm algorithm = Algorithm.HMAC256(Base64.getUrlDecoder()
            .decode(secretKey));
    Map<String, Object> headers = Maps.newHashMap();
    headers.put("kid", kid);
    Instant nowInstant = Instant.now();
    String token = JWT.create().withHeader(headers).withSubject(type).withIssuer(SYSTEM_NAME)
            .withExpiresAt(new Date(nowInstant.plus(1, ChronoUnit.HOURS).toEpochMilli()))
            .withIssuedAt(new Date(nowInstant.minus(1, ChronoUnit.HOURS).toEpochMilli()))
            .sign(algorithm);
    log.trace("");
    return token;

}
4.生成的token在下面地址进行解码测试

JWT校验地址https://jwt.io/

5.使用生成的token

使用生成的token拼接在url后面,然后与业务系统进行集成,<font color="red">**需要特别注意url中参数名必须是auth_token**</font>

http://127.0.0.1:3000/d/d9f843c0-3998-4d0b-9289-4f6dcdfc2cec/new-dashboard?orgId=1&auth_token=eyJraWQiOiJHS1pwV3cwR3E4VnFJQ2l1Z2N4RWNQTTRHdVVUMEZnTnhjV281SlhfQTZnIiwidHlwIjoiSldUIiwiYWxnIjoiSFMyNTYifQ.eyJzdWIiOiJieS1kZXYtdXNlciIsIm5hbWUiOiJieS1kZXYtdXNlciIsImlhdCI6MTcxNDExODQyMSwiZXhwIjoyNzE0MTI1NjIxLCJpc3MiOiJodHRwczovL215LXRva2VuLWlzc3VlciIsIm9yZyI6ImJ5Iiwicm9sZSI6IlZpZXdlciJ9.m-G9pHfoWxzkAKOd3E6F_IbSsjpzYcZwUE0OvKFCNWM
posted @   山那边风景  阅读(11)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
点击右上角即可分享
微信分享提示