无状态登录--JWT使用私钥生成token写入cookie中--domain属性引发的写入问题

无状态登录--JWT使用私钥生成token写入cookie中--domain属性引发的写入问题  前端并未接收到含token的cookie

在编写微服务集群---授权中心 模块时,采用了 JWT+RSA非对称加密,

部署环境:虚拟机服务器中,使用nginx作为api网关统一处理,微服务中使用springcloud的zuul路由网关。

本地虚构域名通过host文件,对应虚拟机ip,虚拟机nginx代理到本地微服务网关端口。

服务端使用私钥生成token,将token写入cookie中返回给用户。

cookie的domain属性解释:

常用于单点登录(单点登录:是指用户在 在一个域名下访问项目www.luoskr.com登录后, 然后切换到 api.luoskr.com时也自动被判断为登录状态)。

通过域名、ip访问写入cookie后,让在各个子级域中也可以使用到 访问的域名或ip 中的cookie。

例: http://api.leyou.com/api/auth/login访问写入cookie时,domain设置为.leyou.com, 则在 image.leyou.com 下也可以访问到前面那个域名返回 的cookie,因为设置domain后,这些cookie都存在 父级域 ‘.leyou.com’下面,其它子级域也可以拿到其cookie。

domain属性代表的是cookie所在的域(即意思是可以访问此cookie的域名),默认是请求的地址

例如:访问地址为-->http://api.leyou.com/api/auth/login , 则domain默认为api.leyou.com ,则写入的cookie只能在api.leyou.com下使用。

这就牵扯到单点登录中,cookie跨域问题了,要想解决上面那个不同子级域名不能共用cookie,设置domain为.leyou.com,即可

上面举的单点登录,不同域名共用cookie,与本篇文章解决问题关系不大,纯属复习。

遇到的情况:

因为使用了nginx反向代理 和 cloud的zuul路由网关 ,使后端获取的request的url一直是127.0.0.1,而不是访问的域名,使cookie值不能正常写入。


项目正常运行,使用 localhost本地测试登录api http://localhost:8087/login

我们可以看到下图cookie中正常包含token,本地测试没问题

然后我们启动前端项目,用域名访问登录接口 http://api.leyou.com/api/auth/login,登录成功,跳转到首页,

然而,此时我们可以看到下图中,并没有接收到cookie,说明cookie写入错误。

下面,我们解决这个问题:(我们首先确定了问题原因,是因为路径,使用localhost时没问题,换成域名就出错了)

写入cookie时,通过debug发现,后端获取request的url请求路径自动变成了http://127.0.0.1:8087/login,

而我的请求路径是http://api.leyou.com/api/auth/login,所以说 是因为请求路径问题,域名并没有通过网关。


设置一:

首先,我们对nginx进行修改,因为nginx中,我们配置了反向代理,访问域名,代理到另一个ip,所以自然取到的不是使用的域名。

nginx.conf配置文件如下图修改,我们添加了proxy_set_header Host $host; 反向代理后让传到服务端时host头信息路径,仍是我们访问的那个url。

    server {
        listen 80;
        server_name api.leyou.com;
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-Server $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;  # 设置host主机仍为上面server_name定义的域名 

然后,重启nginx,debug测试后发现,后端request取得的requestURL仍是http://127.0.0.1:8087/login,这说明不只是nginx问题

nginx代理访问到服务端,进入到我们微服务zuul网关时,还出现了问题。

设置二:

接下来,我们来进行微服务中zuul网关的设置

我们发现,zuul中也进行了反向代理,源码里ZuulProperties.java文件中, addHostHeader值默认是false,即没有添加访问过来的request里面host头信息,就在eureka注册中心里面代理对应微服务,host就变成了127.0.0.1.

我们在微服务网关zuul里面 application.yml 进行设置:

  多添加以下两行代码:

  add-host-header: true # 解决cookie问题,添加host头信息,使在zuul中添加接收到的request头host信息,

  上面这行设置后,服务端使用request得到的host就变成正常的 我们访问的域名了。

  但是zuul中默认有敏感头过滤,它把Cookie 与 Set-Cookie 给禁用了,导致我们无法使用写入cookie,故我们将其覆盖
  sensitive-headers:  # 覆盖敏感头过滤,设置为空,则没有敏感头,所有头信息都放行。

zuul:
  prefix: /api # 添加路由前缀
  routes:
    item-service:    # 路由名称,路由名称唯一
      path: /item/** # 访问路径
    search-service:
      path: /search/** # 访问路径
    user-service:
      path: /user/** # 访问路径
    auth-service:
      path: /auth/** # 访问路径
    upload-service:
      path: /upload/**
      serviceId: upload-service
      stripPrefix: false # 代理转发时去掉前缀,false:代理转发时不去掉前缀 例如:为true时请求 /product/get/1,代理转发到/get/1
  add-host-header: true # 解决cookie问题,添加host头信息
  sensitive-headers: 

以上都配置好,重启微服务,url访问,f12在控制台Application里面左侧Cookies中可以看到,含token的cookie正常写入!

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值