V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
wanganjun
V2EX  ›  Node.js

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

  •  
  •   wanganjun · 2016-11-04 21:23:29 +08:00 · 19637 次点击
    这是一个创建于 2945 天前的主题,其中的信息可能已经有所发展或是发生改变。
    新手, 之前学别人博客的东西用 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. 不知道行不行.
    31 条回复    2020-08-31 19:06:23 +08:00
    learnshare
        1
    learnshare  
       2016-11-04 21:29:22 +08:00
    token 保存在本地, cookie 是一个简单的位置
    liuxey
        2
    liuxey  
       2016-11-04 21:29:28 +08:00
    浏览器不会把 token 自动加到请求里,因为这是你自己创建的东西,不属于 HTTP 协议的一部分,如果是为了学习,可以这么干,如果是为了使用,那完全没必要;

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

    总之就是麻烦;
    wanganjun
        3
    wanganjun  
    OP
       2016-11-04 21:31:35 +08:00
    @liuxey 不想让 token 直接出现在 URL 里面...
    ericls
        4
    ericls  
       2016-11-04 21:39:34 +08:00 via iPhone
    不是 single page app ?
    wanganjun
        5
    wanganjun  
    OP
       2016-11-04 21:42:27 +08:00
    @ericls 手机上可以做单页应用, 但是现在要做桌面版
    liuxey
        6
    liuxey  
       2016-11-04 21:47:04 +08:00
    @wanganjun 链接能带信息的只有三个地方:?后的参数, cookie ,请求 Header

    cookie 不要, url 后面也不要,难道加 header ?这更不可能
    paranoiagu
        7
    paranoiagu  
       2016-11-04 21:48:14 +08:00 via Android
    为什么不用 cookie 呢?
    wanganjun
        8
    wanganjun  
    OP
       2016-11-04 21:48:59 +08:00
    @liuxey 好吧
    paranoiagu
        9
    paranoiagu  
       2016-11-04 21:49:23 +08:00 via Android
    basic authorized 是在 http 头的。
    zjsxwc
        10
    zjsxwc  
       2016-11-04 21:50:04 +08:00
    业内常用做法是让客户端模拟浏览器发送 http 请求,也就 shi 一律都用 cookie ,也就不用你说的 token 了
    ericls
        11
    ericls  
       2016-11-04 21:53:51 +08:00 via iPhone
    @zjsxwc cookie 的内容可以就是一个 Token
    ericls
        12
    ericls  
       2016-11-04 21:54:30 +08:00 via iPhone
    Token 要取代的是 session 不是 cookie
    wanganjun
        13
    wanganjun  
    OP
       2016-11-04 21:57:40 +08:00
    @zjsxwc 恩, 好的, 谢谢了
    Phant0m
        14
    Phant0m  
       2016-11-04 22:00:35 +08:00
    token 存储在本地的 local storage 里
    aprikyblue
        15
    aprikyblue  
       2016-11-04 22:08:57 +08:00
    拿 token 放在链接里小心 http referer 头的安全性问题。。
    pynix
        16
    pynix  
       2016-11-04 22:33:08 +08:00
    不是 spa 你搞什么 token
    ericls
        17
    ericls  
       2016-11-05 05:51:30 +08:00
    @pynix 还是有意义的 scale
    ichou
        18
    ichou  
       2016-11-05 10:56:09 +08:00 via iPhone
    用 header 头里的 authorized 字段是可以解决楼主的问题的
    microchang
        19
    microchang  
       2016-11-05 11:04:15 +08:00 via Android
    直接用 jquery 的 ajax 代理所有的 a 标签的网络请求,然后你想怎么玩就怎么玩了
    freestyle
        20
    freestyle  
       2016-11-05 22:04:16 +08:00
    写个 js 函数,给网页上所有的 a 标签 href 属性加上 token.
    https://gist.github.com/hanjm/2102fa5b40d01d0fe64311e37f4d3557
    wanganjun
        21
    wanganjun  
    OP
       2016-11-06 14:17:05 +08:00
    @ichou 我没查到 authorized 字段的说明, 能不能给个链接
    wanganjun
        22
    wanganjun  
    OP
       2016-11-06 14:19:56 +08:00
    @microchang 你说的代理 <a> 的请求是这样吗

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

    按这个代码也只能把 token 放到 url 里面
    ichou
        23
    ichou  
       2016-11-06 15:19:11 +08:00 via iPhone
    参考 jwt auth
    garrydzeng
        24
    garrydzeng  
       2016-11-06 21:58:59 +08:00
    @wanganjun

    看起来只能这样:

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

    另外 ichou 说的是 Authorization 请求头
    详见 RFC7235 ( https://tools.ietf.org/html/rfc7235 )
    lianxiaoyi
        25
    lianxiaoyi  
       2016-11-07 09:28:12 +08:00 via Android
    最近为毛那么多地址癖!最好地址栏什么都不带,但是又能满足我所有的参数!可能麽?
    wanganjun
        26
    wanganjun  
    OP
       2016-11-07 11:46:39 +08:00
    @garrydzeng 如果 ajax 请求回来一个 html 文件该怎么办呢
    wanganjun
        27
    wanganjun  
    OP
       2016-11-07 12:16:38 +08:00
    @garrydzeng 我试了一下, document.write 可以覆盖页面, 但是地址栏没变, 也没办法点后退按钮回到上一个页面, 看来还是要把 token 放到 query 里面
    garrydzeng
        28
    garrydzeng  
       2016-11-08 12:28:37 +08:00
    @wanganjun

    如果不是单页应用
    还是建议用 cookie 来传输 token
    这样在地址上不可见
    用的时候注意防范跨站等等攻击就行了
    简单方便
    XisucksYi
        29
    XisucksYi  
       2020-08-31 18:13:47 +08:00
    参考 GitHub 的 token 格式

    https://[email protected]/xxxx

    知道 token 加到哪里了吗
    XisucksYi
        30
    XisucksYi  
       2020-08-31 18:15:11 +08:00
    @liuxey URL 里的 userinfo 被你吃了吗
    liuxey
        31
    liuxey  
       2020-08-31 19:06:23 +08:00
    @XisucksYi #30 真是一言难尽
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4740 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 01:06 · PVG 09:06 · LAX 17:06 · JFK 20:06
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.