GET 方法有没办法传递 token
有个网站,需要校验是否有权限,判断头部的 token 参数。
但是,直接在浏览器上输入网址后,能否自动头部添加 token 呢?
是不是只有 session+cookie 的方式了。
第 1 条附言 · 19 小时 2 分钟前
网页是服务端渲染,*次 get 请求就需要判断是否有权限,没权限就读取不到数据。
token 不能放在 url 后面,因为这样复制网址给别人就泄漏 token 了。
想到的一个方法是 Get 请求后如果发现没 token,则跳转到一个登录页面,在登录页面判断 localstroge 中是否有存储着 token,有的话把 token 设置到 header 中,然后重新发起请求。
第 2 条附言 · 3 小时 27 分钟前
场景是:网页是文档页面 https://easydoc.net/s/17790664
当前是 vue 做的,要做 SEO,所以准备改为服务端渲染了。
第 3 条附言 · 3 小时 25 分钟前
文档链接随时都可能复制给别人,所以 token 不能在链接中
token 用的是 jwt 生成的,所以有加密。
另外不要说加密了 token 就不会泄露了。
第 4 条附言 · 2 小时 1 分钟前
我一下没反应过来,应该是登录后把 token 存放到 cookie 就好了,对吧各位。
第 5 条附言 · 1 小时 50 分钟前
感谢各位,我想应该是 cookie 中多存一份 token 就可以搞定了。
不过我有还个特殊情况:
文档可以分享,可以设置密码分享,所以每个分享链接都有一个独立的分享 token,如果也是把 token 放入 cookie 中,打开的分享链接多了,token 也会很多,还会每次请求都自动带入到头部,不知道有没更好的解决方法。
token 头部 校验 Session80 条回复 • 2021-06-25 12:28:59 +08:00
lambdaq 1
lambdaq 22 小时 21 分钟前
再发明一个浏览器插件就可以实现了。。。
FaiChou 2
FaiChou 22 小时 21 分钟前
https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Authentication
gefranks 3
gefranks 22 小时 19 分钟前
类似 ModHeader 这样的浏览器插件或者代理,用代理往请求里面塞 header
IvanLi127 4
IvanLi127 22 小时 10 分钟前 ❤️ 2
你没见过尾巴有个 ?token=xxxx 之类的 url 嘛?
kop1989 5
kop1989 22 小时 9 分钟前
没太懂。
1 、手动输入网址?那这个 token 哪来的?
2 、如果是 token 预先就知道,直接写在 url 里传参不就 ok 了?
wanguorui123 6
wanguorui123 22 小时 5 分钟前
header 、URL
malaohu 7
malaohu 21 小时 46 分钟前
整一个中间页 处理一下?
balabalaguguji 8
balabalaguguji 20 小时 50 分钟前
@kop1989 #5 token 在 localstorage 里面,如果是 post,就可以拦截请求,然后插入一个 token 到头部了,但是 get 就没办法了
balabalaguguji 9
balabalaguguji 20 小时 48 分钟前
@IvanLi127 #4 这样会泄漏自己的 token,复制链接给别人就知道 token 了
Yourshell 10
Yourshell 20 小时 10 分钟前
直接用 HTTP 验证不好吗
darknoll 11
darknoll 20 小时 3 分钟前
直接在地址栏里面输入的话只有作为查询参数带过去了,没有其他方法了
RangerWolf 12
RangerWolf 20 小时 3 分钟前
GET 请求也可以带有 header 啊。。。
RangerWolf 13
RangerWolf 20 小时 3 分钟前
请忽视我刚才的发言。。。 没看清题目
balabalaguguji 14
balabalaguguji 19 小时 56 分钟前
@Yourshell #10 能具体说一下吗?
yitingbai 15
yitingbai 19 小时 56 分钟前
有这样的浏览器插件, 可以加 header, 还可以改变 UA
Yourshell 16
Yourshell 19 小时 51 分钟前
@Yourshell 详看二楼的链接
KisekiRemi 17
KisekiRemi 19 小时 46 分钟前
axios 的请求拦截器把 token 塞进去
THESDZ 18
THESDZ 19 小时 46 分钟前
类似 S3 的签名可以吗?
就如果需要访问某一个地址,根据这个地址生成一个有时效的签名?
KisekiRemi 19
KisekiRemi 19 小时 45 分钟前
抱歉没注意看详细需求
TomVista 20
TomVista 19 小时 28 分钟前
token 存进 cookies
yeqizhang 21
yeqizhang 19 小时 18 分钟前 via Android
这标题取的,你这种情况和 get post 没关系啊,只是浏览器地址栏只能 get,是接口就放尾巴上,不过打开一个接口这是什么需求??如果打开网页,还可以将这个网页放行,里边的接口再用 js 加上吧
balabalaguguji 22
balabalaguguji 19 小时 16 分钟前
@yeqizhang #21 是服务端渲染页面,*次 get 请求时就需要知道是否有权限访问,没 token 就没法判断
yeqizhang 23
yeqizhang 19 小时 13 分钟前 via Android
@balabalaguguji 那只能加尾巴或者 cookie 了
balabalaguguji 24
balabalaguguji 19 小时 6 分钟前
@malaohu #7 嗯,整个中间页应该是可以的
balabalaguguji 25
balabalaguguji 19 小时 5 分钟前
@yitingbai #15 面对所有用户的网页,不能依赖插件
balabalaguguji 26
balabalaguguji 19 小时 0 分钟前
@Yourshell #16 这个方式好像是弹出系统的登录框?怎么设置 token 到头部还是没看懂
iceheart 27
iceheart 18 小时 56 分钟前 via Android
cookie 被设计出来就是干这个的
baobao1270 28
baobao1270 15 小时 55 分钟前
jwt?
hjiang 29
hjiang 14 小时 33 分钟前
在古代,cookie 还没有被发明的时候,程序员就是在 URL 后面加上 sid=xxxxxxxxx 这样的方式记录登录状态的。
当然,这样是安全性*差的。
dangyuluo 30
dangyuluo 13 小时 19 分钟前
GET 请求也是可以有 body 的,不过默认浏览器不会用。你写个浏览器就可以了。。
xiadong1994 31
xiadong1994 11 小时 49 分钟前 ❤️ 1
你倒是说为啥不用 session+cookie 啊
nvkou 32
nvkou 11 小时 2 分钟前 via Android
等等…就算是服务器渲染也可以加脚本吧。现在还有不用 xhr 的网站?
ThomasTrainset 33
ThomasTrainset 5 小时 48 分钟前 via iPhone
让用户装插件不现实,我觉得你可以把 token 拆成几部分,混淆到 url 里,取的时候按照一定规则取就好了,有需要的话,再将这种 token 失效时间搞的短一点。
ladypxy 34
ladypxy 5 小时 42 分钟前
URL 里加参数啊
liuidetmks 35
liuidetmks 5 小时 4 分钟前
我也很烦在 head 里面设置 token 的接口,
每次出问题,想调试起来非常不方便。
但是后端大佬定的,没得法
Quarter 36
Quarter 4 小时 51 分钟前 via iPhone
感觉这种自动添加的浏览器打开 URL 的好像只有 cookie 的方式,cookie 会每次请求自动添加到 header,其他的好像都需要处理
LiuJiang 37
LiuJiang 4 小时 49 分钟前
@balabalaguguji 不能做加密操作?
Quarter 38
Quarter 4 小时 43 分钟前 via iPhone
然后至于 token 的放在 URL 里面被窃取,我觉得有两种方式
一种,加上 token 和 IP 绑定,这样如果 token 被窃取,但是网络环境不一样可以防御一些,但是无法防御在同一公网出口的情况
另一种就是 vue 的方式,加载统一入口,然后通过 ajax 获取动态路由或者其他的路由方法鉴别权限,这样不用拦截前端界面,由前端自行判断拦截,后端主要做接口拦截,前端在统一做接口处理,如果未授权就跳转无权限界面,如果未登录跳转登录界面
JKeita 39
JKeita 4 小时 34 分钟前
我们公司有个后台就是需要在浏览器插件里面添加 header,应该是一个样。
balabalaguguji 40
balabalaguguji 4 小时 27 分钟前
@xiadong1994 #31 因为网站一早就是用的 token 现在某些页面改为服务端渲染才遇到这个问题,另外 token 更好做负载均衡等
liyunyang 41
liyunyang 4 小时 27 分钟前
连接后面加 jwt 认证,token 加密在里面
balabalaguguji 42
balabalaguguji 4 小时 26 分钟前
@liyunyang #41 没看清题目哦,不能放链接后面,不管有没加密。
Felldeadbird 43
Felldeadbird 4 小时 25 分钟前
我一般丢 URL 。简单粗暴,确保 SSL 环境即可。时效一般不长。如果要提高安全性,就结合唯一指纹,时间,拆分伪装。
balabalaguguji 44
balabalaguguji 4 小时 24 分钟前
@Felldeadbird #43 如果已经登录过了,第二天用户输入 url 后还要自己输入自己的 token,多不现实。
dbpe 45
dbpe 4 小时 20 分钟前
@balabalaguguji session 是基于 cookie 的..早期一些移动设备不支持 cookie 的,那么 tooken 就诞生了…
PS:没登录不应该是提示没权限么..怎么就白屏了..
falcon05 46
falcon05 4 小时 14 分钟前 via iPhone
用不用 token 跟用不用 cookie 是两码事,token 可以存放在 cookie,也可以存放在 local storage 。
lusi1990 47
lusi1990 4 小时 10 分钟前
听大家的 先搞懂 cookie , session, token 的概念
balabalaguguji 48
balabalaguguji 4 小时 5 分钟前
@lusi1990 #47 你先读懂题目
xwayway 49
xwayway 4 小时 0 分钟前
你的 url 是直接走的接口?不是的话,应该是前端页面吧,到了你页面,你在页面内 js 去处理就行了啊。虽然不太熟悉现在 vue 什么的的逻辑。但是写过老式的 jq 那套,可以在页面 load 的时候,去读取 localstorage,判断有没有 token 啊。拿到了 token 再去请求后端接口。没有去登录页面,难道不都是这么做的?
balabalaguguji 50
balabalaguguji 3 小时 54 分钟前
@xwayway #49 是服务端渲染的页面,所以*步是到了服务端,得判断是否有权限然后才决定是否渲染数据。
pkoukk 51
pkoukk 3 小时 53 分钟前
token 为啥不能放进链接里?放哪儿不都会泄露?我们理解的 token 是用户输入自己的秘钥之后,服务端返回的有时效性的一个 Id.
如果你要限制 token 的使用范围,不希望复制就会泄露,那很简单啊,服务端对 token 做管理,ip mac 限定这个 token 必须和申请时相同就行。
cloverzrg2 52
cloverzrg2 3 小时 48 分钟前
业务场景是啥,你这可能是 XY 问题
balabalaguguji 53
balabalaguguji 3 小时 46 分钟前
@pkoukk #51 复制页面地址给别人后,是不是 token 就泄露了,地址是可以方便复制分享的。
NillSpake 54
NillSpake 3 小时 42 分钟前
服务器点对点访问,代理一波,nginx 开放访问,通过 lua 或者手动修改 header 请求头,追加参数
Anshi 55
Anshi 3 小时 39 分钟前
这是要获取页面的那个 get 请求也能携带身份信息吧,这个请求一般是浏览器自己发出的吧,不用 cookie 还真不知道有啥办法。。。
balabalaguguji 56
balabalaguguji 3 小时 39 分钟前
@NillSpake #54 没了解过,但是这样你怎么拿到 token,特别是用过了几天后再来访问,localstorage 里面是还有 token 的,nginx 里面你怎么拿到
balabalaguguji 57
balabalaguguji 3 小时 38 分钟前
@Anshi #55 直接输入地址要在头部带东西,似乎只有 cookie 了。不然就做中间页做判断。
SmiteChow 58
SmiteChow 3 小时 34 分钟前
Basic Auth
passerbytiny 59
passerbytiny 3 小时 31 分钟前 via Android
你*好补充一个说明,目前不知道你的问题是哪一种。是通过地址栏输入 URL *次访问的时候 Header 中没有 Token,还是因为服务器端渲染每个 GET 请求都没 TOKEN 。
balabalaguguji 60
balabalaguguji 3 小时 22 分钟前
@passerbytiny #59 已经补充了,看上面 append 。已经登录过了,后面手动输入地址在浏览器访问时如何自动设置 token 到头部。
Rheinmetal 61
Rheinmetal 3 小时 21 分钟前
需求的核心逻辑不清楚 没法给可用方案
Felldeadbird 62
Felldeadbird 3 小时 16 分钟前
@balabalaguguji 肯定不用用户手动输入了。以小程序为例,我是放在 local storage 。里面有时效和设备信息。然后和小程序官网的设备信息校验。
在鉴权方面,根据接口的情况,选用 GET OR POST 形式把 TOKEN 从 local storage 带过去。一般来说,会封装好一个请求方法,里面自带鉴权 TOKEN 提交。
feifeichen 63
feifeichen 3 小时 6 分钟前
浏览器里域名对应的储存不就是 cookie 和 storage 数据库,但是只有 cookie 是浏览器自动添加的,你不想用 cookie 。用户浏览器输入的域名又不会走脚本,不就只有访问到的这个地址去进行操作。判断跳转中间页那个实现方法比较现实点
NillSpake 64
NillSpake 3 小时 5 分钟前
@balabalaguguji 中间件,redis 等等。。,你可以后台操作 token 时效
jsq2627 65
jsq2627 3 小时 4 分钟前
有一说一,拦截 get 请求、附加 header 用 service worker 能实现
只是这需求,放着 cookie 不用干嘛
xwayway 66
xwayway 3 小时 1 分钟前
@balabalaguguji 非要这么搞的话,我觉得可以用 cookie 了,后端加个兼容逻辑就行了,header 取不到 token,再取 cookie 中的嘛,都没有才走认证逻辑
xwayway 67
xwayway 2 小时 59 分钟前
@balabalaguguji 也不一定是后端做,在 nginx 做就行了,如果 header 中没有 token,从 cookie 中取出来,放 header 里面就行了
passerbytiny 68
passerbytiny 2 小时 58 分钟前 via Android
@balabalaguguji 你的真实问题是不是:GET 时,怎么将 localstorage 中保存的 Token,带到 Header 上。
地址栏输入地址的 GET,跟代码调起来的 GET,大概也就这一点区别。而且这问题不只发生在地址栏访问上,点击超链接的跳转同样会发生该问题。
fgk 69
fgk 2 小时 57 分钟前
@xwayway 我也觉得这个业务场景,cookie 就可以满足了,不用 token 了
ysc3839 70
ysc3839 2 小时 54 分钟前 via Android
把 token 放在 cookie 里不行吗?一样是在 header 里面传给后端。
no1xsyzy 71
no1xsyzy 2 小时 48 分钟前 ❤️ 2
一个 SPA 改 SSR ?
服务器在浏览器上存数据,就是 cookies localstorage idb 三剑客,后面两个只能 js 访问
没权限就白屏,还 SEO,那搜索引擎的 spider 哪来的权限呢?
你就当没权限的渲染,然后渐进地提供需要 token 的部分啊?
beichenhpy 72
beichenhpy 2 小时 31 分钟前
套一个 iframe 行吗
zhaol 73
zhaol 2 小时 31 分钟前
@no1xsyzy #71 按他这么说,就必须一开始就有 token,不然这网页没得玩。我实在没理解他的需求。难道本不应该就存在没权限情况下的判断嘛,按那个逻辑继续处理不就行了?
balabalaguguji 74
balabalaguguji 2 小时 3 分钟前
@zhaol #73 没登录过就直接跳转到登录页面了,这个没什么争论所以不讨论。只讨论已登录情况
balabalaguguji 75
balabalaguguji 2 小时 2 分钟前
@falcon05 #46 之前是放在 localstorage 里的,嗯,我应该把它改为放在 cookie 就可以了。
balabalaguguji 76
balabalaguguji 1 小时 56 分钟前
@xwayway #66 嗯,cookie 中多存一份 token,这种方式感觉挺好。不过还有个问题,我分享项目时用的是分享 token 每个项目都会有一个,如果也用 cookie 来存储这些分享 token,打开很多个项目的分享页面后 token 就会很多了。
balabalaguguji 77
balabalaguguji 1 小时 55 分钟前
@ysc3839 #70 嗯,你点醒了我,我之前一直想着 cookie 是配合 session 用的,用来存储 session id 的,怎么就没想到可以存 token 呢(哭)
no1xsyzy 78
no1xsyzy 1 小时 47 分钟前
@balabalaguguji #74 根据附言 2,你不是在做 SEO 吗?
可是搜索引擎的 spider 访问你,你直接跳转登录界面了,那不是白瞎?也就是说实际情况,如果我猜的没错的话,是「部分页面需要权限,则跳转登录页,部分页面公开访问,需要做 SEO 」
那我还是推荐一下渐进式体验。
#76 你可以把所有的项目分二级域名或者子目录,cookies token 存到对应下面。
pluvet 79
pluvet 1 小时 32 分钟前
用 url 传也可以,但是 token 做成动态的,类似 2fa
balabalaguguji 80
balabalaguguji 1 小时 18 分钟前
@no1xsyzy #78 是的,部分页面是完全公开不需要授权的