V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
balabalaguguji
V2EX  ›  程序员

GET 方法有没办法传递 token

  •  1
     
  •   balabalaguguji · 212 天前 · 6630 次点击
    这是一个创建于 212 天前的主题,其中的信息可能已经有所发展或是发生改变。

    有个网站,需要校验是否有权限,判断头部的 token 参数。

    但是,直接在浏览器上输入网址后,能否自动头部添加 token 呢?

    是不是只有 session+cookie 的方式了。

    第 1 条附言  ·  212 天前
    网页是服务端渲染,第一次 get 请求就需要判断是否有权限,没权限就读取不到数据。
    token 不能放在 url 后面,因为这样复制网址给别人就泄漏 token 了。

    想到的一个方法是 Get 请求后如果发现没 token,则跳转到一个登录页面,在登录页面判断 localstroge 中是否有存储着 token,有的话把 token 设置到 header 中,然后重新发起请求。
    第 2 条附言  ·  211 天前
    场景是:网页是文档页面 https://easydoc.net/s/17790664
    当前是 vue 做的,要做 SEO,所以准备改为服务端渲染了。
    第 3 条附言  ·  211 天前
    文档链接随时都可能复制给别人,所以 token 不能在链接中
    token 用的是 jwt 生成的,所以有加密。
    另外不要说加密了 token 就不会泄露了。
    第 4 条附言  ·  211 天前
    我一下没反应过来,应该是登录后把 token 存放到 cookie 就好了,对吧各位。
    第 5 条附言  ·  211 天前
    感谢各位,我想应该是 cookie 中多存一份 token 就可以搞定了。

    不过我有还个特殊情况:
    文档可以分享,可以设置密码分享,所以每个分享链接都有一个独立的分享 token,如果也是把 token 放入 cookie 中,打开的分享链接多了,token 也会很多,还会每次请求都自动带入到头部,不知道有没更好的解决方法。
    80 条回复    2021-06-25 12:28:59 +08:00
    lambdaq
        1
    lambdaq  
       212 天前
    再发明一个浏览器插件就可以实现了。。。
    gefranks
        3
    gefranks  
       212 天前
    类似 ModHeader 这样的浏览器插件或者代理,用代理往请求里面塞 header
    IvanLi127
        4
    IvanLi127  
       212 天前   ❤️ 2
    你没见过尾巴有个 ?token=xxxx 之类的 url 嘛?
    kop1989
        5
    kop1989  
       212 天前
    没太懂。
    1 、手动输入网址?那这个 token 哪来的?
    2 、如果是 token 预先就知道,直接写在 url 里传参不就 ok 了?
    wanguorui123
        6
    wanguorui123  
       212 天前
    header 、URL
    malaohu
        7
    malaohu  
       212 天前
    整一个中间页 处理一下?
    balabalaguguji
        8
    balabalaguguji  
    OP
       212 天前
    @kop1989 #5 token 在 localstorage 里面,如果是 post,就可以拦截请求,然后插入一个 token 到头部了,但是 get 就没办法了
    balabalaguguji
        9
    balabalaguguji  
    OP
       212 天前
    @IvanLi127 #4 这样会泄漏自己的 token,复制链接给别人就知道 token 了
    Yourshell
        10
    Yourshell  
       212 天前
    直接用 HTTP 验证不好吗
    darknoll
        11
    darknoll  
       212 天前
    直接在地址栏里面输入的话只有作为查询参数带过去了,没有其他方法了
    RangerWolf
        12
    RangerWolf  
       212 天前
    GET 请求也可以带有 header 啊。。。
    RangerWolf
        13
    RangerWolf  
       212 天前
    请忽视我刚才的发言。。。 没看清题目
    balabalaguguji
        14
    balabalaguguji  
    OP
       212 天前
    @Yourshell #10 能具体说一下吗?
    yitingbai
        15
    yitingbai  
       212 天前
    有这样的浏览器插件, 可以加 header, 还可以改变 UA
    Yourshell
        16
    Yourshell  
       212 天前
    @Yourshell 详看二楼的链接
    KisekiRemi
        17
    KisekiRemi  
       212 天前
    axios 的请求拦截器把 token 塞进去
    THESDZ
        18
    THESDZ  
       212 天前
    类似 S3 的签名可以吗?
    就如果需要访问某一个地址,根据这个地址生成一个有时效的签名?
    KisekiRemi
        19
    KisekiRemi  
       212 天前
    抱歉没注意看详细需求
    TomVista
        20
    TomVista  
       212 天前
    token 存进 cookies
    yeqizhang
        21
    yeqizhang  
       212 天前 via Android
    这标题取的,你这种情况和 get post 没关系啊,只是浏览器地址栏只能 get,是接口就放尾巴上,不过打开一个接口这是什么需求??如果打开网页,还可以将这个网页放行,里边的接口再用 js 加上吧
    balabalaguguji
        22
    balabalaguguji  
    OP
       212 天前
    @yeqizhang #21 是服务端渲染页面,第一次 get 请求时就需要知道是否有权限访问,没 token 就没法判断
    yeqizhang
        23
    yeqizhang  
       212 天前 via Android
    @balabalaguguji 那只能加尾巴或者 cookie 了
    balabalaguguji
        24
    balabalaguguji  
    OP
       212 天前
    @malaohu #7 嗯,整个中间页应该是可以的
    balabalaguguji
        25
    balabalaguguji  
    OP
       212 天前
    @yitingbai #15 面对所有用户的网页,不能依赖插件
    balabalaguguji
        26
    balabalaguguji  
    OP
       212 天前
    @Yourshell #16 这个方式好像是弹出系统的登录框?怎么设置 token 到头部还是没看懂
    iceheart
        27
    iceheart  
       212 天前 via Android
    cookie 被设计出来就是干这个的
    baobao1270
        28
    baobao1270  
       212 天前
    jwt?
    hjiang
        29
    hjiang  
       212 天前
    在古代,cookie 还没有被发明的时候,程序员就是在 URL 后面加上 sid=xxxxxxxxx 这样的方式记录登录状态的。

    当然,这样是安全性极差的。
    dangyuluo
        30
    dangyuluo  
       212 天前
    GET 请求也是可以有 body 的,不过默认浏览器不会用。你写个浏览器就可以了。。
    xiadong1994
        31
    xiadong1994  
       212 天前   ❤️ 1
    你倒是说为啥不用 session+cookie 啊
    nvkou
        32
    nvkou  
       211 天前 via Android
    等等…就算是服务器渲染也可以加脚本吧。现在还有不用 xhr 的网站?
    ThomasTrainset
        33
    ThomasTrainset  
       211 天前 via iPhone
    让用户装插件不现实,我觉得你可以把 token 拆成几部分,混淆到 url 里,取的时候按照一定规则取就好了,有需要的话,再将这种 token 失效时间搞的短一点。
    ladypxy
        34
    ladypxy  
       211 天前
    URL 里加参数啊
    liuidetmks
        35
    liuidetmks  
       211 天前
    我也很烦在 head 里面设置 token 的接口,

    每次出问题,想调试起来非常不方便。

    但是后端大佬定的,没得法
    Quarter
        36
    Quarter  
       211 天前 via iPhone
    感觉这种自动添加的浏览器打开 URL 的好像只有 cookie 的方式,cookie 会每次请求自动添加到 header,其他的好像都需要处理
    LiuJiang
        37
    LiuJiang  
       211 天前
    @balabalaguguji 不能做加密操作?
    Quarter
        38
    Quarter  
       211 天前 via iPhone
    然后至于 token 的放在 URL 里面被窃取,我觉得有两种方式

    一种,加上 token 和 IP 绑定,这样如果 token 被窃取,但是网络环境不一样可以防御一些,但是无法防御在同一公网出口的情况

    另一种就是 vue 的方式,加载统一入口,然后通过 ajax 获取动态路由或者其他的路由方法鉴别权限,这样不用拦截前端界面,由前端自行判断拦截,后端主要做接口拦截,前端在统一做接口处理,如果未授权就跳转无权限界面,如果未登录跳转登录界面
    JKeita
        39
    JKeita  
       211 天前
    我们公司有个后台就是需要在浏览器插件里面添加 header,应该是一个样。
    balabalaguguji
        40
    balabalaguguji  
    OP
       211 天前
    @xiadong1994 #31 因为网站一早就是用的 token 现在某些页面改为服务端渲染才遇到这个问题,另外 token 更好做负载均衡等
    liyunyang
        41
    liyunyang  
       211 天前
    连接后面加 jwt 认证,token 加密在里面
    balabalaguguji
        42
    balabalaguguji  
    OP
       211 天前
    @liyunyang #41 没看清题目哦,不能放链接后面,不管有没加密。
    Felldeadbird
        43
    Felldeadbird  
       211 天前
    我一般丢 URL 。简单粗暴,确保 SSL 环境即可。时效一般不长。如果要提高安全性,就结合唯一指纹,时间,拆分伪装。
    balabalaguguji
        44
    balabalaguguji  
    OP
       211 天前
    @Felldeadbird #43 如果已经登录过了,第二天用户输入 url 后还要自己输入自己的 token,多不现实。
    dbpe
        45
    dbpe  
       211 天前
    @balabalaguguji session 是基于 cookie 的..早期一些移动设备不支持 cookie 的,那么 tooken 就诞生了...


    PS:没登录不应该是提示没权限么..怎么就白屏了..
    falcon05
        46
    falcon05  
       211 天前 via iPhone
    用不用 token 跟用不用 cookie 是两码事,token 可以存放在 cookie,也可以存放在 local storage 。
    lusi1990
        47
    lusi1990  
       211 天前
    听大家的 先搞懂 cookie , session, token 的概念
    balabalaguguji
        48
    balabalaguguji  
    OP
       211 天前
    @lusi1990 #47 你先读懂题目
    xwayway
        49
    xwayway  
       211 天前
    你的 url 是直接走的接口?不是的话,应该是前端页面吧,到了你页面,你在页面内 js 去处理就行了啊。虽然不太熟悉现在 vue 什么的的逻辑。但是写过老式的 jq 那套,可以在页面 load 的时候,去读取 localstorage,判断有没有 token 啊。拿到了 token 再去请求后端接口。没有去登录页面,难道不都是这么做的?
    balabalaguguji
        50
    balabalaguguji  
    OP
       211 天前
    @xwayway #49 是服务端渲染的页面,所以第一步是到了服务端,得判断是否有权限然后才决定是否渲染数据。
    pkoukk
        51
    pkoukk  
       211 天前
    token 为啥不能放进链接里?放哪儿不都会泄露?我们理解的 token 是用户输入自己的秘钥之后,服务端返回的有时效性的一个 Id.
    如果你要限制 token 的使用范围,不希望复制就会泄露,那很简单啊,服务端对 token 做管理,ip mac 限定这个 token 必须和申请时相同就行。
    cloverzrg2
        52
    cloverzrg2  
       211 天前
    业务场景是啥,你这可能是 XY 问题
    balabalaguguji
        53
    balabalaguguji  
    OP
       211 天前
    @pkoukk #51 复制页面地址给别人后,是不是 token 就泄露了,地址是可以方便复制分享的。
    NillSpake
        54
    NillSpake  
       211 天前
    服务器点对点访问,代理一波,nginx 开放访问,通过 lua 或者手动修改 header 请求头,追加参数
    Anshi
        55
    Anshi  
       211 天前
    这是要获取页面的那个 get 请求也能携带身份信息吧,这个请求一般是浏览器自己发出的吧,不用 cookie 还真不知道有啥办法。。。
    balabalaguguji
        56
    balabalaguguji  
    OP
       211 天前
    @NillSpake #54 没了解过,但是这样你怎么拿到 token,特别是用过了几天后再来访问,localstorage 里面是还有 token 的,nginx 里面你怎么拿到
    balabalaguguji
        57
    balabalaguguji  
    OP
       211 天前
    @Anshi #55 直接输入地址要在头部带东西,似乎只有 cookie 了。不然就做中间页做判断。
    SmiteChow
        58
    SmiteChow  
       211 天前
    Basic Auth
    passerbytiny
        59
    passerbytiny  
       211 天前 via Android
    你最好补充一个说明,目前不知道你的问题是哪一种。是通过地址栏输入 URL 第一次访问的时候 Header 中没有 Token,还是因为服务器端渲染每个 GET 请求都没 TOKEN 。
    balabalaguguji
        60
    balabalaguguji  
    OP
       211 天前
    @passerbytiny #59 已经补充了,看上面 append 。已经登录过了,后面手动输入地址在浏览器访问时如何自动设置 token 到头部。
    Rheinmetal
        61
    Rheinmetal  
       211 天前
    需求的核心逻辑不清楚 没法给可用方案
    Felldeadbird
        62
    Felldeadbird  
       211 天前
    @balabalaguguji 肯定不用用户手动输入了。以小程序为例,我是放在 local storage 。里面有时效和设备信息。然后和小程序官网的设备信息校验。

    在鉴权方面,根据接口的情况,选用 GET OR POST 形式把 TOKEN 从 local storage 带过去。一般来说,会封装好一个请求方法,里面自带鉴权 TOKEN 提交。
    feifeichen
        63
    feifeichen  
       211 天前
    浏览器里域名对应的储存不就是 cookie 和 storage 数据库,但是只有 cookie 是浏览器自动添加的,你不想用 cookie 。用户浏览器输入的域名又不会走脚本,不就只有访问到的这个地址去进行操作。判断跳转中间页那个实现方法比较现实点
    NillSpake
        64
    NillSpake  
       211 天前
    @balabalaguguji 中间件,redis 等等。。,你可以后台操作 token 时效
    jsq2627
        65
    jsq2627  
       211 天前
    有一说一,拦截 get 请求、附加 header 用 service worker 能实现
    只是这需求,放着 cookie 不用干嘛
    xwayway
        66
    xwayway  
       211 天前
    @balabalaguguji 非要这么搞的话,我觉得可以用 cookie 了,后端加个兼容逻辑就行了,header 取不到 token,再取 cookie 中的嘛,都没有才走认证逻辑
    xwayway
        67
    xwayway  
       211 天前
    @balabalaguguji 也不一定是后端做,在 nginx 做就行了,如果 header 中没有 token,从 cookie 中取出来,放 header 里面就行了
    passerbytiny
        68
    passerbytiny  
       211 天前 via Android
    @balabalaguguji 你的真实问题是不是:GET 时,怎么将 localstorage 中保存的 Token,带到 Header 上。

    地址栏输入地址的 GET,跟代码调起来的 GET,大概也就这一点区别。而且这问题不只发生在地址栏访问上,点击超链接的跳转同样会发生该问题。
    fgk
        69
    fgk  
       211 天前
    @xwayway 我也觉得这个业务场景,cookie 就可以满足了,不用 token 了
    ysc3839
        70
    ysc3839  
       211 天前 via Android
    把 token 放在 cookie 里不行吗?一样是在 header 里面传给后端。
    no1xsyzy
        71
    no1xsyzy  
       211 天前   ❤️ 2
    一个 SPA 改 SSR ?

    服务器在浏览器上存数据,就是 cookies localstorage idb 三剑客,后面两个只能 js 访问

    没权限就白屏,还 SEO,那搜索引擎的 spider 哪来的权限呢?
    你就当没权限的渲染,然后渐进地提供需要 token 的部分啊?
    beichenhpy
        72
    beichenhpy  
       211 天前
    套一个 iframe 行吗
    zhaol
        73
    zhaol  
       211 天前
    @no1xsyzy #71 按他这么说,就必须一开始就有 token,不然这网页没得玩。我实在没理解他的需求。难道本不应该就存在没权限情况下的判断嘛,按那个逻辑继续处理不就行了?
    balabalaguguji
        74
    balabalaguguji  
    OP
       211 天前
    @zhaol #73 没登录过就直接跳转到登录页面了,这个没什么争论所以不讨论。只讨论已登录情况
    balabalaguguji
        75
    balabalaguguji  
    OP
       211 天前
    @falcon05 #46 之前是放在 localstorage 里的,嗯,我应该把它改为放在 cookie 就可以了。
    balabalaguguji
        76
    balabalaguguji  
    OP
       211 天前
    @xwayway #66 嗯,cookie 中多存一份 token,这种方式感觉挺好。不过还有个问题,我分享项目时用的是分享 token 每个项目都会有一个,如果也用 cookie 来存储这些分享 token,打开很多个项目的分享页面后 token 就会很多了。
    balabalaguguji
        77
    balabalaguguji  
    OP
       211 天前
    @ysc3839 #70 嗯,你点醒了我,我之前一直想着 cookie 是配合 session 用的,用来存储 session id 的,怎么就没想到可以存 token 呢(哭)
    no1xsyzy
        78
    no1xsyzy  
       211 天前
    @balabalaguguji #74 根据附言 2,你不是在做 SEO 吗?
    可是搜索引擎的 spider 访问你,你直接跳转登录界面了,那不是白瞎?也就是说实际情况,如果我猜的没错的话,是「部分页面需要权限,则跳转登录页,部分页面公开访问,需要做 SEO 」
    那我还是推荐一下渐进式体验。

    #76 你可以把所有的项目分二级域名或者子目录,cookies token 存到对应下面。
    pluvet
        79
    pluvet  
       211 天前
    用 url 传也可以,但是 token 做成动态的,类似 2fa
    balabalaguguji
        80
    balabalaguguji  
    OP
       211 天前
    @no1xsyzy #78 是的,部分页面是完全公开不需要授权的
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1418 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 18:17 · PVG 02:17 · LAX 10:17 · JFK 13:17
    ♥ Do have faith in what you're doing.