标签: api-gateway

API网关应该负责授权吗?

目前,我有一个带有 Java/Spring Boot 的单体应用程序,具有以下端点:

  • /login
  • /logout
  • /some-resource

要访问some-resource,流程如下:

  1. 用户POST/login端点发出请求。如果凭据正确,则在标头中返回 JWT 令牌,否则返回 401。
  2. 用户将 JWT 令牌与请求一起发送到/some-resource。如果令牌有效,则返回资源,否则返回 403。

现在我想将单体拆分为 2 个服务:“AuthServer”和“SomeResourceServer”。顶部会有一个 API 网关。我正在考虑 2 种可能的方式来处理授权


选项1

  1. 用户向/login端点发出请求。API 网关将其转发到“AuthServer”。如果凭据正确,则在标头中返回 JWT 令牌,否则返回 401。- 此步骤相同
  2. 用户将 JWT 令牌与请求一起发送到/some-resource。API 网关调用“AuthServer”来验证 JWT 令牌。如果令牌有效,API 网关调用“SomeResourceServer”并返回结果。否则 403。

选项 2

  1. 用户向/login端点发出请求。API 网关将其转发到“AuthServer”。如果凭据正确,则在标头中返回 JWT 令牌,否则返回 401。- 此步骤相同
  2. 用户将 JWT 令牌与请求一起发送到/some-resource。API 网关只是将请求转发到“SomeResourceServer”。然后“SomeResourceServer”调用“AuthServer”来验证 JWT 令牌。如果令牌有效,则返回资源,否则返回 403。

在选项 1 中,API 网关负责处理授权(与“AuthServer”通信),在选项 2 中,通信在服务器之间完成。那么哪个选项更正确呢?有什么好的/坏的做法吗?或者也许是另一种方式/选择?

architecture authentication authorization microservices api-gateway

9
推荐指数
1
解决办法
2191
查看次数

API网关缓存与CloudFront

我对API Gateway和CloudFront如何协同工作感到困惑.最终,我希望能够将自定义标头和值视为我的缓存键的一部分.我知道这可以通过白名单来完成(如果我使用的是CloudFront).

所以当我提出以下要求时:

GET/pagesRead/4 Some-Header:fizz

例如,返回'29页'

然后有一篇帖子将id 4更新为'45页'

如果我提出这个请求

GET/pagesRead/4 Some-Header:buzz

它现在将返回'45页'

但我正在使用API​​网关,显然它在幕后拥有自己的CloudFront.有没有办法可以配置API网关使用其"幕后"CloudFront将我的自定义标题列入白名单?这甚至需要做吗?

根据这个文档:https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-caching.html,似乎我可以在API网关中启用API缓存,它会考虑我的标题作为缓存键的一部分.

我理解正确吗?如果我想要的只是我的标题是缓存键的一部分,那么API网关中的"启用API缓存"和在API网关之上添加CloudFront实例以及在CloudFront中列入白名单之间有什么区别?

更新:

我在API网关中添加了这样的标题: 在此输入图像描述

但是在GET上,我从缓存中获取过时的数据.

GET/pagesRead/4 test-header:buzz

amazon-web-services amazon-cloudfront aws-api-gateway api-gateway

8
推荐指数
1
解决办法
7148
查看次数

AWS Lambda Task在6.00秒后超时

我正在使用无服务器框架.我的Lambda函数连接到DynamoDB表以更新表中的项目.表的读写容量单位为5,禁用auto_scaling.AWS Lambda函数分配了128MB内存.

我已经使用Jmeter进行性能测试.我已经同时发送了1000个请求,一些响应给了我完美的输出,而其他给出了内部服务器错误(502 Bad Gateway).我还分析了cloudwatch的日志,只获得了Task Timeout错误.任何人都可以建议我为什么我得到这个错误,以及如何解决它?

lambda amazon-web-services amazon-dynamodb serverless-framework api-gateway

8
推荐指数
2
解决办法
3928
查看次数

