flake, rm clerk dep
This commit is contained in:
@@ -37,7 +37,12 @@ if TYPE_CHECKING:
|
||||
|
||||
|
||||
class R2RProviders(BaseModel):
|
||||
auth: R2RAuthProvider | SupabaseAuthProvider | JwtAuthProvider | ClerkAuthProvider
|
||||
auth: (
|
||||
R2RAuthProvider
|
||||
| SupabaseAuthProvider
|
||||
| JwtAuthProvider
|
||||
| ClerkAuthProvider
|
||||
)
|
||||
database: PostgresDatabaseProvider
|
||||
ingestion: R2RIngestionProvider | UnstructuredIngestionProvider
|
||||
embedding: (
|
||||
|
||||
@@ -67,7 +67,12 @@ class R2RProviderFactory:
|
||||
),
|
||||
*args,
|
||||
**kwargs,
|
||||
) -> R2RAuthProvider | SupabaseAuthProvider | JwtAuthProvider | ClerkAuthProvider:
|
||||
) -> (
|
||||
R2RAuthProvider
|
||||
| SupabaseAuthProvider
|
||||
| JwtAuthProvider
|
||||
| ClerkAuthProvider
|
||||
):
|
||||
if auth_config.provider == "r2r":
|
||||
r2r_auth = R2RAuthProvider(
|
||||
auth_config, crypto_provider, database_provider, email_provider
|
||||
|
||||
@@ -1,4 +1,9 @@
|
||||
from .auth import ClerkAuthProvider, JwtAuthProvider, R2RAuthProvider, SupabaseAuthProvider
|
||||
from .auth import (
|
||||
ClerkAuthProvider,
|
||||
JwtAuthProvider,
|
||||
R2RAuthProvider,
|
||||
SupabaseAuthProvider,
|
||||
)
|
||||
from .crypto import (
|
||||
BcryptCryptoConfig,
|
||||
BCryptCryptoProvider,
|
||||
|
||||
@@ -1,6 +1,11 @@
|
||||
from .clerk import ClerkAuthProvider
|
||||
from .jwt import JwtAuthProvider
|
||||
from .r2r_auth import R2RAuthProvider
|
||||
from .supabase import SupabaseAuthProvider
|
||||
from .clerk import ClerkAuthProvider
|
||||
|
||||
__all__ = ["R2RAuthProvider", "SupabaseAuthProvider", "JwtAuthProvider", "ClerkAuthProvider"]
|
||||
__all__ = [
|
||||
"R2RAuthProvider",
|
||||
"SupabaseAuthProvider",
|
||||
"JwtAuthProvider",
|
||||
"ClerkAuthProvider",
|
||||
]
|
||||
|
||||
@@ -1,12 +1,16 @@
|
||||
import logging
|
||||
import os
|
||||
from datetime import datetime
|
||||
from typing import Dict, Any
|
||||
|
||||
from clerk_backend_api.jwks_helpers.verifytoken import verify_token, VerifyTokenOptions
|
||||
from core.base import AuthConfig, TokenData
|
||||
from core.base.abstractions.exception import R2RException
|
||||
from core.base import (
|
||||
AuthConfig,
|
||||
CryptoProvider,
|
||||
EmailProvider,
|
||||
R2RException,
|
||||
TokenData,
|
||||
)
|
||||
|
||||
from ..database import PostgresDatabaseProvider
|
||||
from .jwt import JwtAuthProvider
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
@@ -18,16 +22,43 @@ class ClerkAuthProvider(JwtAuthProvider):
|
||||
It uses Clerk's SDK to verify the JWT token and extract user information.
|
||||
"""
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
config: AuthConfig,
|
||||
crypto_provider: CryptoProvider,
|
||||
database_provider: PostgresDatabaseProvider,
|
||||
email_provider: EmailProvider,
|
||||
):
|
||||
super().__init__(
|
||||
config=config,
|
||||
crypto_provider=crypto_provider,
|
||||
database_provider=database_provider,
|
||||
email_provider=email_provider,
|
||||
)
|
||||
try:
|
||||
from clerk_backend_api.jwks_helpers.verifytoken import (
|
||||
VerifyTokenOptions,
|
||||
verify_token,
|
||||
)
|
||||
|
||||
self.verify_token = verify_token
|
||||
self.VerifyTokenOptions = VerifyTokenOptions
|
||||
except ImportError as e:
|
||||
raise R2RException(
|
||||
status_code=500,
|
||||
message="Clerk SDK is not installed. Run `pip install clerk-backend-api`",
|
||||
) from e
|
||||
|
||||
async def decode_token(self, token: str) -> TokenData:
|
||||
"""
|
||||
Decode and verify the JWT token using Clerk's verify_token function.
|
||||
|
||||
|
||||
Args:
|
||||
token: The JWT token to decode
|
||||
|
||||
|
||||
Returns:
|
||||
TokenData: The decoded token data with user information
|
||||
|
||||
|
||||
Raises:
|
||||
R2RException: If the token is invalid or verification fails
|
||||
"""
|
||||
@@ -37,27 +68,27 @@ class ClerkAuthProvider(JwtAuthProvider):
|
||||
status_code=500,
|
||||
message="CLERK_SECRET_KEY environment variable is not set",
|
||||
)
|
||||
|
||||
|
||||
try:
|
||||
# Configure verification options
|
||||
options = VerifyTokenOptions(
|
||||
options = self.VerifyTokenOptions(
|
||||
secret_key=clerk_secret_key,
|
||||
# Optional: specify audience if needed
|
||||
# audience="your-audience",
|
||||
# Optional: specify authorized parties if needed
|
||||
# authorized_parties=["https://your-domain.com"]
|
||||
)
|
||||
|
||||
|
||||
# Verify the token using Clerk's SDK
|
||||
payload = verify_token(token, options)
|
||||
|
||||
payload = self.verify_token(token, options)
|
||||
|
||||
# Check for the expected claims in the token payload
|
||||
if not payload.get("sub") or not payload.get("email"):
|
||||
raise R2RException(
|
||||
status_code=401,
|
||||
message="Invalid token: missing required claims"
|
||||
status_code=401,
|
||||
message="Invalid token: missing required claims",
|
||||
)
|
||||
|
||||
|
||||
# Create user in database if not exists
|
||||
try:
|
||||
await self.database_provider.users_handler.get_user_by_email(
|
||||
@@ -72,11 +103,11 @@ class ClerkAuthProvider(JwtAuthProvider):
|
||||
first_name = payload.get("first_name", "")
|
||||
last_name = payload.get("last_name", "")
|
||||
name = payload.get("name")
|
||||
|
||||
|
||||
# If name not directly provided, try to build it from first and last names
|
||||
if not name and (first_name or last_name):
|
||||
name = f"{first_name} {last_name}".strip()
|
||||
|
||||
|
||||
await self.database_provider.users_handler.create_user(
|
||||
email=payload.get("email"),
|
||||
account_type="external",
|
||||
@@ -87,16 +118,16 @@ class ClerkAuthProvider(JwtAuthProvider):
|
||||
raise R2RException(
|
||||
status_code=500, message="Failed to create user"
|
||||
) from e
|
||||
|
||||
|
||||
# Return the token data
|
||||
return TokenData(
|
||||
email=payload.get("email"),
|
||||
token_type="bearer",
|
||||
exp=datetime.fromtimestamp(payload.get("exp")),
|
||||
)
|
||||
|
||||
|
||||
except Exception as e:
|
||||
logger.info(f"Clerk token verification failed: {e}")
|
||||
raise R2RException(
|
||||
status_code=401, message="Invalid token", detail=str(e)
|
||||
) from e
|
||||
) from e
|
||||
|
||||
@@ -88,7 +88,6 @@ core = [
|
||||
"uvicorn >=0.27.0.post1,<0.28.0",
|
||||
"vecs >=0.4.0,<0.5.0",
|
||||
"xlrd >=2.0.1,<3.0.0",
|
||||
"clerk-backend-api >=1.8.0,<2.0.0",
|
||||
]
|
||||
|
||||
[dependency-groups]
|
||||
|
||||
+1
-1
@@ -35,7 +35,7 @@ rag_tools = ["search_file_descriptions", "search_file_knowledge", "get_file_cont
|
||||
research_tools = ["rag", "reasoning", "critique", "python_executor"]
|
||||
|
||||
[auth]
|
||||
provider = "r2r"
|
||||
provider = "clerk"
|
||||
access_token_lifetime_in_minutes = 60000
|
||||
refresh_token_lifetime_in_days = 7
|
||||
require_authentication = false
|
||||
|
||||
Reference in New Issue
Block a user