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

R通过reticulate调用Python AWS Cognito认证报TIMESTAMP格式错误怎么办

报错根因

这个错误是AWS Cognito的服务端校验逻辑触发的:要求认证请求中的TIMESTAMP字段必须严格符合EEE MMM d HH:mm:ss z yyyy的英文格式(比如Wed Aug 21 14:32:01 UTC 2024)。你直接运行Python代码时环境的LC_TIME区域配置是英文,所以运行正常;但R调用reticulate时会继承R的系统区域配置,如果R的时间区域是非英文(比如中文),Python生成的TIMESTAMP里的星期、月份就会变成本地语言,触发参数错误。

解决方案

按优先级从高到低提供三种可行方案:

  • 方案1:修改Python认证代码,强制设置时间区域为英文(推荐,不影响R侧其他业务的区域配置)
    在你的Python代码头部添加区域设置逻辑,适配不同操作系统:
    from warrant.aws_srp import AWSSRP
    import locale
    import boto3
    
    # 强制设置时间相关区域为英文
    try:
        # 适配Linux/macOS
        locale.setlocale(locale.LC_TIME, 'en_US.UTF-8')
    except:
        # 适配Windows
        locale.setlocale(locale.LC_TIME, 'English_US')
    
    def auth(USERNAME,PASSWORD):
        client = boto3.client('cognito-idp',region_name=region_name)
        aws = AWSSRP(username=USERNAME, password=PASSWORD, pool_id=POOL_ID,
                    client_id=CLIENT_ID,client=client)
        try:
            tokens = aws.authenticate_user()
            return(tokens)
        except Exception as e:
            return(e)
    
  • 方案2:修改R侧调用前的时间区域配置
    在调用Python代码前先修改R的时间区域为英文,调用完成后可按需改回原有配置:
    # 先保存原有配置方便后续恢复
    old_locale <- Sys.getlocale("LC_TIME")
    # 切换为英文时间区域,二选一即可
    # Linux/macOS用这行
    Sys.setlocale("LC_TIME", "en_US.UTF-8")
    # Windows用这行
    # Sys.setlocale("LC_TIME", "English")
    
    # 执行原有调用逻辑
    reticulate::source_python(FILE_PATH)
    res <- py$auth(USERNAME,PASSWORD)
    
    # 恢复原有区域配置
    Sys.setlocale("LC_TIME", old_locale)
    
  • 方案3:手动生成符合要求的时间戳(兜底,无区域依赖)
    如果前两种方案因为系统权限、环境限制无法生效,可以重写AWSSRP的时间生成逻辑,手动格式化出符合要求的英文时间戳,完全规避系统区域的影响:
    from datetime import datetime
    import pytz
    
    # 手动构造符合AWS要求的时间戳,不依赖系统locale
    def get_aws_timestamp():
        dt = datetime.now(pytz.utc)
        # 手动拼英文星期、月份,完全规避区域问题
        weekdays = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]
        months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
        return f"{weekdays[dt.weekday()]} {months[dt.month-1]} {dt.day:02d} {dt.hour:02d}:{dt.minute:02d}:{dt.second:02d} UTC {dt.year}"
    # 后续替换掉warrant库内部调用的时间生成逻辑即可
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 21:54:03