Apollo Express CORS 选项

Posted

技术标签:

【中文标题】Apollo Express CORS 选项【英文标题】:Apollo Express CORS options 【发布时间】:2020-09-03 06:07:04 【问题描述】:

如何保护我的 graphql 路由不被未知资源查询?

我目前有以下选择:

export const corsOptions = 
  origin: ["https://my-website.com", "https://api.my-website.com"],
  credentials: true,


expressApp.use(cors(corsOptions))

apolloServer.applyMiddleware(expressApp, cors: corsOptions)

我已将其部署在 AWS/Fargate 上。

问题是我仍然可以从我的计算机上在 Postman 中查询。

注意,我还将有一个 React-native 应用程序来连接到此 API。

什么是适合我的 CORS 选项?

【问题讨论】:

那么你应该首先阅读 CORS 的真正含义。然后你就会明白为什么 POSTMAN 总是能够查询你的公共端点。 有什么方法可以使那个端点成为私有的吗? CORS 只是您浏览器中的自愿限制,旨在提高用户的安全性。如果包含 curl 的系统想要获取资源,它可以。您需要向端点添加身份验证 - 可能类似于 JWT? 是的,我使用 JWT 进行突变,但不用于查询(因为我希望访问者在不创建帐户的情况下浏览某些内容)。似乎我要么为所有人添加身份验证,要么使用随机生成的端点。 【参考方案1】:

正如 cmets 中所指出的,CORS 仅由浏览器强制执行——它不能用于阻止 Postman 等其他客户端访问您的 API。

如果您的 API 仅由其他服务器使用,您可以使用可以包含在标头中或作为 URL 参数的 API 密钥来保护它。 API 密钥也可用于计量和限制 API 的使用者。

如果您的 API 由 Web 或本机应用程序使用,则使用 API 密钥在很大程度上是没有意义的,因为最终用户将能够通过检查源代码或嗅探其本地流量来获取它。如果您仍然需要用户登录,那么您只需要为您的查询实施适当的授权机制。如果您希望在不登录的情况下访问您的部分或全部查询,那么最好的办法是实施速率限制以限制潜在的滥用。

【讨论】:

是的,我已经在 Express 中实现了速率限制。感谢@Daniel 的解释。

以上是关于Apollo Express CORS 选项的主要内容,如果未能解决你的问题,请参考以下文章

Express CORs 策略阻止 Apollo 客户端从服务器获取

Apollo Server 重置 CORS 选项 [重复]

如何为 apollo-server-lambda 启用 cors

如何使用 Express 和 Apollo-Server 获取 HTTP 授权标头

在我的 apollo graphQL express 服务器中实现一个套接字连接

Node.js + express + cors 不工作:待处理的选项请求