Please check the build logs for more information.
See Builds for ideas on how to fix a failed build, or Metadata for how to configure docs.rs builds.
If you believe this is docs.rs' fault, open an issue.
TurboMCP Auth
OAuth 2.1 and authentication for TurboMCP with MCP protocol compliance.
Features
- OAuth 2.1 Flows - RFC 8707/9728/7591 compliant with PKCE support
- Authorization Code flow (with PKCE for public/confidential clients)
- Client Credentials flow (server-to-server)
- Token refresh and validation
- Multi-Provider Support - Google, GitHub, Microsoft, GitLab, Apple, Okta, Auth0, Keycloak (with provider-specific OAuth 2.1 configurations)
- OAuth2Provider - Full AuthProvider implementation for OAuth 2.1
- API Key Authentication - Simple API key-based authentication
- Server-Side Helpers - RFC 9728 Protected Resource Metadata and WWW-Authenticate headers
- Session Management - Secure token management with configurable storage
- DPoP Support - Optional RFC 9449 proof-of-possession tokens
- Comprehensive Validation - RFC 8707 canonical URI validation, token format validation
Quick Start
Client: OAuth 2.1 Authorization Code Flow
use ;
use ;
async
Server: Protecting a TurboMCP HTTP Server
turbomcp-server's Streamable HTTP transport implements MCP authorization
itself: configured with an HttpAuthorization, it serves RFC 9728 Protected
Resource Metadata, answers requests without a valid token 401 with a
WWW-Authenticate challenge, and puts the validated principal on the request
context. With the mcp-http-server feature, server::JwtBearerValidator
supplies the token check over this crate's JWT validator — signature, issuer,
expiry, and the audience validation MCP requires — plus required scopes:
use JwtValidator;
use JwtBearerValidator;
use ;
/// Pass to `turbomcp_server::transport::http::run_with_config(&handler, addr, &config)`.
Through the turbomcp crate, the same types are turbomcp::auth::jwt::JwtValidator
and turbomcp::auth::server::JwtBearerValidator (features auth and http).
Server: RFC 9728 Helpers for Other HTTP Stacks
For a server that is not built on turbomcp-server, the server module has the
pieces to assemble the same responses by hand:
use ;
// Serve Protected Resource Metadata at /.well-known/oauth-protected-resource
// Handle 401 Unauthorized responses
// Extract a bearer token and check its shape (this does not validate it)
Usage
[]
= "3.5.0"
# With DPoP support for enhanced security
= { = "3.5.0", = ["dpop"] }
# With tokio runtime
= { = "1", = ["full"] }
= { = "1", = ["v4"] }
Feature Flags
Defaults: ["api-key", "oauth2"].
Core authentication methods:
api-key(default) — API key authenticationoauth2(default) — OAuth 2.1 flowsjwt— JWT validation helperscustom— Custom auth provider traits
Advanced:
dpop— RFC 9449 DPoP token binding (pulls inturbomcp-dpop)rbac— Role-based access control helpers
Token lifecycle:
token-refresh— Automatic token refreshtoken-revocation— Token revocation (RFC 7009)
Observability:
metrics— Metrics collection (counters, histograms)tracing-ext— Extended tracing
Middleware:
middleware— Tower middleware supporttower— Alias formiddleware
MCP 2025-11-25 draft authorization:
mcp-ssrf— SSRF protection (implied bymcp-cimdandmcp-oidc-discovery)mcp-cimd— Client ID Metadata Documents (SEP-991)mcp-oidc-discovery— OIDC Discovery 1.0 / RFC 8414mcp-incremental-consent— Incremental scope consent via WWW-Authenticate (SEP-835)mcp-http-server—server::JwtBearerValidatorforturbomcp-server's HTTP authorization
Bundles:
full— All of the above
Supported Providers
TurboMCP Auth supports all major OAuth 2.1 providers with pre-configured endpoints and scopes:
| Provider | Type | Scopes | Support | Notes |
|---|---|---|---|---|
| Social | openid, email, profile |
✅ Full OAuth 2.1 | PKCE required | |
| GitHub | Social | user:email, read:user |
✅ Full OAuth 2.1 | Token refresh via offline_access |
| Microsoft | Enterprise | openid, profile, email, User.Read |
✅ Full OAuth 2.1 | Azure AD integrated |
| GitLab | Self-Hosted | read_user, openid |
✅ Full OAuth 2.1 | Self-hosted compatible |
| Apple | Identity | openid, email, name |
✅ Full OAuth 2.1 | Requires response_mode=form_post |
| Okta | Enterprise | openid, email, profile |
✅ Full OAuth 2.1 | Enterprise SSO ready |
| Auth0 | Identity Platform | openid, email, profile |
✅ Full OAuth 2.1 | Unified identity management |
| Keycloak | Open Source OIDC | openid, email, profile |
✅ Full OAuth 2.1 | Self-hosted OIDC provider |
| Generic | Custom | Configurable | ✅ Full OAuth 2.1 | Any OIDC-compliant provider |
All providers support:
- ✅ PKCE (RFC 7636) - Automatic proof key generation
- ✅ Token refresh - Automatic and manual refresh
- ✅ Resource Indicators (RFC 8707) - MCP server binding
- ✅ Protected Resource Metadata (RFC 9728) - Server-side discovery
- ✅ DPoP optional (RFC 9449) - Token binding for enhanced security
Provider Examples
The provider is the second argument to OAuth2Client::new, with an
OAuth2Config like the one in the Quick Start:
use ;
use OAuth2Client;
Architecture
Core Components
-
OAuth2Client (
oauth2::OAuth2Client)- Authorization Code flow with PKCE (RFC 7636)
- Client Credentials flow (server-to-server)
- Token refresh and validation
- Provider-specific configurations for:
- Social Login: Google, GitHub
- Enterprise: Microsoft, Okta, Keycloak
- Identity Platforms: Apple, Auth0
- Custom: Generic provider with configurable endpoints
-
OAuth2Provider (
providers::OAuth2Provider)- Implements AuthProvider trait
- Token validation via userinfo endpoint
- Token caching and refresh management
- Integration with authentication manager
-
AuthManager (
manager::AuthManager)- Coordinates multiple authentication providers
- Stateless authentication (MCP compliant)
- Token validation on every request
-
Server Helpers (
server::*)JwtBearerValidator- Token validation forturbomcp-server's HTTP authorization (mcp-http-server)ProtectedResourceMetadataBuilder- RFC 9728 metadata generationWwwAuthenticateBuilder- RFC 9728 401 response headersBearerTokenValidator- Token extraction and format checks
RFC Compliance
- RFC 7636 - PKCE (Proof Key for Public OAuth Clients)
- RFC 7591 - Dynamic Client Registration Protocol
- RFC 8707 - Resource Indicators for OAuth 2.0
- RFC 9728 - OAuth 2.0 Protected Resource Metadata
- RFC 9449 - DPoP (optional, via
turbomcp-dpop)
Examples
Run the examples to see the implementations in action:
# OAuth 2.1 Authorization Code Flow
# Protected Resource Server with RFC 9728
# Tower middleware: rate limiting (requires --features middleware)
Security Best Practices
- Use HTTPS - Always use HTTPS for redirect URIs and token endpoints
- PKCE - Automatically enabled for Authorization Code flow (RFC 7636)
- Token Storage - Tokens are never logged or serialized unnecessarily
- Constant-Time Comparison - Token validation uses constant-time comparison
- DPoP - Enable DPoP feature for enhanced security (RFC 9449)
- Scope Validation - Always validate token scopes server-side
- Short Expiration - Use short-lived access tokens with refresh tokens
Testing
License
MIT