koa开启cors允许跨域,携带cookies

koa开启cors允许跨域,携带cookies,第1张

使用koa开发想要开启 cors 非常简单,已经有对应的库: @koa/cors 。

虽然库的readme没有具体介绍具体的用法,但是我们可以通过阅读测试用例知道可以传什么参数,什么类型。

只需要两行,接口就会在返回数据的时候带上 Access-Control-Allow-Origin 响应头。默认允许所有请求方式跨域, Access-Control-Allow-Origin 默认为 * 。

为了安全考虑,携带cookies的跨域请求只允许 Access-Control-Allow-Origin 为单一域名,即只支持一个域名在请求的时候携带cookies。且需要带上响应头 Access-Control-Allow-Credentials

对 @koa/cors 添加配置 origin 和 credentials :

同时,前端要发起携带cookies的跨域请求,需要设置 XMLHttpRequest 的 withCredentials 为 true ,如果你是使用 axios ,只需要在请求配置里加上一句 withCredentials: true ,请看例子:

这样前端( http://koa.com )就可以向后端( http://localhost:8000 )发送请求了。

如果你的前端地址只有一个,给 @koa/cors 的 origin 添加一个域名就能满足需求,如果需要支持跨域的域名有多个呢?

通过观察 @koa/cors 的 单元测试用例 ,可以发现 origin 是支持用函数的方式传入的。这样我们就可以维护一个域名数组,判断请求地址是否在域名数组内,就能知道是否要对请求地址提供携带cookies请求支持了。

要想知道发起请求的前端地址,可以使用 ctx.request.header.origin 。注意 ctx.request.header.origin 和 ctx.request.origin 是不同的。 ctx.request.origin 是接口域名, ctx.request.header.origin 是发起请求的页面域名。

上一个章节中,讲解了next下如何通过axios获取远程数据,可是遇到了跨域的问题,所以单独写个文章讲解一下,如何在开发模式dev下面,解决跨域,没有使用跨域代理之前

下面开始讲解如何跨域

首先,打开我们的koa项目,启动,用koa来作为后台接口模拟数据

好,正式开始配置~~~~~~~~~~~~~~~~~~~~~~~~~~

打开Next项目

1:安装跨域的依赖中间包 http-proxy-middleware

2:根目录下面新建server.js

//server.js

ps:target一定要修改为 http://localhost:3333/api/ ,而不是' http://localhost:3333 ,否则就会404,我这里就搞错了

3:修改package.json

//package.json

4:使用

//pageA.js

可以看到前面的前缀就不需要啦,直接加地址就好了

效果图

OK,成功跨域

# 前后端分离( 服务器)

- 前端资源(html)- server-a 提供前端静态资源

- 后端数据(商品信息……)- server-b 提供基于http的api

#同源策略

当我们通过 xhr 的方式从一个源去获取另外一个源的数据的时候,就会触发同源策略的协议

**源**

域:协议+主机(ip、域名)+端口,比如 http://localhost:8888

**同源策略**

**浏览器**的安全设定,避免浏览器中通过脚本等方式去获取非同源的数据

官方文档:https://developer.mozilla.org/zh-CN/docs/Web/HTTP/CORS

这套机制建立在一个核心内容基础之上:**http header**,这套机制定义了一系列的http头,通过这些http头来控制资源的访问。这些http头基本都是以 `access-control-?` 来进行命名的,不同的http头有不同的作用。

#普通资源请求

**[Access-Control-Allow-Origin](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/CORS#access-control-allow-origin)**

控制当前允许访问该资源的源(origin)

# 非普通的资源请求

**简单请求 &非简单请求**

当请求满足一定规则的时候,为简单请求

https://developer.mozilla.org/zh-CN/docs/Web/HTTP/CORS#%E7%AE%80%E5%8D%95%E8%AF%B7%E6%B1%82

**预检请求**

如果当前请求满足了非简单请求,那么就会先发送一个 method 为 options 的请求(浏览器),称为**预检**,后端需要对这个预检请求进行处理,根据业务返回对应的头信息,来告知客户端是否允许发送非简单请求,我们需要在预检请求中返回一系列的头信息,来控制之前发送的非简单请求是否继续

https://developer.mozilla.org/zh-CN/docs/Web/HTTP/CORS#%E9%A2%84%E6%A3%80%E8%AF%B7%E6%B1%82

**附带身份凭证的请求**

cookie 实际也是会受到同源策略的限制的,如果非同源请求,cookie是默认被禁止携带处理的。

解决:

- 客户端在请求中要设置:withCredentials: true

- 服务端要在cors中设置:ctx.set('Access-Control-Allow-Credentials', 'true')

## 利用 koa-server-http-proxy 实现服务端代理

利用 koa-server-http-proxy 来处理正向代理

## 基于jwt鉴权(jsonwebtoken)

**cookie**

使用cookie来实现用户鉴权

- 目前cookie限制太多

- cookie会在一些情况下被禁用

**放置另外一个地方**

- 请求必须是可控的(ajax)

- 基于前后端开发的应用基本都是使用ajax方式进行

**jwt**

https://jwt.io/introduction


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/7999106.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-12
下一篇 2023-04-12

发表评论

登录后才能评论

评论列表(0条)

保存