【问题标题】:How to refresh IdToken from AWS Lambda如何从 AWS Lambda 刷新 IdToken
【发布时间】:2021-04-15 13:08:52
【问题描述】:

我为 SQS 队列设置了 Lambda 触发器,以便在队列收到任何新消息时调用 Lambda 函数。

Lambda 函数(在 Python 中)用于调用 API 端点,这需要 AWS Cognito IdToken,如下所示:

api_endpoint = 'https://api.us-east-1.amazonaws.com/v1/xyz'
headers = {"Authorization": "Bearer id_token_here"}

但是 24 小时后,IdToken 会过期,我已经使用 Cognito admin-initiate-auth 生成了一个新的。

如何在 Lambda 中进行管理?我无法在 lambda 函数中添加 admin-initiate-auth 命令,因为它会为每条消息运行它,我认为这并不理想。

处理此问题的最佳方法是什么?有没有一种方法可以让IdToken 在过期或即将过期时不断刷新,而不会导致 API 请求失败(由于令牌过期)?

【问题讨论】:

    标签: python amazon-web-services aws-lambda amazon-cognito


    【解决方案1】:

    您可以简单地 refreshSession 使用 InitiateAuth API 调用 REFRESH_TOKEN_AUTH。

    获得令牌后,将其存储在 AWS Secrets Manager 中,然后在每次 lambda 调用时从那里获取它。如果您从机密管理器获取的令牌不再有效,您只需刷新并更新机密管理器的值。

    下面是一些示例代码

        def initiate_auth(client, username, password):
        ...
    
            resp = client.admin_initiate_auth(
                        UserPoolId=USER_POOL_ID,
                        ClientId=CLIENT_ID,
                        AuthFlow='ADMIN_NO_SRP_AUTH',
                        AuthParameters={
                            'USERNAME': username,
                            'SECRET_HASH': secret_hash,
                            'PASSWORD': password,
                        },
                        ClientMetadata={
                        'username': username,
                        'password': password,
                    })
    
        def lambda_handler(event, context):
        client = boto3.client('cognito-idp')
        ...
        resp, msg = initiate_auth(client, username, password)
        ...
        if resp.get("AuthenticationResult"):
            return {'message': "success", 
                    "error": False, 
                    "success": True, 
                    "data": {
                    "id_token": resp["AuthenticationResult"]["IdToken"],
            "refresh_token": resp["AuthenticationResult"]["RefreshToken"],
            "access_token": resp["AuthenticationResult"]["AccessToken"],
            "expires_in": resp["AuthenticationResult"]["ExpiresIn"]
            "token_type": resp["AuthenticationResult"]["TokenType"]
                    }}
            else:
            ....
    

    【讨论】:

    • 所以你的意思是我应该在每个 Lambda 函数调用中检查身份验证有效性,如果令牌过期,我应该刷新它,对吗?
    • 是的,您不必经历重新生成令牌的整个过程,您可以要求刷新令牌,只要您有时间窗口,即使您的刷新令牌也是有效的。另外,每次获得新令牌时,请尝试将其存储在 AWS Secrets Manager 之类的地方,并且在每次 lambda 调用时,您都会从那里获取令牌并检查是否过期,然后刷新。
    猜你喜欢
    • 2017-10-21
    • 2021-08-30
    • 2020-09-07
    • 2019-09-03
    • 2023-03-15
    • 1970-01-01
    • 2020-07-18
    • 1970-01-01
    • 2020-07-13
    相关资源
    最近更新 更多