问题:我想使用Facebook身份验证授权我的Amazon API Gateway托管REST API用户.
我的理解:我知道Amazon Cognito可用于验证用户身份,称为联合身份.然后,我看到使用Amazon Cognito您的用户池验证API客户端,该客户端对Cognito用户池进行身份验证.我还发现使用Amazon API Gateway自定义授权器可以使用自定义授权.但是,我没有找到链接API网关使用Cognito Federated Identities(即Facebook这里)进行身份验证.我们是否可以使用与联合身份用户池相同的过程,还是应该像在自定义授权人中那样使用?我有点困惑.任何帮助是极大的赞赏.
提前致谢.
authentication amazon-web-services amazon-cognito aws-api-gateway amazon-cognito-facebook
我正在使用Lambda后端开发AWS API Gateway实现.我使用API Gateway与Cognito Userpools(相当新的)集成,而不是使用Lambda构建自定义授权程序(这是在集成之前的推荐方式).
我创建了一个概念验证(javascript),用Cognito对用户进行身份验证,然后使用这些凭据调用API Gateway.因此,基本上,对API网关的结束调用是使用我在Authorization标头中从Cognito(result.idToken.jwtToken)收到的JWT令牌.这一切都有效,我可以验证只有使用此令牌才能访问API.
一切正常,但现在我想在我的Lambda中访问Cognito身份; 例如身份ID或姓名或电子邮件.我已经阅读了如何映射所有参数,但实际上我只是在集成请求中使用标准的"Method Request Passthrough"模板.我记录了lambda中的所有参数,所有'cognito'参数都是空的.
我查看了许多类似的问题,并且他们都建议在集成请求中启用"使用调用者凭据调用"复选框.这很有道理.
但是,只有在使用AWS_IAM作为授权时才能启用此复选框,如果您选择了您的cognito UserPool ,则不能启用此复选框.所以它是不可能选择它并且实际上是禁用的.
在这种情况下有人知道该怎么做吗?这仍然在进行中,还是有理由不能启用此功能并在Lambda中获取认证凭据?
非常感谢.
amazon-web-services amazon-cognito aws-lambda aws-api-gateway
我有一个简单的C#Aws Lambda函数,它成功通过Lambda控制台测试进行测试,但如果从API网关(我从Lambda触发器选项生成)调用了502(Bad Gateway)失败,并且如果我使用postman. (此初始功能具有开放访问权限(无安全性))
// request header
Content-Type: application/json
// request body
{
"userid":22,
"files":["File1","File2","File3","File4"]
}
Run Code Online (Sandbox Code Playgroud)
我在日志中得到的错误是:
Wed Feb 08 14:14:54 UTC 2017 : Endpoint response body before transformations: {
"errorType": "NullReferenceException",
"errorMessage": "Object reference not set to an instance of an object.",
"stackTrace": [
"at blahblahmynamespace.Function.FunctionHandler(ZipRequest input, ILambdaContext context)",
"at lambda_method(Closure , Stream , Stream , ContextInfo )"
]
}
Run Code Online (Sandbox Code Playgroud)
似乎发布的对象没有传递给lambda输入参数.
代码如下
// Lambda function
public LambdaResponse FunctionHandler(ZipRequest input, ILambdaContext context)
{
try
{
var logger = context.Logger;
var …Run Code Online (Sandbox Code Playgroud) 我有一个代理到 AWS Lambda 函数的 API 网关资源。这对于传递尾随路径参数 ( /periodicals/{tail+})效果很好,但由于我希望这些参数是可选的,因此我还向ANY更高层的资源 ( /periodicals)添加了一个方法:
从 AWS 控制台中测试该方法时,这很有效。但是,直接从我的浏览器对该资源执行请求会导致以下响应:
{"message":"Missing Authentication Token"}
Run Code Online (Sandbox Code Playgroud)
有了这个标题:
x-amzn-errortype: MissingAuthenticationTokenException
Run Code Online (Sandbox Code Playgroud)
它还有一个x-cache带有值的标题Error from cloudfront,所以我猜它可能与 CloudFront 有关。我还没有明确设置 CloudFront,也不知道如何检查?
我想我阅读了有关此错误消息的每个线程,但它们似乎都不适用于我:

/periodicals/whatever(即{tail+}资源)时,它工作正常,但对于/periodicals.ANY.
感谢@Lakindu,一个有趣的观察是在 Stages 视图中的资源下方没有列出任何方法:
我还能做些什么来找出问题所在?
我正在尝试在AWS上创建一个多区域无服务器应用程序.我按照这里给出的说明进行操作.我正在使用无服务器框架,它使用Cloudformation脚本在AWS上创建所有资源.
我想为API网关创建一个自定义域作为区域端点.创建区域端点时,它会生成目标域.我想知道如何在Cloudformation脚本中获取目标域的值?
当我创建Edge优化端点时,我使用该DistributionDomainName属性获取CloudFront部署的值.但是,在创建区域端点时,我没有看到目标域名的任何属性.我尝试使用DistributionDomainName区域端点的属性,但它会抛出一个错误,表示没有DistributionDomainName.
以下是我脚本的一部分 -
# Creates a custom domain for the ApiGateway
customDomain:
Type: 'AWS::ApiGateway::DomainName'
Properties:
DomainName: ${self:custom.domain}
EndpointConfiguration:
Types:
- REGIONAL
RegionalCertificateArn: ${self:custom.certificateArn}
# Insert a DNS record in route53 hosted zone to redirect from the custom domain to CF distribution
dnsRecord:
Type: AWS::Route53::RecordSet
Properties:
Region: ${self:provider.region}
SetIdentifier: ${self:provider.region}
HostedZoneId: ${self:custom.hostedZoneId}
Name: ${self:custom.domain}
Type: CNAME
TTL: 60
ResourceRecords:
- "Fn::GetAtt": [customDomain, DistributionDomainName]
Run Code Online (Sandbox Code Playgroud)
请帮忙.谢谢!
UPDATE
Cloudformation现在通过RegionalDomainName属性返回区域域名.它可以用作Fn:GetAtt : [customDomain, …
regional amazon-web-services aws-cloudformation aws-api-gateway serverless-framework
我正在尝试使用自定义域设置区域 API 网关,但遇到了一个涉及 SSL 证书的问题。这是我所做的:
当我跑
curl https://82cgbm6s93.execute-api.us-east-1.amazonaws.com/prod
Run Code Online (Sandbox Code Playgroud)
我得到
{"message":"Missing Authentication Token"}
Run Code Online (Sandbox Code Playgroud)
这正是我所期望的,因为 API 需要 Cognito 身份验证。当我使用“-k”选项忽略证书错误并运行时,我收到相同的消息
curl https://vitalservices-3.docriot.com -k
Run Code Online (Sandbox Code Playgroud)
但是如果我放弃 -k 并运行
curl https://vitalservices-3.docriot.com
Run Code Online (Sandbox Code Playgroud)
我得到
curl: (60) SSL certificate problem: Invalid certificate chain . . .
Run Code Online (Sandbox Code Playgroud)
我怎样才能解决这个问题?
编辑:我只是在我的 OS X 机器上使用 curl,因为我认为这是一种更简单的说明错误的方法。当我在 Chrome 浏览器中访问这些 URL 时,我得到了类似的行为。如果输入https://vitalservices-3.docriot.com,我会在 URL 栏中看到红色警告三角形,页面上显示“攻击者可能正试图窃取您的信息......”。然后,如果我仍然选择查看该页面的选项,浏览器将显示一个带有文本“{"message":"Missing Authentication Token"}”的页面,就像我使用“curl -k”时一样。因此,我认为问题不在于我的机器不信任证书颁发机构。
我有一个任务来配置 API 网关以将流量路由到 Lambda 或负载均衡器(内部,在 VPC 下)。我认为可以使用简单的 HTTP 集成或 AWS 服务为 ALB 创建简单的集成。但是经过一段时间的谷歌搜索后,我发现只有一种解决方案 - 是配置 NLB,然后使用VPC_Link 集成。在这种情况下,一切看起来都在工作。
但是我仍然找到了一些像这样的文章,其中人们描述了如何在没有 VPC_links 的情况下集成 Api Gateway 和 LB。就我而言invalid endpoint address,将内部 ALB 与 apigateway 集成时,我总是看到错误。我想这仅适用于公共资源(面向 LB 的互联网)?
问题的第二部分。当我配置 VPC_link 时,我仍然需要在集成中提供一些端点以进行证书检查和其他事情。但是看起来这个端点仍然必须可以公开访问?问题是我在 ALB 下的服务有多个端点,我需要在这个端点提供路径Endpoint URL,这个端点应该是公开的,就像我现在看到的那样。因此,出于测试原因,我提供了我们需要执行的公共资源的 url 和端点路径。这有效,但对我来说看起来太丑了。可能有任何漂亮的解决方案。
amazon-web-services amazon-vpc aws-api-gateway aws-load-balancer
理想情况下,我想锁定我的ALB,以便只能通过API网关访问它.
我已经研究过是否我可以API网关与入站规则联系起来 - 不过,我发现,API网关不能与IP地址或安全组关联.我也研究了面向内部的ALB,但由于VPC链接仅支持NLB,因此我无法使用它们.
任何帮助将不胜感激 - 我一直在寻找网关设置,但找不到此选项.
解决这个问题的最佳方法是什么,以便尽可能限制ALB?
我知道私有API不支持自定义域名。
与上面问题的丑陋url问题不同,我的问题是私有dns的格式,如下所示:
https://{restapi-id}.execute-api.{region}.amazonaws.com/{stage}
Run Code Online (Sandbox Code Playgroud)
该问题是,主机名是动态的- RestapiId可以改变,只要CloudFormation堆栈被重建。当 CF 堆栈处于 rollback_complete 状态且无法更新时,此重新创建完成。然后我需要删除堆栈,再次创建它,所有使用我的 API 的客户端都需要更新主机名的RestapiId部分,这是不可接受的。上面提到的答案(使用代理服务器)也是不可接受的。也许一个解决方案可能是在 CF 模板中手动设置 ApiGateway 资源的 id,但据我所知这是不可能的。
任何想法如何解决这个问题?提前致谢。
我正在尝试在单个堆栈中部署 S3 静态网站和 API 网关/lambda。
S3 静态站点中的 javascript 调用 lambda 来填充 HTML 列表,但它需要知道用于 lambda 集成的 API 网关 URL。
目前,我像这样生成了一个 RestApi ......
const handler = new lambda.Function(this, "TestHandler", {
runtime: lambda.Runtime.NODEJS_10_X,
code: lambda.Code.asset("build/test-service"),
handler: "index.handler",
environment: {
}
});
this.api = new apigateway.RestApi(this, "test-api", {
restApiName: "Test Service"
});
const getIntegration = new apigateway.LambdaIntegration(handler, {
requestTemplates: { "application/json": '{ "statusCode": "200" }' }
});
const apiUrl = this.api.url;
Run Code Online (Sandbox Code Playgroud)
但是在 cdk 部署上,apiUrl =
"https://${Token[TOKEN.39]}.execute-api.${Token[AWS::Region.4]}.${Token[AWS::URLSuffix.1]}/${Token[TOKEN.45]}/"
因此,直到静态站点需要该值之后,才会解析/生成 url。
如何计算/查找/获取 API 网关 URL 并更新 cdk …
aws-api-gateway ×10
aws-lambda ×4
amazon-vpc ×2
aws-cdk ×1
c# ×1
node.js ×1
regional ×1
ssl ×1