如何将微服务的招摇聚合成一个招摇

我试图在我的微服务项目中生成一个单一的 swagger,在 Api 网关中将所有服务 swagger 聚合成一个单一的服务。为了实现这一点,我正在关注下一个教程https://objectpartners.com/2017/09/28/aggregate-services-into-a-single-swagger

这里的问题是,当我尝试设置绝对 URL 时,我收到的输出是Failed to load API definition。undefined http://localhost:8070/apihttp://localhost:8081/api/v2/api-docs其中localhost:8070/api是 api 网关的基本 URL,而localhost:8081/api/v2/api-文档是微服务 swagger 的 docs URL。

这是我的代码:

Swagger配置

package com.rfd.apigateway.swagger;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;

import java.util.List;

@Configuration
@ConfigurationProperties(prefix = "swagger")
public class SwaggerConfiguration {

    private List<Resource> resources;

    public List<Resource> getResources() {
        return resources;
    }

    public void setResources(List<Resource> resources) {
        this.resources = resources;
    }
}
Run Code Online (Sandbox Code Playgroud)

资源

package com.rfd.apigateway.swagger;

public class Resource {
    private String name;
    private String url;
    private …
Run Code Online (Sandbox Code Playgroud)

swagger api-gateway

8
推荐指数
1
解决办法
6432
查看次数

具有子目录的S3的API网关代理

我创建了一个API网关方法GET,其集成类型为"AWS Service",用于"S3".我定义了一个路径覆盖:{object},它是从method.request.path.item映射的

集成请求

只要路径只包含桶本身(./bucket/ mybucketname),它的工作原理和{}项的值是mybucketname.

但是,当我指定例如../bucket/ mybucketname /富/酒吧/ test.txt的作为路径中的{}项目值应mybucketname /富/酒吧/ test.txt的,但它是空的.我认为这是因为嵌套路径

当我选择catch-all路径变量{proxy +}时,我无法再选择集成类型"AWS Service".

任何暗示我做错了什么或我应该做什么,以便通过API网关从S3检索子文件夹中的文件/文件夹?

amazon-s3 amazon-web-services api-gateway

8
推荐指数
3
解决办法
3001
查看次数

ASP.NET Core Api-Gateway中间件

我是API网关的新手并且有一个理解的问题.我也尝试在端点后面放置一系列(微)服务.

为此,我已经设置了一个ASP.NET核心应用程序并添加了包ThreeMammals Ocelot.在文档的帮助下,我已经配置了上游和下游.到现在为止还挺好.

草图

客户端向http:// mygateway:4242/s1 / {api} 发出请求,例如,按预期从Service1获取JSON或XML响应.

对于同样的行为的http:// mygateway:4242/S2 / {} API也与预期的结果!

我的理解问题是Service3.当我向http:// mygateway/s3 /发送请求时,我将index.html作为响应.

index.html本身需要通过link-tag的CSS-File'xyz.css'并强制客户端加载文件.

<head>
  <link rel="stylesheet" type="text/css" href="xyz.css">
</head>
Run Code Online (Sandbox Code Playgroud)

在这种情况下,客户端发送到"mygateway"的请求URL是http:// mygateway:4242/xyz.css而不是 http:// mygateway:4242/s3 /xyz.css,因此respone是404未找到,因为"mygateway"对"xyz.css"一无所知

如何修复此路由(?)问题?

是否有可能用ocelot中间件解决这个问题?或者我是否需要使用SinglePageApplication(SPA)的服务(Service3)的其他内容?

也许将SPA置于网关之后根本不可能或没有错?我希望你能给我一些提示,以便访问网关后面的SPA或MVC网站.

谢谢iBot


UPATE:附上 index.html的代码.我认为这是直截了当的.

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Title</title>
    <base href="/" />

