因为 lldap 中没有头像 url 属性, 只有头像图片的二进制内容, 所以写了一个微服务,用一个带用户 email 的链接表示。 所以有以下需求
-
在 authelia 从 lldap 中得到用户 email 后可以动态拼接出一个链接,
-
登录完成后传入的 id_token 中可以传出这个头像链接
查了手册可以在 lldap 的配置中将属性传出到 authelia 属性(其实 mail 默认已经赋值给 email 了); 然后可以定义一个 authelia 属性表示头像链接, 属性值使用表达式计算出(拼接一个带 email 地址的链接);配置 oidc , 在输出 id_token 中带入该头像链接
-
如何自定义属性及 claim :
https://www.authelia.com/integration/openid-connect/openid-connect-1.0-claims/#custom-claims -
authelia 属性值:
https://www.authelia.com/reference/guides/attributes/
# 1. 将 ldap 的属性映射到 authelia 属性
# 下面使用 2 种映射, 一种使用扩展了新的属性, 一种映射到已有的属性
authentication_backend:
ldap:
implementation: 'lldap'
# 属性映射
attributes:
extra:
mail: # extra 下是扩展新属性, 将 ldap 中的 mail 属性加载到一个 authelia 的自定义属性 extra_x_email 中
name: 'extra_x_email'
multi_valued: false
value_type: 'string'
mail: 'email' # 直接写为映射到 authelia 内置属性,我看手册中方向可能是写反了,我这么写就正常了。将 lldap mail 属性映射到 authelia email 中
# 定义一个 authelia 属性,该属性可使用表达式计算
definitions:
user_attributes:
x_avatar: # 定义一个名为 x_avatar 的属性, 使用下面的表达式
# expression: '"https://api.xapi.fun/api/ldap/avatar/x"' # 如果我使用固定值,能正常工作,可以输出到 id_token 属性
expression: '"https://api.xapi.fun/api/ldap/avatar/" + email' # 这里定义一个拼接链接作为头像 url ,使用 authelia 内置属性就能正常工作
# expression: '"https://api.xapi.fun/api/ldap/avatar/" + extra_x_email' # 这里拼接链接作为头像 url,使用 lldap 中的扩展属性,不报错,但是不会输出
# 定义 oidc 的 id_token 输出内容, 有点复杂
# 要定义待输出的 claim
# 定义一个(些) scope 授权可以查这些 claim
# 定义输出的 id_token 中带这些 claim
# 定义客户端可以使用这个(些)scope
# 定义一个 claims_policies 下定制一个策略,下面例子取名为 default 的策略, key 为策略名
# oidc.claims_policies.default.custom_claims 下定义要输出的 claim , key 为 claim 名, attribute 为对应的 authelia 属性(扩展属性或是内置属性)
# oidc.claims_policies.default.id_token 中定义获取 id_token 时可以输出哪些 claim,如果不定义默认只有很少几个属性,而且没有对应的授权(scope)时也不会输出
# oidc.scopes 下定义一个 scope ,定义该授权可以查询哪些 claim, 可以将上面的 claim 都列出
# oidc.clients.scopes 中定义该客户端可以申请哪些 scope,将自定义的 scope 名称写进去,下面的例子为 extended_scope
# 客户端登录时申请的 scope 如果带上了 extended_scope, 那返回的 id_token 中就会带有对应的 claim
identity_providers:
oidc:
claims_policies:
# 创建一个名为 "default" 的默认策略
default:
# 定义 id_token 中可以返回哪些 claim, 如果不自定义 id_token 的话,仅返回少数几个属性
id_token: ['picture', 'rat', 'groups', 'email', 'email_verified', 'alt_emails', 'preferred_username', 'name', 'x_email', 'x_avatar']
custom_claims:
x_avatar: # 创建 "x_avatar" claim, 使用 definitions 中定义的 authelia 属性
attribute: 'x_avatar'
email: # 创建 email claim ,使用 a, uthelia 内置属性
attribute: 'email'
picture: # 创建 picture claim , 值为 authelia 定义属性
attribute: 'x_avatar'
x_email: # 创建一个名为 "x_email" 的自定义属性, 映射扩展属性, 使用 ldap.attributes.attributes.mail.extra_x_email
attribute: 'extra_x_email'
scopes:
extended_scope: # 定义一个 scope,定义使用该 scope 授权时可以查询哪些 claim
claims:
- 'email'
- 'picture'
- 'x_email'
- 'x_avatar'
clients:
- client_id: 'iox-linkedin-app'
claims_policy: 'default'
# 定义客户端可以申请哪些 scopes
scopes: ['openid', 'profile', 'email', 'groups', 'offline_access', 'extended_scope' ]