wanganjun
V2EX  ›  Node.js

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

  •  
  •   wanganjun · Nov 4, 2016 · 20916 views
    This topic created in 3656 days ago, the information mentioned may be changed or developed.
    新手, 之前学别人博客的东西用 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 replies  •  2020-08-31 19:06:23 +08:00
    learnshare
    learnshare
    Nov 4, 2016
    1
    token 保存在本地, cookie 是一个简单的位置
    auin
    auin
    Nov 4, 2016
    2
    浏览器不会把 token 自动加到请求里,因为这是你自己创建的东西,不属于 HTTP 协议的一部分,如果是为了学习,可以这么干,如果是为了使用,那完全没必要;

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

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

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

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

    按这个代码也只能把 token 放到 url 里面
    ichou
    ichou
    Nov 6, 2016 via iPhone
    23
    参考 jwt auth
    garrydzeng
    garrydzeng
    Nov 6, 2016
    24
    @wanganjun

    看起来只能这样:

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

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

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

    https://[email protected]/xxxx

    知道 token 加到哪里了吗
    XisucksYi
    XisucksYi
    Aug 31, 2020
    30
    @liuxey URL 里的 userinfo 被你吃了吗
    auin
    auin
    Aug 31, 2020
    31
    @XisucksYi #30 真是一言难尽
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   587 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 46ms · UTC 19:13 · PVG 03:13 · LAX 11:13 · JFK 14:13
    ♥ Do have faith in what you're doing.