ARTICLE DETAIL

资讯详情

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

oauth2-proxy Google Provider 配置完全指南:从 OAuth 应用注册到组授权与 ADC 凭据

oauth2-proxy Google Provider 配置完全指南:从 OAuth 应用注册到组授权与 ADC 凭据 oauth2-proxy Google Provider 配置完全指南从 OAuth 应用注册到组授权与 ADC 凭据【免费下载链接】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导读本文以 oauth2-proxy 官方文档中 Google Provider 的配置章节为主体系统讲解如何将 Google 作为身份提供方IdP接入 oauth2-proxy 反向代理从 Google Cloud 控制台注册 OAuth 客户端、配置六类google-*启动参数到基于 Google 域内群组Group限制登录、使用 Application Default CredentialsADC/ Workload Identity / Workload Identity Federation 免密钥部署以及将组织 ID 用作首选用户名。阅读后你将能够独立完成 oauth2-proxy Google 的完整接入并理解其底层实现providers/google.go中的令牌兑换、群组成员校验与凭据获取原理。一、Google 是 oauth2-proxy 的默认 Provider在 oauth2-proxy 中Google 是默认的身份提供方当你不显式指定--provider时程序默认使用 Google 认证。对应地providers/google.go中的NewGoogleProvider在初始化时会为 ProviderData 填充一组 Google 专用默认值这一点可以从单测TestNewGoogleProviderproviders/google_test.go中直接得到验证属性默认值说明ProviderNameGoogle显示名称LoginURLhttps://accounts.google.com/o/oauth2/auth?access_typeoffline登录 URLaccess_typeoffline用于获取 refresh tokenRedeemURLhttps://www.googleapis.com/oauth2/v3/token令牌兑换 URLValidateURLhttps://www.googleapis.com/oauth2/v1/tokeninfo令牌校验 URLProfileURL空不通过 Profile API 获取用户信息改从 ID Token 解析Scopeprofile email默认 OAuth scope这些默认值定义在 providers/google.go 中的googleDefaultLoginURL、googleDefaultRedeemURL、googleDefaultValidateURL等包级变量中同时也允许你在启动参数中通过--login-url、--redeem-url等通用选项覆盖。二、Config OptionsGoogle 专属配置参数Google Provider 提供 6 组专属配置项同时支持命令行 Flag与TOML 配置文件两种写法对应结构体定义见 pkg/apis/options/legacy_options.goFlagToml 字段类型描述默认值--google-admin-emailgoogle_admin_emailstring用于模拟impersonate发起 Admin SDK API 调用的 Google 管理员邮箱无--google-groupgoogle_groupsstring仅允许登录指定 Google 群组的成员可多次指定。若未指定且配置了 service account 或默认凭据则允许该用户的所有群组无--google-service-account-jsongoogle_service_account_jsonstringservice account JSON 凭据文件的路径无--google-use-application-default-credentialsgoogle_use_application_default_credentialsbool使用 Application Default Credentials 代替 service account JSON例如 GKE Workload Identityfalse--google-target-principalgoogle_target_principalbool使用 ADC 时要模拟impersonate的目标 principalservice account默认取 ADC 配置的 service account--google-use-organization-idgoogle_use_organization_idbool使用组织 IDorganization id作为首选用户名false--google-admin-api-user-scopegoogle_admin_api_user_scopestring查询 Google Admin SDK 获取组织 ID 时使用的 OAuth scope可取readonly、user或cloudreadonly注原文档表中--google-target-principal的类型标注为 bool实际为 string目标 service account 邮箱使用时应传入 principal 标识其类型定义以 pkg/apis/options/providers.go 中的TargetPrincipal string为准。在 legacy 配置模式下这些 Flag 会在case google:分支中被映射进provider.GoogleConfig GoogleOptions{...}见 pkg/apis/options/legacy_options.go同时旧环境变量OAUTH2_PROXY_GOOGLE_GROUP已被废弃若使用会打印 deprecation 警告并自动迁移到OAUTH2_PROXY_GOOGLE_GROUPS。命令行配置示例oauth2-proxy \ --providergoogle \ --client-idXXXXX.apps.googleusercontent.com \ --client-secretXXXXXX \ --email-domainyourcompany.com \ --upstreamhttp://127.0.0.1:8080 \ --http-address0.0.0.0:4180 \ --cookie-secretXXXXXXXXXXXXXXXXXXXXXXXXXX \ --cookie-refresh1h其中--cookie-refresh1h是关键官方文档明确建议**用较短的会话刷新间隔1 小时**配合cookie-refresh设置让 oauth2-proxy 定期校验账户仍然处于授权状态如仍属于指定群组而不是长期信任已过期的会话。Alpha 配置YAML写法如果你使用 alpha 配置格式googleConfig对应的GoogleOptions字段名与语义定义在 pkg/apis/options/providers.go 以及 docs/versioned_docs/version-7.15.x/configuration/alpha_config.mdproviders: - id: google clientID: XXXXX.apps.googleusercontent.com clientSecret: XXXXXX googleConfig: group: [engineeringyourcompany.com] adminEmail: adminyourcompany.com serviceAccountJson: /etc/oauth2-proxy/creds.json # useApplicationDefaultCredentials: true # targetPrincipal: my-saproject.iam.gserviceaccount.com # useOrganizationID: true # adminAPIUserScope: readonly # readonly | user | clouduseOrganizationID与useApplicationDefaultCredentials的默认值均为false由EnsureDefaults()pkg/apis/options/providers.go统一补齐。三、Usage在 Google Cloud 控制台注册 OAuth 应用官方文档给出了完整的注册步骤这是任何 Google 接入的第一步创建新项目https://console.developers.google.com/project在右上角项目下拉框中选中刚创建的项目若当前选择的是其他项目。在项目 Dashboard 中心面板选择APIs Services。在左侧导航栏选择Credentials。在中心面板选择OAuth consent screen标签页填写Product name shown to users并保存。在中心面板选择Credentials标签页打开New credentials下拉框选择OAuth client ID类型选择Web applicationApplication name 可自由填写Authorized JavaScript origins填你的域名例如https://internal.yourcompany.comAuthorized redirect URIs填 oauth2-proxy 的回调地址即https://internal.yourcompany.com/oauth2/callback点击Create。记录下生成的Client ID与Client Secret分别用于--client-id与--client-secret。底层认证流程完成注册后oauth2-proxy 与 Google 的交互由 providers/google.go 的Redeem方法完成它向 RedeemURL 提交redirect_uri、client_id、client_secret、code、grant_typeauthorization_code以及启用 PKCE 时code_verifier拿到access_token、refresh_token、expires_in与id_token随后claimsFromIDTokenproviders/google.go对 ID Token 的 JWT 载荷做 base64 解码解析出sub、email、email_verified三个关键声明并要求 email 必须存在且已被验证否则兑换失败。这与 Google 文档中ID Token 内包含用户邮箱及验证状态的行为一致是 oauth2-proxy 不使用 Profile API 即可获得用户邮箱的原因。会话刷新则由RefreshSession/redeemRefreshTokenproviders/google.go实现携带 refresh token 换取新的 access token 与 id_token并在刷新成功后重新执行群组校验。四、Restrict auth将登录限制到指定 Google 域内群组可选若你的组织使用 Google Workspace原 G Suite可以将登录限制在特定群组内。官方文档给出的完整步骤如下创建 service account并配置为使用 Application Default Credentials / Workload Identity / Workload Identity Federation推荐 方式或直接下载 JSON 凭据文件。记录该 service account 的 Client ID 备用。在 APIs Auth 下选择 APIs。找到Admin SDK并点击Enable API。按照为 service account 设置域级委派的说明给第 2 步的 client id 授予以下 OAuth scopehttps://www.googleapis.com/auth/admin.directory.group.member.readonly按照 https://support.google.com/a/answer/60757 的说明启用 Admin API 访问权限。在 Gmail 域上创建或选择一个管理员邮箱赋给google-admin-email参数。该邮箱会被此 client 模拟impersonate用于调用 Admin SDK原因参见第 5 步链接中的说明。创建或选择一个邮件群组将其地址设为google-group参数。该参数可多次传递用户会被逐一与所有提供的群组比对属于任意一个即通过。仅当使用 JSON 凭据文件时收紧第 1 步下载的 JSON 文件权限确保只有 oauth2-proxy 进程能读取并将文件路径写入google-service-account-json参数。重启 oauth2-proxy。重要提示用户会在初始认证时以及每次令牌刷新时约每小时一次被与群组成员列表比对。这意味着被移出群组的用户最迟在下一个刷新周期即被拒绝访问而不是等到会话过期。群组校验的源码实现群组限制的核心逻辑在 providers/google.go 的configureGroups与setGroupRestrictionproviders/google.go中指定了--google-group时setGroupRestriction会为每个配置的群组调用userInGroup把用户命中的群组写入session.Groups并要求至少命中一个userInGroupproviders/google.go优先调用 Admin Directory 的Members.HasMemberAPI支持嵌套子群组判定若返回 400典型场景是成员邮箱与群组不在同一域名如memberotherdomain.com在groupmydomain.com中则退化为直接查询Members.Get且只有状态为ACTIVE的成员才算数排除 ARCHIVED / SUSPENDED / UNKNOWN若群组不存在404会记录错误日志并拒绝。反过来如果未指定任何群组但配置了 service account 或默认凭据populateAllGroupsproviders/google.go会通过Groups.List().UserKey(email)分页拉取该用户的全部群组写入session.Groups同时默认放行所有用户——这与文档表格中未指定群组则允许所有群组的描述一致。这一行为在测试用例中也有覆盖例如TestGoogleProviderGroupValidatorproviders/google_test.go验证了默认 validator 不做任何授权检查恒为 true。Admin SDK 客户端本身由getAdminServiceproviders/google.go创建它会依次尝试possibleScopesList中的 4 个目录 scopegroup.member.readonly → group.readonly → group.member → group用凭据换取 token遇到unauthorized_client错误就跳过下一个 scope全部失败则直接logger.Fatal提示凭据没有访问 admin API scope 的足够权限。五、Using Application Default Credentials (ADC) / Workload Identity / Workload Identity Federation推荐相比手工下载并保管 service account JSONGoogle 官方与 oauth2-proxy 文档都推荐使用 ADCApplication Default Credentials部署在 GCP 内oauth2-proxy 会自动使用绑定在资源如 GCE 实例上的 service account部署在 GKE可通过Workload Identity特性让 Pod 以指定 service account 身份运行按 Google 的 Workload Identity 指南配置即可部署在 GCP 之外可以考虑Workload Identity Federation将外部身份如 AWS、Azure、本地 CI映射为 GCP service account无需落盘 JSON 密钥。启用方式即设置--google-use-application-default-credentialstrue。此时凭据获取走getOauth2TokenSourceproviders/google.go中的impersonate.CredentialsTokenSource分支以--google-target-principal指定的 service account 为目标做模拟impersonate并携带--google-admin-email作为 Subject域级委派。target principal 的自动推导--google-target-principal可以不设置getTargetPrincipalproviders/google.go会自动从以下来源确定目标 principal优先级为显式配置的--google-target-principalADC 凭据 JSON 中的client_email字段运行在 GCE 上时通过元数据服务器metadata.EmailWithContext获取。三者都不可用时才会报错退出并提示用--target-principal覆盖注实际 Flag 名为--google-target-principal日志文案沿用了通用命名。六、Using Organization ID as Preferred Username可选默认情况下Google Provider 使用Google 内部 ID即 ID Token 的sub声明作为用户名。若你的下游应用更希望看到组织内的人类可读 ID如员工号来自 Directory 中externalIds类型为organization的值可以将--google-use-organization-id设为true。该功能要求查询 Admin SDK 的 service account 在第 4 节第 5 步之外额外被授予以下任一 scopehttps://www.googleapis.com/auth/admin.directory.user.readonlyhttps://www.googleapis.com/auth/admin.directory.userhttps://www.googleapis.com/auth/cloud-platform底层实现上启用该开关后NewGoogleProvider会为setPreferredUsername注入闭包providers/google.go通过getUserInfoproviders/google.go调用Users.Get(email)遍历用户的ExternalIds取出类型为organization的value作为session.PreferredUsername。同时查询所用的 scope 由--google-admin-api-user-scope控制默认readonly对应admin.directory.user.readonlygetAdminAPIUserScopeproviders/google.go将readonly/user/cloud分别映射为AdminDirectoryUserReadonlyScope、AdminDirectoryUserScope、CloudPlatformScope。若组织 ID 不存在getUserInfo会返回错误此时EnrichSessionproviders/google.go会将该错误向上传递导致认证失败——请确保目标用户已在 Directory 中维护了 organization 类型的外部 ID。七、配置核对清单接入完成后可按下表逐项自查配置项均可在 pkg/apis/options/legacy_options.go 与 providers/google.go 中找到对应实现需求需要配置的参数前置条件基本 Google 登录--providergoogle、--client-id、--client-secret、--email-domain已完成第 3 节的 OAuth 应用注册按群组限制登录--google-group可多个启用 Admin SDK、域级委派 scopeadmin.directory.group.member.readonly、--google-admin-email、service account 凭据免密钥部署GKE/GCP--google-use-application-default-credentialstrue、可选--google-target-principalWorkload Identity / ADC 环境就绪使用组织 ID 作用户名--google-use-organization-idtrue、--google-admin-api-user-scopeservice account 具备admin.directory.user.readonly等用户目录 scope且用户存在 organization 类型 ExternalId会话定期复查授权--cookie-refresh1h无官方建议完整的参数说明与使用步骤还可对照阅读当前版本源码对应的官方文档 docs/docs/configuration/providers/google.md 与 GoogleOptions 字段参考 docs/versioned_docs/version-7.15.x/configuration/alpha_config.md。至此你已经掌握了 oauth2-proxy 接入 Google 的全部要点注册 OAuth 客户端、配置专属参数、按群组做细粒度授权、用 ADC 消除密钥管理负担并将用户名替换为组织 ID。【免费下载链接】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),仅供参考
返回列表