OAuth 2.0授权服务器

一个基于Quarkus构建的最小化OAuth 2.0授权服务器,支持动态客户端注册、授权码+PKCE、刷新令牌轮换、ES256访问令牌和Google OIDC登录等功能,适用于Google Cloud环境。

  • by consolidando
  • Java
  • 本地部署
  • 更新于
在 GitHub 查看 consolidando/mcp-oauth

使用说明

OAuth😎

📌 概述

MCP客户端的最低OAuth 2.0授权服务器,使用Quarkus构建。它支持:

  • 动态客户端注册(DCR)
  • 授权码+PKCE(S256)
  • 通过旋转刷新令牌
  • 带有JWKS发布的ES256访问令牌
  • 谷歌OIDC登录
  • 用户、客户端、身份验证请求、身份验证代码和刷新令牌的Firestore持久性

此服务设计为作为独立的身份验证服务器运行,独立于API和MCP服务器。它直接针对谷歌云(Cloud Run+Firestore)。

有关该项目的更多信息,请访问 https://diy.elmolidelanoguera.com/2026/01/un-servidor-de-autenticacion-con-google.html.

⚙️ 环境配置

.env.example 列出此项目使用的不在存储库中的环境变量。复制到 .env 并填写实际值。如何装载 .env 这取决于你的操作系统。这 .env 文件未提交。这 .bat 用于设置环境或部署的助手是示例,必须适应您的系统。

核心OAuth

  • EMP_OAUTH_ISSUER:此身份验证服务器的公共颁发者URL。
  • EMP_OAUTH_DEFAULT_RESOURCE:默认资源/受众(如果未提供)。
  • EMP_OAUTH_AUTH_CODE_TTL_SECONDS:身份验证代码生存期(秒)。
  • EMP_OAUTH_AUTH_REQUEST_TTL_SECONDS:挂起的身份验证请求生存期(秒)。
  • EMP_OAUTH_ACCESS_TOKEN_TTL_SECONDS:访问令牌生存期(秒)。
  • EMP_OAUTH_REFRESH_TOKEN_TTL_SECONDS:刷新令牌生存期(秒)。
  • EMP_OAUTH_AUTO_CONSENT:如果 true,登录后跳过同意屏幕。
  • EMP_OAUTH_CONSENT_BRAND_NAME:同意页面上显示的品牌文本。
  • EMP_OAUTH_CLEANUP_CLIENTS_INACTIVE_DAYS:在清理删除客户端之前,处于非活动状态的天数。

钥匙和JWKS(ES256)

  • EMP_OAUTH_PUBLIC_KEY_PATH:ES256公钥PEM的路径。
  • EMP_OAUTH_PRIVATE_KEY_SECRET:ES256私钥的密钥管理器资源。
  • EMP_OAUTH_PRIVATE_KEY_PATH:ES256私钥PEM的本地回退。
  • EMP_OAUTH_KEY_ID: kid 用于JWKS和JWT标头。

谷歌OIDC

  • EMP_GOOGLE_CLIENT_ID:OAuth客户端ID。
  • EMP_GOOGLE_CLIENT_SECRET:OAuth客户端机密。
  • EMP_GOOGLE_REDIRECT_URI:必须是 https://<issuer>/oauth/google/callback.
  • EMP_GOOGLE_AUTH_ENDPOINT:谷歌身份验证端点。
  • EMP_GOOGLE_TOKEN_ENDPOINT:谷歌令牌端点。
  • EMP_GOOGLE_JWKS_URI:谷歌JWKS端点。
  • EMP_GOOGLE_SCOPE:登录的OAuth作用域。

四大

  • EMP_OAUTH_FIRESTORE_ENABLED:启用Firestore支持的存储。
  • EMP_OAUTH_FIRESTORE_USERS_COLLECTION:用户集合名称。
  • EMP_OAUTH_FIRESTORE_CLIENTS_COLLECTION:客户端集合名称。
  • EMP_OAUTH_FIRESTORE_AUTH_CODES_COLLECTION:身份验证码集合名称。
  • EMP_OAUTH_FIRESTORE_AUTH_REQUESTS_COLLECTION:授权请求集合名称。
  • EMP_OAUTH_FIRESTORE_REFRESH_TOKENS_COLLECTION:刷新令牌集合名称。

部署助手(可选)

  • EMP_PROJECT_ID:GCP项目id。
  • EMP_REGION:云运行区域。
  • EMP_SERVICE_NAME:云运行服务名称。
  • EMP_REPO_NAME:工件注册表仓库名称。
  • EMP_IMAGE_NAME:Docker镜像名称。
  • EMP_IMAGE_TAG:Docker镜像标签。

🚀 部署步骤(本机)

设置GCP项目

  gcloud config set project %PROJECT_ID%

构建本机二进制文件

  .\mvnw.cmd package -Dnative -DskipTests -Dquarkus.native.container-build=true

构建Docker镜像

  docker build -f src/main/docker/Dockerfile.native -t %REGION%-docker.pkg.dev/%PROJECT_ID%/%REPO_NAME%/%IMAGE_NAME%:%IMAGE_TAG% .

推送Docker镜像

  docker push %REGION%-docker.pkg.dev/%PROJECT_ID%/%REPO_NAME%/%IMAGE_NAME%:%IMAGE_TAG%

部署到云端运行

  gcloud run deploy %SERVICE_NAME% --image %REGION%-docker.pkg.dev/%PROJECT_ID%/%REPO_NAME%/%IMAGE_NAME%:%IMAGE_TAG% --region %REGION% --platform managed --allow-unauthenticated --env-vars-file env-vars.yaml

🧹 清理端点

呼叫 POST /oauth/cleanup 从计划作业中删除过期的身份验证请求、已使用/过期的身份认证代码和刷新令牌,以及在配置的天数内处于非活动状态的客户端。目前,它没有受到保护;如果需要,可以考虑在生产中保护它。

📎 参考文献

⚖ 许可证

该项目根据 CC BY-NC-ND 4.0 许可证。看 许可证 文件以获取详细信息。