authelia 配置 OIDC 服务及 OIDC 一些概念

修改配置

配置完成后, 可以通过 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 应用时所有数据从服务器后台交换,前端无法只得到一个临时的 code

implicit (隐式模式) 客户端(包括 web 页面端)直接得到 access_token , 不建议再使用

client_credentials (客户端凭证模式) 客户端直接填写 id 与 secrit,方便但不很安全, 如果是机器对机器 (M2M)之类后端服务还是安全的

device_code (设备码模式, 设备流程 (Device Flow) ) 客户端在某个链接定时刷新后端授权信息, 用户通过浏览器填写账号、密码或是扫码进行登录。一般输入受限设备比较常用, 比如电视、命令行物联网设备

refresh_token 返回刷新 token , 通过刷新 token 可以刷新新的 access_token,要设置 offline_access scope

‍‍

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 地址重写了

上一篇