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-lambda 启用 cors
如何使用 Express 和 Apollo-Server 获取 HTTP 授权标头