Nodejs 用 token 代替 cookie, 在点超链接跳转的时候, 怎么把 token 附加到 request 里面

发布于 1周前 作者 htzhanglong 来自 nodejs/Nestjs

Nodejs 用 token 代替 cookie, 在点超链接跳转的时候, 怎么把 token 附加到 request 里面
新手, 之前学别人博客的东西用 cookie/session 做用户登录, 刚用 firebug 看了 cookie, 说说我看到的 cookie 的传递情况.

1. 在 login.html 页面, 点击登录以后, 服务器返回 cookie 并告诉浏览器需要请求 home.html
2. 浏览器自动在 request 中附加 cookie 并请求 home.html, 服务器把 cookie 解析成 session, 验证后返回 home.html 文件
3. home.html 加载完以后, 浏览器请求了一个 json 文件, 这个文件是公有的, 但是浏览器也自动附加了 cookie

在上面的过程里面, 用户登录以后, 浏览器会主动在每个请求中附加 cookie 好在需要的时候用于身份验证.

现在我用 token 代替 cookie, 怎么才能让浏览器也自动把 token 附加到 request 里面.
ajax 的请求可以手动附加 token, 但是 <a href="/xxx.html">, <form action="/xxx.html"> 和 location.href = ‘xxx.html’ 的怎么弄.

做出来的 json 接口既要支持桌面站点, 也要支持手机 app. 我想在有一个想法, 把 token 按照 cookie 的格式返回给客户端, 浏览器可以直接支持, 手机 app 解析 header. 不知道行不行.


32 回复

token 保存在本地, cookie 是一个简单的位置


浏览器不会把 token 自动加到请求里,因为这是你自己创建的东西,不属于 HTTP 协议的一部分,如果是为了学习,可以这么干,如果是为了使用,那完全没必要;

ajax 可以统一添加自然好,那页面中的各种 url 地址你必须要手动加上去,比如:<a href="/xxx.html?token=${token}">,你也可以想一些“聪明”的办法,让你更方便的加 token 在后面。

总之就是麻烦;

不想让 token 直接出现在 URL 里面…

不是 single page app ?

手机上可以做单页应用, 但是现在要做桌面版

链接能带信息的只有三个地方:?后的参数, cookie ,请求 Header

cookie 不要, url 后面也不要,难道加 header ?这更不可能

为什么不用 cookie 呢?

basic authorized 是在 http 头的。

业内常用做法是让客户端模拟浏览器发送 http 请求,也就 shi 一律都用 cookie ,也就不用你说的 token 了

cookie 的内容可以就是一个 Token

Token 要取代的是 session 不是 cookie

恩, 好的, 谢谢了

token 存储在本地的 local storage 里

拿 token 放在链接里小心 http referer 头的安全性问题。。

不是 spa 你搞什么 token

还是有意义的 scale

用 header 头里的 authorized 字段是可以解决楼主的问题的

直接用 jquery 的 ajax 代理所有的 a 标签的网络请求,然后你想怎么玩就怎么玩了

写个 js 函数,给网页上所有的 a 标签 href 属性加上 token.
https://gist.github.com/hanjm/2102fa5b40d01d0fe64311e37f4d3557

我没查到 authorized 字段的说明, 能不能给个链接

你说的代理 <a> 的请求是这样吗

$(‘a’).click(function () {
window.open(this.href, this.target || ‘_self’);
return false;
})

按这个代码也只能把 token 放到 url 里面

参考 jwt auth



看起来只能这样:

1. 往 document 对象监听 click 事件,捕获所有 a 标签的
2. 检查是否请求自己的地址
3. 改用 AJAX 添加请求头然后发送请求

另外 ichou 说的是 Authorization 请求头
详见 RFC7235 ( https://tools.ietf.org/html/rfc7235 )

最近为毛那么多地址癖!最好地址栏什么都不带,但是又能满足我所有的参数!可能麽?

如果 ajax 请求回来一个 html 文件该怎么办呢

我试了一下, document.write 可以覆盖页面, 但是地址栏没变, 也没办法点后退按钮回到上一个页面, 看来还是要把 token 放到 query 里面



如果不是单页应用
还是建议用 cookie 来传输 token
这样在地址上不可见
用的时候注意防范跨站等等攻击就行了
简单方便

参考 GitHub 的 token 格式

https://[email protected]/xxxx

知道 token 加到哪里了吗

URL 里的 userinfo 被你吃了吗

#30 真是一言难尽

在 Node.js 应用中,使用 token 代替 cookie 是一种常见的安全实践,特别是在需要保护 API 或路由时。为了在点击超链接跳转时附加 token 到 request 中,通常不能直接在超链接(即 <a> 标签)中附加 token,因为超链接会发起 GET 请求,而 GET 请求的 body 是不可用的。

这里有几种常见的替代方案:

  1. 将 token 放在 URL 参数中: 虽然不太安全(因为 URL 可能会记录在日志中),但这是一个简单的方法。

    <a href="/protected-route?token=YOUR_TOKEN_HERE">Protected Route</a>
    
  2. 使用 JavaScript 发起 POST 请求: 通过 JavaScript(如使用 fetchaxios)发起 POST 请求,将 token 放在请求头中。

    fetch('/protected-route', {
      method: 'POST',
      headers: {
        'Authorization': 'Bearer YOUR_TOKEN_HERE'
      }
    }).then(response => response.text()).then(data => console.log(data));
    
  3. 使用隐藏的表单: 使用隐藏的表单提交,将 token 放在表单数据中。

    <form id="tokenForm" action="/protected-route" method="POST" style="display:none;">
      <input type="hidden" name="token" value="YOUR_TOKEN_HERE">
    </form>
    <button type="button" onclick="document.getElementById('tokenForm').submit()">Go to Protected Route</button>
    

注意,对于敏感操作,建议使用 HTTPS 来确保数据传输的安全性。

回到顶部