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
相关产品推荐
相关产品推荐

