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

GET 方法有没办法传递 token

  •  1
     
  •   balabalaguguji · 2021-06-24 15:23:47 +08:00 · 8636 次点击
    这是一个创建于 1009 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

    #76 你可以把所有的项目分二级域名或者子目录,cookies token 存到对应下面。
    pluvet
        79
    pluvet  
       2021-06-25 12:14:08 +08:00
    用 url 传也可以,但是 token 做成动态的,类似 2fa
    balabalaguguji
        80
    balabalaguguji  
    OP
       2021-06-25 12:28:59 +08:00
    @no1xsyzy #78 是的,部分页面是完全公开不需要授权的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2774 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 12:19 · PVG 20:19 · LAX 05:19 · JFK 08:19
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.