业务系统与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
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战