使用访问令牌作为授权标头向 Lambda 函数 URL 发出请求

问题描述 投票:0回答:2

我已经处理这个问题有一段时间了。我想调用经过 AWS_IAM 身份验证的 Lambda 函数 URL,发送访问令牌(由 Cognito 用户池生成)作为授权标头。

我知道我可以将访问令牌作为 API Gateway HTTP 或 REST API 的请求标头发送,但我不确定它是否也适用于 Lambda 函数。

我找不到有关我的问题的任何文档,只是有关调用 Lambda 函数 URL 的 Signature V4 身份验证方法的其他文档:https://docs.aws.amazon.com/lambda/latest/dg/urls-invocable.html

aws-lambda aws-api-gateway amazon-cognito access-token
2个回答
0
投票

Lambda 函数 URL 的安全和身份验证模型 有两个 AuthType 选项:

  • AWS_IAM – Lambda 使用 AWS IAM 根据 IAM 委托人的身份策略和函数的基于资源的策略对请求进行身份验证和授权。
  • NONE – Lambda 在调用您的函数之前不执行任何身份验证。

基于 Cognito JWT 的访问令牌不是 AWS IAM 会话令牌,因此无法使用 SigV4 对请求进行签名。对于每个 Lambda 函数 URL AuthType 选项,您都有不同的选项。

  1. 要使用 AWS_IAM,您可以使用 Amazon Cognito 身份池来提供临时的、有限权限的凭证,该凭证可以对请求进行 SigV4 签名。
  2. 要使用 NONE,您需要自行验证 JSON Web 令牌,最好使用软件框架(例如 AWS JWT verify)。

0
投票

如果身份验证类型是 AWS_IAM 并且您使用 python 的

requests
模块发出请求,那么这应该适合您。我正在使用 aws-requests-auth 签署请求。

有关凭据的注意事项:您需要提供一个

aws_access_key
、一个
aws_secret_access_key
和一个
aws_token
。在你的情况(和我的情况)中,这些信息需要以某种方式传递到 lambda 函数中。首选方法是使用
Secrets
,但根据您的情况,这可能可行也可能不可行。在下面的示例中,我只是使用
boto3.Session().get_credentials()
从环境中检索凭据,在
lambda
的情况下,将检索函数执行角色的凭据。

import requests
import urllib.parse
from aws_requests_auth.aws_auth import AWSRequestsAuth

credentials = boto3.Session().get_credentials()

FUNC_URL = https://y103j5j68sga7xuqzru42xjlexxi0vrieb.lambda-url.ap-northeast-1.on.aws/

auth = AWSRequestsAuth(
    aws_access_key=credentials.access_key,
    aws_secret_access_key=credentials.secret_key,
    aws_token=credentials.token,
    aws_host=urllib.parse.urlparse(FUNC_URL).netloc,
    aws_region=credentials.region,
    aws_service="lambda",
)

requests.post(
    url=FUNC_URL,
    auth=auth,
    data=json.dumps({"YOUR": "DATA"}),
    headers={"Content-Type": "application/json"}
,
)
© www.soinside.com 2019 - 2024. All rights reserved.