ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

oauth2-proxy 接入 DigitalOcean 身份提供商(OAuth 应用配置与源码实现解析)

oauth2-proxy 接入 DigitalOcean 身份提供商(OAuth 应用配置与源码实现解析) oauth2-proxy 接入 DigitalOcean 身份提供商OAuth 应用配置与源码实现解析【免费下载链接】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 中接入 DigitalOcean 作为 OAuth 身份提供商IdP包括在 DigitalOcean 控制台创建 OAuth 应用、获取 Client ID 与 Client Secret、配置命令行参数或配置文件以及回调 URLRedirect URL的匹配规则。结合仓库源码与测试用例本文还将深入剖析 DigitalOcean 提供商的默认端点、Scope、邮箱获取与 Token 校验实现帮助你理解认证流程的底层原理并完成可落地的部署。一、前置准备注册 DigitalOcean OAuth 应用要使用 DigitalOcean 作为身份提供商首先需要在 DigitalOcean 控制台创建一个 OAuth 应用。官方文档给出的完整步骤如下进入 Create a new OAuth application 中的第 1 步。填写应用基本信息Name名称、Homepage主页、Description描述可以按需任意填写不影响认证流程。配置 Application callback URL应用回调地址填入https://oauth-proxy/oauth2/callback其中oauth-proxy需要替换为 oauth2-proxy 实际运行所在的主机名。该 URL 必须与 oauth2-proxy 配置的 Redirect URL 完全一致否则授权流程会因回调地址不匹配而失败。记录凭据创建完成后保存页面展示的Client ID和Client Secret后续配置 oauth2-proxy 时需要使用。提示回调地址中的/oauth2/callback是 oauth2-proxy 固定的回调路径DigitalOcean 端登记的主机名需要与最终用户访问 oauth2-proxy 时的 Host 头或显式指定的--redirect-url保持一致。二、最小可用配置命令行方式DigitalOcean 提供商在 oauth2-proxy 中的类型标识为digitalocean通过--provider参数即可启用。创建好 OAuth 应用后使用以下命令行选项启动 oauth2-proxy--providerdigitalocean --client-idClient ID --client-secretClient Secret--providerdigitalocean选择 DigitalOcean 身份提供商ProviderType 定义见 pkg/apis/options/providers.go。--client-id上一步在 DigitalOcean 控制台获取的 Client ID。--client-secret上一步获取的 Client Secret。Redirect URL 的默认值与自定义如果不显式指定oauth2-proxy 默认使用https://requested host header/oauth2/callback作为回调地址即自动采用请求到达时的 Host 头拼接/oauth2/callback。若需要固定回调地址例如 DigitalOcean 应用登记的主机名与请求 Host 不一致或经过反向代理转发后 Host 被改写可以使用--redirect-url显式覆盖例如--redirect-urlhttps://internalapp.yourcompany.com/oauth2/callback对应配置项说明可参见 docs/docs/configuration/overview.mdflag 为--redirect-url、TOML 键为redirect_url同时可通过--relative-redirect-urlTOMLrelative_redirect_url默认false开启相对重定向支持。该地址必须与 DigitalOcean 应用登记的回调 URL 完全匹配。三、配置文件方式等效配置除命令行参数外也可以在配置文件中写入等价选项。以.cfg格式为例参考仓库附带的 contrib/oauth2-proxy.cfg.example 中的通用写法provider digitalocean client_id Client ID client_secret Client Secret # 可选显式指定回调地址与 DigitalOcean 应用登记的 callback URL 保持一致 # redirect_url https://oauth-proxy.example.com/oauth2/callback启动时通过--config/path/to/oauth2-proxy.cfg加载即可。两种方式完全等价配置文件更适合将凭据与启动参数集中管理。四、认证流程与默认端点源码级解析DigitalOcean 提供商在仓库中由 providers/digitalocean.go 实现类型为DigitalOceanProvider其结构基于通用的ProviderDatatype DigitalOceanProvider struct { *ProviderData }在NewDigitalOceanProvider构造函数中providers/digitalocean.go通过setProviderDefaults设置了该提供商的全套默认值并通过makeOIDCHeader设置请求头Bearer Token 方式。默认端点如下端点类型默认 URL用途LoginURL授权端点https://cloud.digitalocean.com/v1/oauth/authorize引导用户前往 DigitalOcean 授权页面RedeemURL令牌交换端点https://cloud.digitalocean.com/v1/oauth/token用授权码换取 Access TokenProfileURL用户资料端点https://api.digitalocean.com/v2/account获取账户邮箱ValidateURL令牌校验端点https://api.digitalocean.com/v2/account校验 Access Token 是否有效Scoperead默认申请的最小读取权限以上默认值在 providers/digitalocean_test.go 的TestNewDigitalOceanProvider测试中被逐一断言验证ProviderName 为DigitalOcean、Scope 为read同时TestDigitalOceanProviderOverridesproviders/digitalocean_test.go验证了这些端点可通过ProviderData字段覆盖。完整的认证流程如下用户登录引导oauth2-proxy 调用GetLoginURL通用实现见 providers/provider_default.go基于默认 LoginURL 构造授权地址并附加client_id、redirect_uri、state等参数将用户重定向至https://cloud.digitalocean.com/v1/oauth/authorize。回调与令牌交换用户授权后 DigitalOcean 重定向回/oauth2/callbackoauth2-proxy 使用授权码调用Redeem默认实现见 providers/provider_default.go向https://cloud.digitalocean.com/v1/oauth/token发起POSTapplication/x-www-form-urlencoded携带redirect_uri、client_id、client_secret、code、grant_typeauthorization_code换取 Access Token存入会话。获取邮箱GetEmailAddressproviders/digitalocean.go携带Authorization: Bearer AccessToken请求 ProfileURLhttps://api.digitalocean.com/v2/account从响应的account.email字段解析出用户邮箱若会话中缺少 Access Token 或响应中缺少account.email字段则返回错误。会话校验ValidateSessionproviders/digitalocean.go调用通用的validateTokenproviders/internal_util.go以 Bearer Token 请求 ValidateURL即账户端点HTTP 状态码为 200 时视为 Token 有效空 Token、请求失败或非 200 状态均返回false。相关行为在 providers/digitalocean_test.go 中有完整测试覆盖TestDigitalOceanProviderGetEmailAddress验证从{account: {email: userexample.com}}中正确解析邮箱TestDigitalOceanProviderGetEmailAddressFailedRequest验证 Access Token 非法时返回错误TestDigitalOceanProviderGetEmailAddressEmailNotPresentInPayload验证响应中缺少邮箱字段时返回错误。另外从 providers/providers.go 的providerRequiresOIDCProviderVerifier可以看出DigitalOcean 提供商不属于需要 OIDC Provider Verifier 的类型即不依赖 OIDC Discovery / JWKS 校验 ID Token其会话有效性完全依靠账户端点对 Access Token 的校验。这一点也解释了为何 DigitalOcean 提供商的配置只需client-id/client-secret无需指定issuer-url等 OIDC 专属参数。五、授权范围Scope与注意点DigitalOcean 提供商的默认 Scope 为read见 providers/digitalocean.go 中的digitalOceanDefaultScope即只申请读取账户信息的权限满足获取邮箱与校验 Token 的最小需求。如需调整 Scope可在配置中通过--scope或配置文件中的scope覆盖默认值构造函数接受外部传入的ProviderData.Scope测试TestDigitalOceanProviderOverrides已演示将 Scope 覆盖为profile的场景。仓库 docs/docs/configuration/providers/index.md 提示并非所有提供商都支持全部 Claims例如preferred_username目前仅 OpenID Connect 提供商支持。DigitalOcean 提供商主要依赖account.email获取用户标识若需按邮箱域或具体邮箱授权可配合--email-domain、--authenticated-emails-file等通用选项使用。六、快速核对清单完成 DigitalOcean 接入后可按以下清单自检DigitalOcean 控制台的 Application callback URL 与 oauth2-proxy 的--redirect-url或默认的https://host/oauth2/callback完全一致--providerdigitalocean、--client-id、--client-secret三项均已正确配置命令行或配置文件二选一服务可从 oauth2-proxy 所在主机访问https://cloud.digitalocean.com与https://api.digitalocean.com授权、换 Token、取账户信息均依赖外网可达登录后会话可通过/oauth2/callback正常回调并能通过账户端点成功校验 Access Token 与解析邮箱。按以上步骤操作后你的应用即可通过 DigitalOcean 账户完成统一身份认证并在其背后享受 oauth2-proxy 提供的会话管理、授权过滤等能力。【免费下载链接】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),仅供参考
返回列表