十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

oauth2-proxy GitLab 认证提供者完整指南:配置、权限限制与源码实现解析

oauth2-proxy GitLab 认证提供者完整指南:配置、权限限制与源码实现解析 oauth2-proxy GitLab 认证提供者完整指南配置、权限限制与源码实现解析【免费下载链接】oauth2-proxyA reverse proxy that provides authentication with Google, Azure, OpenID Connect and many more identity providers.项目地址: https://gitcode.com/GitHub_Trending/oa/oauth2-proxyoauth2-proxy 内置的gitlab认证提供者让反代网关能够以 GitLabGitLab.com 或自建 GitLab作为身份认证源。本文围绕 oauth2-proxy 7.10.x 版本文档docs/versioned_docs/version-7.10.x/configuration/providers/gitlab.md展开完整覆盖 GitLab 应用的申请要点、最小可运行配置、--gitlab-group/--gitlab-project两类访问限制的用法并结合 GitLab 提供者源码实现 深入解析群组校验、项目级 API 查询与 token 自动追加read_apiscope 的底层机制帮助你在自建 GitLab 环境下稳定落地 oauth2-proxy 认证。GitLab 提供者在 oauth2-proxy 中的定位oauth2-proxy 支持多种身份提供者Google、Azure、OpenID Connect 等GitLab 是其中基于 OIDC 流程实现的提供者之一。从源码结构看提供者工厂函数 根据--provider的类型值分发实例化逻辑gitlab类型会调用NewGitLabProvider创建GitLabProvider// providers/providers.go case options.GitLabProvider: return NewGitLabProvider(providerData, providerConfig)GitLabProvider嵌入*OIDCProvider见 providers/gitlab.go因此 OIDC 的签发者校验、发现文档discovery等能力都可以直接复用。这一点在 providerRequiresOIDCProviderVerifier 中可以得到印证GitLabProvider被明确列为需要构建 OIDC Verifier 的提供者类型oauth2-proxy 会通过 OIDC 发现机制自动解析 GitLab 实例的认证端点。该提供者的专属配置项定义在 GitLabOptions 结构体 中type GitLabOptions struct { // Group sets restrict logins to members of this group Group []string yaml:group,omitempty // Projects restricts logins to members of these projects Projects []string yaml:projects,omitempty }配置选项参数一览文档给出的两个 GitLab 专属命令行参数如下对应 legacy_options.go 中的 flag 定义FlagTOML 字段类型说明默认值--gitlab-groupgitlab_groupsstring | list限制登录为以下任一群组slug的成员多个群组用逗号分隔无--gitlab-projectgitlab_projectsstring | list限制登录为以下任一项目的成员可多次指定格式为orgname/repoaccesslevel。access level 应为匹配 GitLab 访问等级的值缺省时默认为 20无两个参数均为stringSlice类型 flag支持多次指定或逗号分隔见 flag 注册代码。需要注意访问等级的取值约束源码中合法等级被硬编码为10Guest、20Reporter、30Developer、40Maintainer非法值会在启动阶段直接报错详见下文“项目级访问限制”一节。在 GitLab 中申请 OAuth 应用无论使用 GitLab.com 还是自建的 GitLab都需要先在 GitLab 中注册一个 OAuth 应用可参考 GitLab 官方文档的 “OAuth provider integration” 指引。申请时的关键要求启用 scope至少启用openid、profile、email三个 scope设置重定向 URL填为你应用的回调地址例如https://myapp.com/oauth2/callback项目过滤需要额外 scope如果后续要使用--gitlab-project做项目成员过滤请额外为应用加上read_apiscope。第 3 点值得注意源码中 oauth2-proxy 会在配置了项目限制时自动把read_api追加到请求 scope 中见下文但 GitLab 应用侧若没有预先启用该 scopetoken 兑换时仍会失败因此文档要求你在 GitLab 应用管理页提前勾选它。最小可运行配置文档给出的基础配置如下确保 OAuth 流程正常工作所需的最少参数--providergitlab --redirect-urlhttps://myapp.com/oauth2/callback // Should be the same as the redirect url for the application in gitlab --client-idGITLAB_CLIENT_ID --client-secretGITLAB_CLIENT_SECRET --cookie-secretCOOKIE_SECRET要点说明--redirect-url必须与 GitLab 应用中登记的重定向 URL 完全一致否则 OAuth 回调会被 GitLab 拒绝--cookie-secret用于加密会话 Cookie生成方法见 overview.md 的“Generating a cookie secret”章节。此外从 NewGitLabProvider 的初始化代码 可以看出GitLab 提供者的默认 scope 为openid email// providers/gitlab.go const ( gitlabProviderName GitLab gitlabDefaultScope openid email gitlabProjectPrefix project: ) if p.Scope { p.Scope gitlabDefaultScope }若你需要profile、read_api等其他 scope可通过通用的--scope参数显式指定此时会覆盖默认值。按 GitLab 群组限制登录限制登录范围为指定群组slug成员使用--gitlab-group--gitlab-groupmygroup,myothergroup # restrict logins to members of any of these groups (slug), separated by a comma其底层机制是NewGitLabProvider在初始化时调用provider.setAllowedGroups(opts.GitLabConfig.Group)把这些群组写入提供者的AllowedGroups白名单见 providers/gitlab.go。认证流程中GitLabProvider 的 EnrichSession 方法 会携带用户 access token 请求 GitLab 的/oauth/userinfo端点解析出nickname、email、email_verified、groups四个字段并填入会话// providers/gitlab.go type gitlabUserinfo struct { Nickname string json:nickname Email string json:email EmailVerified bool json:email_verified Groups []string json:groups }随后ProviderData.Authorize 会用通用的群组匹配逻辑做放行判断只要会话的Groups中任一项命中AllowedGroups即授权成功。同时EnrichSession还会校验邮箱验证状态——若--insecure-allow-unverified-email未开启未验证邮箱的用户会直接报错user email is not verified见 providers/gitlab.go。按项目成员资格限制登录access level--gitlab-project允许把登录范围进一步收敛到“特定项目上拥有足够访问等级的成员”。参数格式为namespace/projectaccesslevel例如--gitlab-projectmygroup/myproject # 默认要求 access level 20 (Reporter) --gitlab-projectmygroup/myproject30 # 要求 access level 30 (Developer) 及以上参数解析逻辑在 newGitlabProject// providers/gitlab.go func newGitlabProject(project string) (*gitlabProject, error) { const defaultAccessLevel 20 // see https://docs.gitlab.com/ee/api/members.html#valid-access-levels validAccessLevel : [4]int{10, 20, 30, 40} parts : strings.SplitN(project, , 2) if len(parts) 2 { lvl, err : strconv.Atoi(parts[1]) // ...校验 lvl 是否属于 {10,20,30,40}否则报错 // ... } return gitlabProject{Name: project, AccessLevel: defaultAccessLevel}, nil }行为特征不带accesslevel时默认要求等级20Reporter指定了等级但不在10/20/30/40之内启动时即报invalid gitlab project access level specified错误配置了任意项目限制后setProjectScope 会自动向 scope 追加read_api已存在则跳过这正是文档强调“需要项目过滤时请给 GitLab 应用加上read_apiscope”的源码依据解析出的项目会以project:namespace/project前缀形式加入AllowedGroups与群组白名单走同一套Authorize匹配逻辑。认证时的项目校验发生在 addProjectsToSessionoauth2-proxy 用用户的 access token 调用 GitLab REST APIGET /api/v4/projects/{url-encoded 项目路径}根据返回的permissions.project_access缺失时回退到permissions.group_access中的access_level与要求值比较达标才把project:xxx写入会话 Groups。几个值得注意的边界情况均有对应日志告警场景行为项目已归档archived为 true记日志project %s is archived并跳过该项目用户无任何项目级/组级权限记日志user %q has no project level access to %s并跳过用户等级低于要求记日志does not have the minimum required access level并跳过项目信息请求失败记 Warning 日志并继续检查其他项目不阻断登录流程本身会话刷新时GitLabProvider.RefreshSession 会先保存以project:为前缀的群组项再执行 OIDC 标准的 token 刷新刷新会用 id_token 的groupsclaim 覆盖s.Groups、用subclaim 覆盖用户名最后把项目项合并回去并去重——保证刷新后项目级授权不丢失。上述行为在 gitlab_test.go 中有系统性的表驱动测试覆盖包括 scope 自动追加openid email→openid email read_api、等级不足被拒绝、非法等级配置报错、刷新后project:thing等群组保留等场景。自建 GitLab 部署自托管 GitLab 时需要额外设置 OIDC 签发者地址使其指向你的 GitLab 实例 URL--oidc-issuer-urlyour gitlab urloauth2-proxy 会基于该地址做 OIDC 发现.well-known/openid-configuration解析出登录、令牌兑换、userinfo、JWKS 等端点。若完全关闭发现机制也可以通过--login-url、--redeem-url、--profile-url等通用参数手工指定各端点见 Provider 配置结构体 中各 URL 字段。子目录部署的额外注意如果你的自建 GitLab 部署在子目录例如domain.tld/gitlab而非独立子域名如gitlab.domain.tld可能需要添加一条从domain.tld/oauth指向domain.tld/gitlab/oauth的重定向。这是因为 GitLab 的 OAuth 端点挂在实例路径之下oauth2-proxy 的 OIDC 发现地址若只到domain.tld会找不到/oauth前缀下的端点。版本兼容性说明文档明确提示该认证提供者是对照 GitLab 12.X 版本测试的。由于 GitLab API 的变更在 12.X 之前的版本上可能无法正常工作参考上游问题 994。因此自建实例建议升级到 12.X 及以上再部署本提供者若你必须在旧版本上验证建议先用测试实例跑通登录、userinfo、/api/v4/projects三类调用再上生产本文内容以当前仓库源码oauth2-proxy 主干为准7.10.x 版本文档中的参数名与实现一致如升级到更新的文档版本如docs/docs/configuration/providers/gitlab.md配置项表格可能有细化建议对照阅读。配置示例汇总一个包含群组限制与项目限制的完整启动配置示例基于上述各节整合oauth2-proxy \ --providergitlab \ --oidc-issuer-urlhttps://gitlab.example.com \ --client-idGITLAB_CLIENT_ID \ --client-secretGITLAB_CLIENT_SECRET \ --cookie-secretCOOKIE_SECRET \ --email-domainexample.com \ --redirect-urlhttps://myapp.com/oauth2/callback \ --gitlab-groupmygroup,myothergroup \ --gitlab-projectmygroup/myproject30对应的 alpha 配置YAML/TOML写法中GitLab 专属项位于gitlabConfig下可参考 GitLabOptions 的 yaml tagproviders: - id: my-gitlab provider: gitlab clientID: GITLAB_CLIENT_ID clientSecret: GITLAB_CLIENT_SECRET loginURL: # 留空时使用 OIDC 发现 scope: openid email read_api gitlabConfig: group: - mygroup - myothergroup projects: - mygroup/myproject30以上参数与行为均可在 providers/gitlab.go 与 pkg/apis/options/providers.go 中逐一对照验证便于按实际部署环境做进一步定制与排查。【免费下载链接】oauth2-proxyA reverse proxy that provides authentication with Google, Azure, OpenID Connect and many more identity providers.项目地址: https://gitcode.com/GitHub_Trending/oa/oauth2-proxy创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表