我已经使用MERN制作了一个全栈web应用程序,并使用Kubernetes集群进行部署。
除了一个问题外,应用程序运行良好。 也就是说,我(作为用户)能够从浏览器(如www.domain-name/API/orders)访问API,它给我提供JSON响应。
这是我不想要的。 我要把这个藏起来/限制起来。
我使用NGINX-INGRESS路由为:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: ingress-service
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/use-regex: 'true'
spec:
rules:
- host: shopify.dev
http:
paths:
- path: /api/users/?(.*)
backend:
serviceName: auth-srv
servicePort: 3000
- path: /api/orders/?(.*)
backend:
serviceName: orders-srv
servicePort: 3000
- path: /?(.*)
backend:
serviceName: client-srv
servicePort: 3000
由于请求/API和/*(前端)都是通过nginx-ingress路由的,这是不是应该是这样工作的? 对此有何解决之道?
在浏览器中运行的客户端应用程序应该能够从API中获取数据,因此很明显,无论是您的应用程序发出请求,还是您(作为用户)从同一浏览器(或另一个rest客户端)发出请求,它都将通过(假设遵循相同的身份验证过程)。
如果是不可能完全阻止它,它不应该被要求,因为用户将仍然有访问相同的数据,无论是通过应用程序或直接。
但是,如果您希望隐藏它,因为您不希望普通用户在期待一个漂亮的前端应用程序时看到一些奇怪的json响应,那么您可以将该逻辑实现到您的应用程序中。
您可以这样做的方法是在前端应用程序发出的所有请求中包括一些自定义HTTP头(在AXIOS/FETCH调用中),然后实现一个过滤逻辑,该逻辑将解析该头,以查看调用是从前端应用程序发出的还是直接发出的(可能是一个中间件,如果用户看到没有该头的请求,它会将用户重定向到根页面)。 我以前用过这个解决方案,它工作得很好。
但再次注意,这与安全性无关,因为您的数据已经在前端应用程序中可用。 而且,它与kubernetes本身无关,任何高级用户都能够伪造这样的请求,从而绕过这个解决方案。 您的数据应该通过身份验证来保护,而不是通过一些html文档来保护。