修改配置
配置完成后, 可以通过 https://auth.xapi.fun/.well-known/openid-configuration 得到 OpenID Connect Discovery(OIDC 发现文档) 。
identity_providers:
oidc:
# jwt 签名密钥, 强制建议配置, `openssl rand -hex 64` 或是 `docker run --rm authelia/authelia:latest authelia crypto rand --length 64 --charset alphanumeric` 生成
hmac_secret: ...
## JSON Web 签名密钥(必须提供一个 RSA(RS256))
jwks:
# openssl genrsa -out authelia_oidc.pem 2048; cat authelia_oidc.pem
- key_id: 'default' # 一般不需要提供
algorithm: 'RS256' # 必须有一个是 RS256
key: |
-----BEGIN RSA PRIVATE KEY-----
...
-----END RSA PRIVATE KEY-----
claims_policies:
## Creates the 'default' claims policy.
# 定义要返回的 id_token 策略:https://www.authelia.com/integration/openid-connect/openid-connect-1.0-claims/#custom-claims
default:
id_token: ['picture', 'rat', 'groups', 'email', 'email_verified', 'alt_emails', 'preferred_username', 'name']
# https://www.authelia.com/configuration/identity-providers/openid-connect/provider/
# 使用 https://auth.xapi.fun/.well-known/openid-configuration 获取配置
clients:
# docker run --rm authelia/authelia:latest authelia crypto rand --length 72 --charset rfc3986
- client_id: 'iox-linkedin-app'
client_name: 'iox linkedin app'
claims_policy: 'default' # 使用哪个策略返回 id_token
# docker run --rm authelia/authelia:latest authelia crypto hash generate pbkdf2 --variant sha512 --random --random.length 72 --random.charset rfc3986
# 得到密码及hash 值,有可能客户端填写密码,client_secret 填空 hash 值, 有空试一下
# client_secret: '...' # 公共客户端(public = true)不校验 secret,需要留空
public: true # 如果为 true,则必须不需要声明 client_secret, 而且默认开启 PKCE
authorization_policy: 'one_factor'
redirect_uris:
# 客户端使用时, 不建议直接使用随机端口,而是列一个使用范围
- 'http://127.0.0.1:61000/callback'
- 'http://127.0.0.1:61001/callback'
- 'http://127.0.0.1:61002/callback'
- 'http://127.0.0.1:61003/callback'
- 'http://127.0.0.1:61004/callback'
- 'https://oidcdebugger.com/debug' # 为了在 oidcdebugger.com 中进行测试,但只支持测试到第一步, 拿到 code
- 'https://openidconnect.net/callback' # 专门为了给 https://www.openidconnect.net/# 测试使用,但是不支持 pkce, 要关闭它 (enforce_pkce:never )
scopes: ['openid', 'profile', 'email', 'groups', 'offline_access']
grant_types: ['authorization_code', 'refresh_token']
scope
定义授权的范围
offline_access 得到返回 refresh_token 的授权, 有了 refresh_token 就可以刷新新的 access_token 值
opeinid 得到返回用户信息的授权会返回 id_token (jwt 格式), 其它返回内容通过 profile, email 等参数设置;它是 OIDC 开关,没有的话,就是纯授权的 oauth2 , 有了该授权可以得到用户授权信息上升为 身份认证 OIDC 协议。
profile 得到用户基础信息授权,一般为名称、头像、性别之类的, 由服务商定义
email, groups, 返回指定具体的信息授权
grant_types
定义授权的流程方式
authorization_code (授权码模式) 返回验证通过后的 code (OIDC 时还会有一个
id_token), 通过 code 可以返回调用的 access_token 值,最完整的授权流程。web 应用时所有数据从服务器后台交换,前端无法只得到一个临时的 codeimplicit (隐式模式) 客户端(包括 web 页面端)直接得到 access_token , 不建议再使用
client_credentials (客户端凭证模式) 客户端直接填写 id 与 secrit,方便但不很安全, 如果是机器对机器 (M2M)之类后端服务还是安全的
device_code (设备码模式, 设备流程 (Device Flow) ) 客户端在某个链接定时刷新后端授权信息, 用户通过浏览器填写账号、密码或是扫码进行登录。一般输入受限设备比较常用, 比如电视、命令行物联网设备
refresh_token 返回刷新 token , 通过刷新 token 可以刷新新的 access_token,要设置
offline_accessscope
id_token
当 scope 包括 opeinid 时,会直接返回 id_token , 但默认 authelia 在返回的 id_token 中不带用户信息,需要显式打开(我的测试是这样的)
需要 identity_providers.oidc.claims_policies 定义一个策略, 然后在 identity_providers.oidc.clients.claims_policy 引用该策略, 不然返回的id_token 中是不带用户信息的
其它可用 claim 值见 https://www.authelia.com/integration/openid-connect/openid-connect-1.0-claims/#custom-claims
因为我配置的是 lldap 在后端提示用户信息,所以根据需要还要将一些 lldap 属性映射到claim 属性, 但是注意 lldap 中的头像是一个二进制图片, 不是 url , 不能映射到 picture (头像)
这是曾经用过的 ldap 属性到 autoelia 属性映射配置,jpegPhoto 的映射会报错, group_name 本身已经有了, 不用配置映射,所以有其它属性映射需求的时候,再试试看
ldap:
# 自定义属性映射
attributes:
display_name: 'displayName'
# picture: 'jpegPhoto' # 或存储 URL 的字段名 , lldap 中头像是二进制图像, 无法直接映射到 picture
group_name: 'cn' # 组的名字取 cn 字段
member_of: 'memberOf' # 必须在这里定义,Authelia 才能从 LLDAP 拿到组
如果事后要查看用户信息, 可以调用 curl -H "Authorization: Bearer <你的access_token>" https://auth.xapi.fun/api/oidc/userinfo 进行查看
测试方案
oidcdebugger.com
在线工具, 还比较方式, 但只发第一次请求,并得到反馈参数, 还需要在其它工具中使用参数进行进一步测试
需要设置
redirect_uris加入https://oidcdebugger.com/debug
openidconnect.net
在线工具,不支持
pkce需要服务端关闭该参数,可能有点麻烦需要设置
redirect_uris加入https://openidconnect.net/callback
step-cli
客户端工具, 只能测试 127.0.0.1 的回调,支持测试整个流程
调用文档:
https://smallstep.com/docs/step-cli/reference/oauth/
step oauth --client-id iox-linkedin-app --provider https://auth.xapi.fun --scope "openid profile email groups offline_access" --listen ':61000' --listen-url http://127.0.0.1:61000/callback
# --listen ':61000' 需要指定监听地址, 要与服务端允许端口一致
# 要分组信息的时间,要记得 scope 中加上 groups
返回的 id_token 可以在 https://www.jwt.io/ 中查看
本地应用
本地应用需要跳转到 127.0.0.1, 如果发现被强制跳转到 https://127.0.0.1 的地址,那么请检查一下 nginx 的配置,一般是它将返回的 location 地址重写了