You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于React(TS)、FastAPI的Okta SSO集成后续步骤咨询

完整流程指南:Okta SPA + FastAPI 后端认证

一、是否需要为后端创建Okta应用?

必须创建。你需要在Okta控制台新增一个API类型的应用(而非SPA),步骤如下:

  • 进入Okta控制台 → 应用 → 创建应用 → 选择“API”类型
  • 配置API的Audience(例如https://your-api-domain.com,该值需与后端验证时的audience完全一致)
  • 关联你的SPA应用:在API应用的“授权”标签下,添加你的SPA应用作为授权客户端,确保允许的grant types包含authorization_code和implicit(适配SPA的认证流程)

二、前端传递认证令牌到后端的正确方式

前端登录后,通过@okta/okta-auth-js获取Access Token(注意:ID Token用于前端身份识别,Access Token才是专门给API调用做授权的):

  1. 登录成功后,调用authClient.getAccessToken()获取令牌
  2. 向后端发起API请求时,将令牌放在请求头的Authorization字段中,格式示例:
    // 用axios发起请求的示例
    const accessToken = await authClient.getAccessToken();
    axios.get('/api/protected', {
      headers: {
        'Authorization': `Bearer ${accessToken}`
      }
    });
    

三、后端用okta-jwt-verifier-python验证令牌并获取用户信息

1. 安装依赖

pip install okta-jwt-verifier python-jose[cryptography]

2. 编写验证逻辑(FastAPI依赖项)

创建可复用的令牌验证依赖,替代临时中间件:

from okta_jwt_verifier import AccessTokenVerifier
from fastapi import HTTPException, Security
from fastapi.security import HTTPBearer, HTTPAuthorizationCredentials
from jose import jwt

# 替换为你的Okta配置参数
OKTA_ISSUER = "https://your-okta-domain.com/oauth2/default"
OKTA_API_AUDIENCE = "https://your-api-domain.com"  # 对应API应用的Audience
OKTA_CLIENT_ID = "your-api-app-client-id"  # API应用的Client ID

security = HTTPBearer()

async def verify_access_token(credentials: HTTPAuthorizationCredentials = Security(security)):
    token = credentials.credentials
    
    try:
        # 验证令牌的签名、有效期、audience等核心属性
        verifier = AccessTokenVerifier(issuer=OKTA_ISSUER, audience=OKTA_API_AUDIENCE)
        await verifier.verify(token)
        
        # 解析令牌payload获取用户信息(无需再次验签,已通过verifier验证)
        payload = jwt.decode(token, options={"verify_signature": False})
        return payload
    except Exception as e:
        raise HTTPException(status_code=401, detail=f"Invalid token: {str(e)}")

3. 在API路由中使用验证逻辑

from fastapi import FastAPI, Depends

app = FastAPI()

@app.get("/api/protected")
async def protected_route(user_info: dict = Depends(verify_access_token)):
    return {
        "message": "Access granted",
        "user_details": {
            "user_id": user_info["sub"],
            "email": user_info.get("email"),
            "full_name": user_info.get("name")
        }
    }

四、解决FastAPI Swagger界面无法测试的问题

通过配置OpenAPI安全方案,让Swagger支持Bearer Token认证:
上述代码中已经使用HTTPBearer()定义了安全方案,配置完成后,Swagger页面(/docs)会出现“Authorize”按钮,点击后输入Bearer <你的Access Token>,即可正常测试受保护的API接口。

关键注意事项

  • 务必使用Access Token调用API:Access Token的audience是你的API应用,ID Token的audience是SPA应用的Client ID,用错令牌会导致后端验证失败。
  • Okta Issuer格式需准确:一般为https://your-okta-domain.com/oauth2/{authorization-server-id},默认授权服务器的ID是default。
  • 确保后端能访问Okta的JWKS端点({issuer}/v1/keys):okta-jwt-verifier会自动从该端点获取公钥完成令牌签名验证,无需手动配置公钥。

内容的提问来源于stack exchange,提问作者Andrey Yakir

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 19:58:35