    <link rel="stylesheet" type="text/css" href="dist/xyz.css">

</head>
<body>
    <div id="appContainer"></div>
    <script src="dist/xyz.js" asp-append-version="true"></script>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

c# asp.net asp.net-core api-gateway ocelot

8
推荐指数
1
解决办法
2756
查看次数

我可以通过 API 网关通过 Lambda 调用 AWS Cognito 吗?

我当前的堆栈是这样的:

  1. 用户通过 AWS Cognito 创建帐户
  2. 触发后确认 lambda,然后将更多用户详细信息添加到数据库中

我的数据库使用subcognito 生成的 id 作为 userId,因此它们是相同的。我还将电子邮件地址复制为数据库中的用户名。我的目的是使用 Cognito 进行身份验证,并使用我自己的数据库来实现我的应用程序的功能。

但是,如果用户希望更新他们的电子邮件地址,我需要在 cognito 和我的数据库中对此进行修改。我第一次尝试在我的 lambda 中使用 cognito 进行调用admin_update_user_attributes,但很快意识到它被阻止对互联网进行外部调用,所以我创建了一个 nat 网关,它可以工作,但成本太高了!

我的第二个想法是通过 cognito,让我的前端进行调用,然后让 cognito 触发 lambda 来更新我的数据库,但我认为这是不可能的。

是否有配置或我缺少的东西能够通过 API 网关通过 lambda 访问 AWS cognito,因为它们都是 AWS 服务。

我不想通过前端进行两个单独的调用,因为这会产生一个完成但另一个不完成的风险。

谢谢

amazon-cognito aws-lambda aws-api-gateway api-gateway amazon-cognito-triggers

8
推荐指数
1
解决办法
9516
查看次数

如何将自定义 kong 插件添加到 dockerized kong

我有一个 KONG 容器正在运行,我想向其中添加一个自定义插件,特别是JWT Crafter。我已经下载了插件,但我不知道如何让它从我的 KONG 容器开始。所以请如果有人进入相同的位置或知道任何可遵循的路线,这将非常有帮助。

docker dockerfile kong api-gateway

7
推荐指数
1
解决办法
4779
查看次数

API网关Lambda CORS处理程序.安全地获取Origin

我想为多个来源实现CORS,我知道我需要通过lambda函数这样做,因为我不能通过MOCK方法这样做

exports.handler = async (event) => {
  const corsUrls = (process.env.CORS_URLS || '').split(',')
  const requestOrigin = (event.headers && event.headers.origin) || ''

  if (corsUrls.includes(requestOrigin)) {
    return {
      statusCode: 204,
      headers: {
        "Access-Control-Allow-Headers": 'Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token,X-Requested-With',
        'Access-Control-Allow-Origin': requestOrigin,
        'Access-Control-Allow-Methods': 'POST,DELETE,OPTIONS'
      }
    }
  }

  return {
    statusCode: 403,
    body: JSON.stringify({
      status: 'Invalid CORS origin'
    })
  }
}
Run Code Online (Sandbox Code Playgroud)

首先,上面看起来好吗?然后我从标题获得起源event.headers.origin.但我发现我可以手动设置该标题以"绕过"cors.有没有可靠的方法来检测原始域?

lambda amazon-web-services cors aws-api-gateway api-gateway

7
推荐指数
1
解决办法
308
查看次数

使用 API 密钥或授权方授权 AWS API Gateway

在 AWS API Gateway 中,
- 我们可以设置一个资源来请求 API Key 进行访问。
- 我们还可以设置另一个需要授权的资源(例如 JWT 令牌,通过 lambda 函数或 AWS Cognito 处理)。

问题:我们可以将资源配置为在上述两种情况中的任何一种情况下都可以访问吗?目前,如果我们同时启用“API Key Required”和“Authorization”,则请求同时需要 API Key 和 Authorization。我们希望它通过两者中的一个。

破解/解决方法:创建相同资源的两个副本,并分别授权每个副本,一个使用 API 密钥,另一个使用授权方。

api api-key amazon-web-services aws-api-gateway api-gateway

7
推荐指数
2
解决办法
1300
查看次数