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

如何为AWS Lambda应用配置基于Okta的无额外成本SAML认证

最简单的无额外成本Okta SSO集成方案(适用于小型Lambda应用)

针对你的需求,最直接且零额外成本的方案是基于Okta的OpenID Connect(OIDC)标准,直接在Lambda中实现令牌验证逻辑,完全无需依赖Amazon Cognito或其他付费服务,步骤如下:

1. 在Okta配置OIDC应用

  • 登录Okta管理后台,创建一个Web应用程序(如果是单页前端则选“单页应用”)
  • 设置登录回调URL:如果是API Gateway触发Lambda,填前端页面的URL;如果用Lambda直接URL,填Lambda的访问地址(注意配置CORS)
  • 记录三个关键信息:客户端ID、Okta域名(如your-company.okta.com)、授权服务器的元数据地址(默认是https://<your-okta-domain>/.well-known/openid-configuration)
  • 若为少数员工使用,可在Okta应用的“分配”页面直接添加允许访问的员工账号,或者后续在Lambda中验证用户邮箱/组

2. 前端实现登录流程

  • 当员工访问应用时,前端跳转至Okta的授权端点,构造请求参数:
    https://<your-okta-domain>/oauth2/default/v1/authorize?
    client_id=<你的客户端ID>&
    response_type=code&
    scope=openid email profile&
    redirect_uri=<你的回调URL>&
    state=<随机生成的防CSRF字符串>
    
  • 员工在Okta完成登录后,会携带授权码跳回回调URL
  • 前端用授权码换取Access Token:调用Okta的令牌端点https://<your-okta-domain>/oauth2/default/v1/token,传递参数:
    • 若为Web应用:client_id、client_secret、code、grant_type=authorization_code、redirect_uri
    • 若为单页应用:改用PKCE流程,无需client_secret,添加code_verifier参数避免密钥泄露

3. Lambda中添加Token验证逻辑

前端调用Lambda时,将Access Token放在请求头的Authorization: Bearer <token>中,Lambda执行以下验证:

  • 从Okta元数据地址获取公钥(缓存公钥避免重复请求)
  • 验证Token的签名、有效期、受众(aud)、发行方(iss)是否合法
  • 可选:验证用户是否在允许的员工列表中(比如检查邮箱)

Python Lambda示例代码

import jwt
import requests
import os

# 从Lambda环境变量读取配置
OKTA_DOMAIN = os.environ["OKTA_DOMAIN"]
CLIENT_ID = os.environ["CLIENT_ID"]
ALLOWED_EMAILS = set(os.environ["ALLOWED_EMAILS"].split(","))

def get_okta_public_keys():
    # 缓存公钥,提升性能
    if not hasattr(get_okta_public_keys, "cached_keys"):
        metadata_url = f"https://{OKTA_DOMAIN}/.well-known/openid-configuration"
        metadata = requests.get(metadata_url).json()
        jwks_url = metadata["jwks_uri"]
        jwks = requests.get(jwks_url).json()
        get_okta_public_keys.cached_keys = {
            key["kid"]: jwt.algorithms.RSAAlgorithm.from_jwk(key)
            for key in jwks["keys"]
        }
    return get_okta_public_keys.cached_keys

def lambda_handler(event, context):
    # 提取请求头中的Token
    auth_header = event.get("headers", {}).get("Authorization")
    if not auth_header or not auth_header.startswith("Bearer "):
        return {"statusCode": 401, "body": "Unauthorized: No valid token provided"}
    
    token = auth_header.split(" ")[1]
    
    try:
        # 验证Token合法性
        keys = get_okta_public_keys()
        decoded_token = jwt.decode(
            token,
            keys,
            algorithms=["RS256"],
            audience=CLIENT_ID,
            issuer=f"https://{OKTA_DOMAIN}/oauth2/default"
        )
        
        # 验证用户是否在允许列表中
        user_email = decoded_token.get("email")
        if user_email not in ALLOWED_EMAILS:
            return {"statusCode": 403, "body": "Forbidden: User not authorized"}
        
        # 执行你的业务逻辑
        return {"statusCode": 200, "body": f"Welcome {decoded_token['name']}! Request authorized."}
    
    except jwt.ExpiredSignatureError:
        return {"statusCode": 401, "body": "Unauthorized: Token expired"}
    except jwt.InvalidAudienceError:
        return {"statusCode": 401, "body": "Unauthorized: Invalid audience"}
    except jwt.InvalidIssuerError:
        return {"statusCode": 401, "body": "Unauthorized: Invalid issuer"}
    except Exception as e:
        return {"statusCode": 401, "body": f"Unauthorized: {str(e)}"}

关键注意事项

  • 环境变量配置:将Okta域名、客户端ID、允许的邮箱列表存入Lambda环境变量,避免硬编码敏感信息
  • 公钥缓存:第一次拉取后缓存公钥,减少对Okta的请求次数,提升Lambda响应速度
  • 安全防护:前端必须验证state参数防止CSRF攻击;单页应用务必使用PKCE流程,不要暴露客户端密钥
  • 成本说明:仅使用Okta免费版(支持最多100个用户,足够你的少数员工场景)和现有Lambda资源,无额外费用

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 05:17:33