简单说说什么是OIDC 简单来说,OIDC是一个OAuth2上层的简单身份层协议。它允许客户端验证用户的身份并获取基本的用户配置信息。OIDC使用JSON Web Token(JWT)作为信息返回,通过符合OAuth2的流程来获取对应的TOKEN信息。
它的作用是为多个不同的站点提供登录功能(和SSO类似)。每次需要使用OIDC登录网站时,都会被重定向到登录的OpenID网站,然后再回到该网站。例如,如果选择使用Github帐户登录Grafana,这就使用了OIDC。成功通过Github身份验证并授权Grafana访问您的信息后,Github会将有关用户和执行的身份验证的信息发送回Grafana。此信息在JWT中返回,包含ID Token或者Access Token。
这样就实现了简单的登录流程,OIDC主要有以下几个作用:
1、OIDC的协议简化了登录的流程开发工作,在支持OIDC的应用简单配置即可使用
2、OIDC的协议有组别概念,可以限制用户可访问的资源内容
3、一个账号根据不同的资源权限访问不同的站点内容
如何配置Authelia来支持grafana通过OIDC登录 先看官方文档 ,官方文档写的还是比较详细的,创建一个OIDC应用,只需要在configuration.yml
的后面加上对应的配置即可,在本文中我以grafana配置为例,简单说明grafana使用Authelia来进行登录
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 identity_providers: oidc: hmac_secret: rc9uqHMWXf69M9TXrEfa2XoAtbXsbSGMvqWC access_token_lifespan: 1h authorize_code_lifespan: 1m id_token_lifespan: 1h refresh_token_lifespan: 90m enable_client_debug_messages: false enforce_pkce: public_clients_only cors: endpoints: - authorization - token - revocation - introspection allowed_origins: "*" allowed_origins_from_client_redirect_uris: false clients: - id: grafana description: grafana secret: GzPji9HrYbLQEX sector_identifier: '' public: false authorization_policy: two_factor pre_configured_consent_duration: '' audience: [] scopes: - openid - groups - email - profile redirect_uris: - https://grafana.abc.com/login/generic_oauth grant_types: - refresh_token - authorization_code response_types: - code response_modes: - form_post - query - fragment userinfo_signing_algorithm: none
这样一个很简单的配置,就让Authelia实现了自身作为OIDC的身份提供商供 grafana 这个应用登录访问。
我们可以直接访问到你的authelia的地址来查看登录需要配置的端点信息:https://auth.example.com/.well-known/openid-configuration
将对应的auth.example.com
换成你自己的域名。
如何配置Grafana来使用Authelia提供的OIDC进行登录 grafana 配置OIDC的登录官方也有完善的文档,但是我也遇到了一些小的坑点,所以我会在贴配置的同时,说明我遇到的坑点(其实是我菜)。
使用开源项目的对应功能,肯定第一步是看官方文档 ,官方文档还是写的比较详细,但是它是一个通用文档,我们需要根据实际情况做一下小的变更。
grafana使用docker-compose启动 我的grafana是使用docker-compose启动的,它的配置很简单:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 --- version: '3.3' services: grafana: image: grafana/grafana-oss:${grafana_version} networks: - gateway container_name: grafana command: - 'grafana-server --config /etc/grafana/grafana.ini' restart: unless-stopped env_file: .env volumes: - ./grafana.ini:/etc/grafana/grafana.ini - /data/grafana:/var/lib/grafana healthcheck: disable: false environment: - TZ=Asia/Shanghai ports: - 4000 :3000 networks: gateway: external: true ...
这时候需要复制grafana的默认配置文件 来写到grafana.ini
文件中了,数据库信息什么的配置。
注意我在这里碰到了一个坑点:当你需要启用对应的配置时候,需要将 ;
去掉,这样配置才能生效。(惯性思维是#
,突然来个;
号有点懵)。
grafana支持Authelia登录访问 grafana 的配置写的比较简单命令,其他配置忽略的情况下,以下几个配置就能支持到authelia的登录访问了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 root_url = https://grafana.abc.com disable_login_form = true [auth.generic_oauth ] enabled = true name = authelia allow_sign_up = true client_id = grafana client_secret = GzPji9HrYbLQEX scopes = openid profile groups email empty_scopes = false auth_url = https://auth.example.com/api/oidc/authorization token_url = https://auth.example.com/api/oidc/token api_url = https://auth.example.com/oidc/userinfo use_pkce = true
配置完成后重启grafana之后,再次访问grafana就可以看到你配置的authelia登录框了,成果如下:
总结 实际上我总共配置了三个client: outline 、portainer 这个参考官方文档 即可配置成功、grafana,除了grafana花费了些许时间之外(主要是我菜,配置没有去掉;
),其他两个配置都很简单。
现在authelia这个服务已经为我的数个网站提供登录保护支持,如果你有兴趣,可以与我一起交流探索更多的有趣的玩法,如果有遇到的一些问题欢迎一起探讨。