先声明一下定位:如果你已经跟着前两篇把 authentik 部署好了,这一篇就是干正事的。Portainer 的身份认证默认走的是它自己那套本地账号体系,机器少还好说,一旦团队里好几个人都要登录,你就得手动开账号、发密码、定期清理离职账号,操作多了全是隐患。把 authentik 和 Portainer 接起来之后,登录这件事就统一交给 authentik:用户在 authentik 上登录验证,Portainer 不再关心密码对不对,只认 authentik 给回来的身份凭证,管理员在 authentik 里统一管理账号和访问策略。
这篇核心讲三件事:一是搞清楚 Portainer 到底支持哪种身份认证协议、为什么选 OAuth、CE 版能做到什么程度;二是把 authentik 侧的 Provider 和 Application 配置、Portainer 侧十几个配置项逐个填对;三是在真实集成过程中最容易踩的坑,从无限重定向到 JWT 令牌安全,一条条排给你看。
1. 为什么偏偏绕不开 Portainer 的 OAuth:CE 版能做什么、不能做什么
1.1 Portainer 的身份认证选项就那几样,别想复杂了
Portainer 目前支持的身份认证方式大致有这么几类:本地账号(默认)、LDAP/AD、OAuth,以及商业版里才有的一些进阶集成。社区版(CE)虽然免费,但功能上并不寒酸,OAuth 这个能力 CE 是直接给到的,不需要你掏钱升级。你如果想跟 authentik 对接,走 OAuth/OIDC 是最省事的路线。
这里有个容易误解的点:很多人以为 authentik 只能当 OIDC 身份认证提供商,其实它也能提供 LDAP 服务。那为什么我不推荐你用 LDAP 去接 Portainer?因为 LDAP 接法解决的是"统一账号"问题,但你还需要额外去维护 DN、Base DN、绑定账号这些目录概念,配置链路长,调试时也不太直观;而 OAuth 走的是"重定向登录 + 返回身份声明"的路线,浏览器里点几下就能把流程跑通,对 Portainer 这种 Web 管理工具来说体验自然很多。更关键的是,authentik 的 LDAP 服务是通过 Outpost 组件实现的,多一个 Outpost 就多一个要维护的组件,没必要给一个小场景引入那么大复杂度。
1.2 OAuth 和 OIDC 的关系,一句话说清
OAuth 2.0 解决的是"授权"问题,OIDC(OpenID Connect)是在 OAuth 2.0 之上加了一层"身份认证"。authentik 对外提供的是标准 OIDC 兼容端点,Portainer 做 OAuth 登录时实际上是按 OAuth 2.0 的 Authorization Code 流程去跟 authentik 交互。这两者之间的细微差别会直接影响你在配置时看到的字段名:有些叫"Authorization URL",有些叫"Token Endpoint",本质上都是 OIDC Discovery 文档里那一组标准端点。
我建议你在动手前先在浏览器里打开 authentik 的 OIDC 配置发现地址,大概是这样的:
https://你的-authentik域名/application/o/portainer/.well-known/openid-configuration
这一段 JSON 会把这个 Provider 的上线端点全列出来,包括 authorization_endpoint、token_endpoint、userinfo_endpoint、jwks_uri。后面 Portainer 里要填的那几个 URL,直接从这里拷贝,比你自己凭记忆拼要靠谱得多。
1.3 一个必须接受的事实:CE 版 OAuth 默认不自动分配权限
很多新手集成完 OAuth 之后,满心欢喜地拿管理员账号去登录 Portainer,结果进去发现自己是个普通用户,一堆按钮是灰的,当场懵了。这里必须先给你打个预防针:Portainer CE 版通过 OAuth 登录的用户,默认都是标准用户(standard user),它不会因为你这个账号在 authentik 里是管理员就自动把 Portainer 的管理员角色给你。
Portainer 的管理员识别其实很朴素:它只认自己系统里被标记为 administrator 的本地用户。OAuth 用户第一次登录后会在 Portainer 里自动创建一个同名用户,这个用户的角色默认是标准用户。想把它变成管理员,你需要在 Portainer 的 "User" 列表里找到这个账号,手动编辑角色。
这个设计你会觉得笨,但换个角度想是合理的:Portainer 无法完全信任外部系统的角色语义。每个 IdP 返回的 group claim 长什么样都不一定,Portainer 干脆不做强绑定,把授权决定权留给你。想要全自动映射,那就得靠脚本或商业版功能,这个我在第 4 节展开说。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. authentik 侧的三步配置:Provider、Application、Redirect URI
2.1 先创建 Provider 还是先建 Application:顺序别搞反
在 authentik 新版本的管理后台里,导航栏左侧有 "Applications" 和 "Providers" 两个入口。你可以先建 Provider,再建 Application 并关联,也可以从 Applications 页面点 "Create" 走向导,里面同时创建 Provider。我第一次实操时卡过一下,因为早期版本里是直接在 Application 里内嵌 Provider,新版拆成两个独立对象了。你不管从哪个入口进去,最终状态都一样:一个 Provider 被一个 Application 引用,这个 Application 后面会出现在登录页面的来源列表里。
我建议命名尽量带环境标识,比如 portainer-prod,因为一个 authentik 实例完全可以给多套环境
