配置 OIDC 登录并映射管理员工组)
Dashy 如何用 Pocket IDPasskey配置 OIDC 登录并映射管理员工组【免费下载链接】dashy A self-hostable personal dashboard built for you. Includes status-checking, widgets, themes, icon packs, a UI editor and tons more!项目地址: https://gitcode.com/GitHub_Trending/da/dashy如果你的 Dashy 仪表盘想要用无密码的 Passkey 方式做单点登录而不是用户名/密码可以把 Pocket ID 作为 Dashy 的 OIDC 身份提供方Pocket ID 是一个基于 Passkey 的开源身份提供方单 Go 二进制 SQLiteDashy 通过标准 OIDC 授权码 PKCE 流程对接它。完成本文后打开 Dashy 会跳转到 Pocket ID 的登录页用 Passkey 验证身份后回到 Dashy同时属于指定 OIDC 组groupsclaim的用户被识别为 Dashy 管理员可以保存配置普通用户只能查看。前提与约束文档明确要求你需要能运行 Docker Compose 来部署 Pocket ID且 Dashy 已在本地运行默认http://localhost:4000可通过PORT环境变量修改。PasskeyWebAuthn要求安全上下文只有 HTTPS 或字面意义上的localhost主机名满足条件。pocketid.lvh.me、127.0.0.1这类地址都不行。本地测试用http://localhost:1411生产环境必须用真实域名的 HTTPS。三处 URL 必须完全一致同 scheme、host、portPocket ID 的APP_URL、Dashy 配置里的endpoint、浏览器实际访问 Pocket ID 的地址。APP_URL会被直接写进 OIDC issuer、Cookie 域和 WebAuthn relying party。完整操作路径部署 Pocket ID → 初始化首个管理员 → 创建 OIDC client 和 admin 组 → 在conf.yml启用 OIDC → 重启并验证。1. 部署 Pocket ID在 Pocket ID 所在的目录放一份docker-compose.yml以下 compose 为文档给出的最小示例name: dashy-pocketid services: pocket-id: image: ghcr.io/pocket-id/pocket-id:v2.7.0 restart: unless-stopped ports: - 1411:1411 environment: APP_URL: http://localhost:1411 TRUST_PROXY: false DB_PROVIDER: sqlite DB_CONNECTION_STRING: /data/pocket-id.db ENCRYPTION_KEY: local-dev-key-32-bytes-padding!! volumes: - ./data:/data healthcheck: test: [CMD, wget, -qO-, http://127.0.0.1:1411/healthz] interval: 10s timeout: 5s retries: 10 start_period: 30s几个关键环境变量的含义APP_URL浏览器访问 Pocket ID 的 URL必须与实际访问地址逐字符一致。ENCRYPTION_KEY必填至少 16 字节。示例值只用于本地测试生产环境用openssl rand -hex 32生成一个随机值。TRUST_PROXY本地为false放在反向代理后面时设为truePocket ID 才会信任转发头。生产建议反向代理终结 HTTPS、APP_URL改为如https://auth.example.com、DB_PROVIDER可换postgres提高冗余。启动并确认健康docker compose up -d pocket-id # 等到返回 healthy 再继续 curl -sf http://localhost:1411/healthz如果容器反复重启且日志报ENCRYPTION_KEY must be at least 16 bytes long把ENCRYPTION_KEY换成 16 字符以上的字符串即可。2. 初始化 Pocket ID 的首个管理员Pocket ID 没有环境变量引导方式。推荐通过 UI 完成浏览器打开http://localhost:1411设置向导会要求创建首个管理员username、email、name按提示注册一个 Passkey。如果无法注册 Passkey没有兼容设备或服务器是 headless文档给出了一条脚本路径往 SQLite 插入一个管理员用户再用 CLI 生成一次性登录 URL。注意该命令会在容器内安装 sqlite 包并向 Pocket ID 数据库写入一条用户记录属于对容器环境的一次性修改# admin-uuid-001 与用户信息为文档示例值请替换为你自己的 UUID、用户名和邮箱 docker compose exec pocket-id sh -c apk add --no-cache sqlite /dev/null 21 sqlite3 /data/pocket-id.db INSERT INTO users (id, created_at, updated_at, username, email, first_name, last_name, display_name, is_admin, email_verified) VALUES (\admin-uuid-001\, datetime(\now\), datetime(\now\), \pocketid-admin\, \adminexample.com\, \Pocket ID\, \Admin\, \Admin\, 1, 1); # username 替换为你刚插入的用户名 docker compose exec pocket-id /app/pocket-id one-time-access-token usernameCLI 会打印一个形如http://localhost:1411/lc/token的 URL在浏览器打开即完成登录。该 token 一次性使用且 1 小时内过期。登录后到Settings Passkeys注册 Passkey避免以后反复生成 OTA token。3. 创建 OIDC client 与 admin 组这两步决定了 Dashy 回调地址和管理员映射字段必须照抄创建 OIDC clientPocket ID 的Admin OIDC Clients Add OIDC ClientNameDashyCallback URLs同时填写两个——http://localhost:4000和http://localhost:4000/Pocket ID 按字符串精确匹配回调地址两个变体都要注册Logout Callback URLshttp://localhost:4000打开Public Client打开PKCE保存Pocket ID 会生成一个 UUID 形式的 client ID文档示例268a3701-e9ec-41f6-bad5-87c78ce87c94。复制下来下一步要用。注意如果 Dashy 端口不是 4000或 Dashy 实际跑在别的 scheme/host 上回调地址要与 Dashy 的真实访问地址一致否则会收到invalid_request。创建 admin 组Admin User Groups Add GroupNameDashy admins显示名随意Friendly nameadmins这个 friendly name 是关键Pocket ID 把它写进 OIDC token 的groupsclaimDashy 的adminGroup匹配的也是它而不是显示名。之后在Admin Users添加普通用户并在用户的Groups标签里把该用户加入admins组用户首次登录时设置 Passkey或者用上面的one-time-access-token命令给他们发一次性 URL。完成这三步后Pocket ID 应该具备一个 OIDC client、一个 admin 组、至少一个在组内的管理员用户。4. 在 Dashy 中启用 Pocket ID OIDC 登录编辑 Dashy 的user-data/conf.yml裸机部署下即./user-data/conf.yml参见 裸机部署文档appConfig: disableConfigurationForNonAdmin: true auth: enableOidc: true oidc: clientId: Pocket ID 生成的 UUID client ID endpoint: http://localhost:1411 adminGroup: admins scope: openid profile email groups各字段对应关系disableConfigurationForNonAdmin: true禁止非管理员读写配置文档推荐auth.enableOidc: true把认证模式设为 OIDCclientId上一步复制的 UUID。它是 UUID 字符串无需 YAML 引号若 client ID 是纯数字则必须加引号否则会失去精度导致匹配失败endpointPocket ID 的APP_URL必须逐字符一致。Dashy 会自行在其后拼接/.well-known/openid-configuration不要再手动加adminGroup组的friendly name这里是admins不是显示名scopegroups是必需的否则 id_token 里没有groupsclaim管理员判断失效。Pocket ID 在请求该 scope 时会默认发出 claim。改完必须重启 Dashy——服务端只在启动时读取auth.oidc配置热更新不会生效。如果 Pocket ID 在反向代理后面确保endpoint与APP_URL一致且 Dashy 容器能访问到endpoint。两个服务都在 Docker 里时要么放在同一网络用服务名互访要么用宿主机暴露的端口。5. 验证登录与管理员工组映射按文档描述的成功路径逐项核对打开 Dashy应被重定向到 Pocket ID 登录页用 Passkey 认证或粘贴一次性码后回到 Dashy。登录成功后Dashy 的 client、server 和 asset 端点全部被认证保护未登录请求/conf.yml只会拿到一个裁剪过的响应仅含auth块和最小pageInfo完整配置只对已认证用户下发。管理员映射验证用admins组内的用户登录并保存一次配置应成功非管理员用户保存配置会收到403且因为disableConfigurationForNonAdmin: true他们连配置编辑器都看不到仪表盘是只读的。按组控制可见性可选groupsclaim 进入 id_token 后可以在任意 page、section、item 的displayData下用showForGroups/hideForGroups按组显示或隐藏内容sections: - name: Internal Tools displayData: showForGroups: [admins] hideForGroups: [guests] items: - title: Hidden from interns displayData: hideForGroups: [interns]静默续期可选默认 token 过期后 Dashy 会重新走一遍 Pocket ID 登录。加上enableSilentRenew: true后Dashy 会自动追加offline_accessscope 并在后台用 refresh token 续期刷新失败时回落到正常登录流程。Pocket ID 一侧无需任何改动。6. 常见问题排查以下症状与处理方式均来自 Pocket ID 指南 的 Troubleshooting 部分WebAuthn is not supported in this browser或Cookie session has been rejectednon-HTTPS cookie cant be set as secure同一根因——WebAuthn 和 Pocket ID 的SecureCookie 都需要 HTTPS 或字面localhost。本地改用http://localhost:1411访问并同步APP_URL生产在 Pocket ID 前面终结 HTTPS。OTA 链接返回 Token is invalid or expiredOTA token 一次性使用且 1 小时过期重新执行docker compose exec pocket-id /app/pocket-id one-time-access-token username生成新链接上述 Cookie 被拒的问题也会让它看起来像 token 失效会话 Cookie 没存住。能登录但保存配置返回 403groupsclaim 没匹配上。依次检查conf.yml里的adminGroup是否等于组的friendly name用户是否真的在Admin Users [user] Groups里加入了该组从浏览器 localStorage 的ID_TOKEN键取出 id_token用在线 JWT 解码工具确认groupsclaim 的实际内容。invalid_requestredirect URI mismatchPocket ID 精确匹配回调 URL。确认 client 上同时注册了裸 URL 和带尾斜杠的变体且 scheme 与 Dashy 实际服务地址一致。Dashy 日志出现.well-known/openid-configuration的 fetch 错误、API 返回 401endpoint从 Dashy 容器内不可达。两个容器共享 Docker 网络并用服务名或用network_mode: service:pocket-id。可用docker exec dashy-container wget -qO- $ENDPOINT/.well-known/openid-configuration验证连通性dashy-container为 Dashy 容器名$ENDPOINT换成你配置里的 endpoint。服务端日志报unexpected iss claim valueissuer 不匹配。把APP_URL、conf.yml的endpoint、浏览器实际 URL 三者改成同一字符串含 scheme 和 port。打开 Pocket ID 只有登录框、没有 setup 向导数据库里已存在旧用户之前的实例留下的。要么用旧用户登录要么清空数据重来——docker compose down rm -rf data docker compose up -d这会删除 Pocket ID 的全部用户、组与 client 数据且data目录属主是容器用户清理时可能需要 sudo。登录后立刻 401报exp claim timestamp check failed时钟漂移Dashy 只允许 30 秒偏差。在两台宿主机上同步 NTP容器时钟跟随宿主机。改了clientId/endpoint/adminGroup/scope但行为没变服务端只在启动时读这些字段重启 Dashy 容器。更多 OIDC 侧的细节guest 访问、showLoginPage、PWA 与enableAuthProxyCompat的配合等可参考 OIDC 通用文档 与 Pocket ID 指南其中How it Works一节还给出了客户端/服务端认证管线的完整实现说明供二次开发参考。【免费下载链接】dashy A self-hostable personal dashboard built for you. Includes status-checking, widgets, themes, icon packs, a UI editor and tons more!项目地址: https://gitcode.com/GitHub_Trending/da/dashy创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考