如何让每个Http请求都自动带上token

目录
  • 让每个Http请求都自动带上token
    • 1.将token放到cookie中
    • 2.将token放到某个http请求的header中
    • 3.使用哪种方式更好呢?
  • token一般存放在哪里
    • Token是什么?
    • Token存放位置
    • Token 放在 cookie、localStorage、sessionStorage中的不同点?
  • 总结

让每个Http请求都自动带上token

1.将token放到cookie中

这样每个http请求就都可以带上token信息了。

access_token="eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJhWExsdzZEM1pJNWtkSDc2UUdGdVVtc0h1ckFKRTJXeGlZMDF3QmVKYTMwIn0......";
document.cookie = "keycloakToken=" + access_token;

下面以Django的中间件为例,看看后端是怎样从request中得到token信息。

if not request.META.get('HTTP_COOKIE'): #判断有没有cookie信息。
    print("Debug: can't get the cookie keycloak token");
    return JsonResponse({"detail": NotAuthenticated.default_detail},
        status=NotAuthenticated.status_code)
else:
        if "keycloakToken" in request.COOKIES: # request.COOKIES是字典类型,判断其中是否有keycloakToken这个key
        accessToken =request.COOKIES["keycloakToken"]; #从cookie中取得token信息。
            print("Debug: the request token in cookie is: " + accessToken);
        else:
            return JsonResponse({"res": "1", "resMsg": "No Token Provided"},status=401)

2.将token放到某个http请求的header中

var token="eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJhWExsdzZEM1pJNWtkSDc2UUdGdVVtc0h1ckFKRTJXeGlZMDF3QmVKYTMwIn0........";  
 
prepareHeaders() {
  return new Headers({
    'Content-Type': 'application/json; charset=UTF-8',
    'Authorization': 'Bearer ' + token
  });
}
 
addProduct(body: any): Observable<any> {
  return this.http.post(`${this.backendUrl}/api/project/`, body, { headers: this.prepareHeaders() }).map(this.extractData);
}

下面同样以Django的中间件为例,看看后端是怎样从request中得到token信息。

#使用key HTTP_AUTHORIZATION从header中获取token信息。
auth_header = request.META.get('HTTP_AUTHORIZATION').split()
accessToken = auth_header[1] if len(auth_header) == 2 else auth_header[0]

以上只是以token为例,当然了,除了token,可以带上任何你想带的信息。

3.使用哪种方式更好呢?

为了避开CSRF(跨站请求伪造)攻击,请使用第二种方式,发送请求的时候不要将Token放到cookie这个header里,而应该放到自定义的header里。

token一般存放在哪里

Token一般是存放在哪里? Token放在cookie和放在localStorage、sessionStorage中有什么不同?

Token是什么?

Token 其实就是访问资源对凭证。一般是用户通过用户名和密码登录成功之后,服务器将登录凭证做数字签名,加密之后得到的字符串作为token。

Token存放位置

Token 其实就是访问资源对凭证。一般是用户通过用户名和密码登录成功之后,服务器将登录凭证做数字签名,加密之后得到的字符串作为token。

它在用户登录成功之后会返回给客户端,客户端主要以下几种存储方式:

1、存储在localStorage中,每次调用接口的时候都把它当成一个字段传给后台

2、存储在cookie中,让它自动发送,不过缺点就是不能跨域

3、拿到之后存储在localStorage中,每次调用接口的时候放在HTTP请求头的Authorization字段里面。token 在客户端一般存放于localStorage、cookie、或sessionStorage中。

Token 放在 cookie、localStorage、sessionStorage中的不同点?

将Token存储于localStorage或 sessionStorage

Web存储(localStorage/sessionStorage)可以通过同一域商Javascript访问。这意味着任何在你的网站上的运行的JavaScript都可以访问Web存储,所以容易受到XSS攻击。尤其是项目中用到了很多第三方JavaScript类库。

为了防止XSS,一般的处理是避开和编码所有不可信的数据。但这并不能百分百防止XSS。比如我们使用托管在CDN或者其它一些公共的JavaScript库,还有像npm这样的包管理器导入别人的代码到我们的应用程序中。

如果你使用的脚本中有一个被盗用了怎么办?恶意的JavaScript可以嵌入到页面上,并且Web存储被盗用。这些类型的XSS攻击可以得到每个人的Web存储来访问你的网站。

这也是为什么许多组织建议不要在Web存储中存储任何有价值或信任任何Web存储中的信息。 这包括会话标识符和令牌。作为一种存储机制,Web存储在传输过程中不强制执行任何安全标准。

XSS攻击:Cross-Site Scripting(跨站脚本攻击)简称XSS,是一种代码注入攻击。攻击者通过在目标网站注入恶意脚本,使之在用户的浏览器上运行。利用这些恶意脚本,攻击者可以获取用户的敏感信息如Cookie、SessionID等,进而危害数据安全。

将Token存储与cookie

  • 优点:可以制定httponly,来防止被JavaScript读取,也可以制定secure,来保证token只在HTTPS下传输。
  • 缺点:不符合Restful 最佳实践。 容易遭受CSRF攻击(可以在服务器端检查Refer和Origin)

CSRF:跨站请求伪造,简单的说,是攻击者通过一些技术手段欺骗用户的浏览器去访问一个自己曾经认证过的网站并运行一些操作(如:发邮件、发信息、甚至财产操作如转账和购买商品)。由于浏览器曾经认证过,所以被访问的网站会认为是真正的用户操作而去运行。这利用了web中用户身份验证的一个漏洞:简单的身份验证职能保证请求发自某个用户的浏览器,却不能保证请求本身是用户自愿发出去的。CSRF并不能够拿到用户的任何信息,它只是欺骗用户浏览器,让其以用户的名义进行操作。

小结一下:

关于token 存在cookie还是localStorage有两个观点:

支持Cookie的开发人员会强烈建议不要将敏感信息(例如JWT)存储在localStorage中,因为它对于XSS毫无抵抗力。

支持localStorage的一派则认为:撇开localStorage的各种优点不谈,如果做好适当的XSS防护,收益是远大于风险的。

放在cookie中看似看全,看似“解决”(因为仍然存在XSS的问题)一个问题,却引入了另一个问题(CSRF)

localStorage具有更灵活,更大空间,天然免疫 CSRF的特征。Cookie空间有限,而JWT一半都占用较多字节,而且有时你不止需要存储一个JWT。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • js无痛刷新Token的实现

    这个需求场景很常见,几乎很多项目都会用上,之前项目也实现过,最近刚好有个项目要实现,重新梳理一番. 需求 对于需要前端实现无痛刷新Token,无非就两种: 请求前判断Token是否过期,过期则刷新 请求后根据返回状态判断是否过期,过期则刷新 处理逻辑 实现起来也没多大差别,只是判断的位置不一样,核心原理都一样: 判断Token是否过期 没过期则正常处理 过期则发起刷新Token的请求 拿到新的Token保存 重新发送Token过期这段时间内发起的请求 重点: 保持Token过期这段时间发起请求状

  • Postman模拟发送带token的请求方法

    Postman模拟发送带token的请求方法 1)google浏览器中安装扩展程序Interceptor 2)Postman中开启Interceptor即可 以上这篇Postman模拟发送带token的请求方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们. 您可能感兴趣的文章: PostMan post请求发送Json数据的方法 postman测试post请求参数为json类型的实例讲解

  • token 机制和实现方式

    前言 之前在面试的时候被问到过刷新 token 的问题,其实我对 token 验证机制的细节一直不清楚.新项目和后端的同学商量后使用刷新 token 来实现.本文主要分享一下对 token 机制的理解和实现方式. 登录验证的方式 登录验证一般来说有两个目的,一个是为了安全,一个是为了用户方便.因为 HTTP 是无状态的,所以后端在接受到请求之后并不能知道请求是从哪里来的,但是很多时候我们有验证用户身份的需求,同时前端又有保存用户登录状态的需求.而如果将用户信息保存在前端,必然是非常危险的,很容易

  • 请求时token过期自动刷新token操作

    1.在开发过程中,我们都会接触到token,token的作用是什么呢?主要的作用就是为了安全,用户登陆时,服务器会随机生成一个有时效性的token,用户的每一次请求都需要携带上token,证明其请求的合法性,服务器会验证token,只有通过验证才会返回请求结果. 2.当token失效时,现在的网站一般会做两种处理,一种是跳转到登陆页面让用户重新登陆获取新的token,另外一种就是当检测到请求失效时,网站自动去请求新的token,第二种方式在app保持登陆状态上面用得比较多. 3.下面进入主题,我

  • 如何让每个Http请求都自动带上token

    目录 让每个Http请求都自动带上token 1.将token放到cookie中 2.将token放到某个http请求的header中 3.使用哪种方式更好呢? token一般存放在哪里 Token是什么? Token存放位置 Token 放在 cookie.localStorage.sessionStorage中的不同点? 总结 让每个Http请求都自动带上token 1.将token放到cookie中 这样每个http请求就都可以带上token信息了. access_token="eyJhb

  • Ajax跨域请求COOKIE无法带上的完美解决办法

    1.原生ajax请求方式: 1 var xhr = new XMLHttpRequest(); 2 xhr.open("POST", "http://xxxx.com/demo/b/index.php", true); 3 xhr.withCredentials = true; //支持跨域发送cookies 4 xhr.send(); 2.jquery的ajax的post方法请求: $.ajax({ type: "POST", url: &qu

  • 让你的博文自动带上缩址的实现代码,方便发到微博客上

    复制代码 代码如下: <script type="text/javascript"> $(function(){ c_url = 'http://s8.hk:8088/s8/s?format=text&longUrl='; c_url += document.location.href; c_url += '&jsonp=?' $.getJSON(c_url, function(data){ $("<div>本文短址:</div&

  • Vue axios 跨域请求无法带上cookie的解决

    在main.js设置 // 携带cookie axios.defaults.withCredentials = true 补充知识:VUE axios请求跨域时没有带上cookie或者每次cookie都改变 这两天用VUE写管理后端时,碰到一个奇葩问题: 我本地使用dev配置开发的时候 请求可以带上cookie信息  打包出来部署在服务器上 请求就没带上cookie信息. 然后自己慢慢排查,联合后端同事,排查这个cookie问题,前端也配置了 axios.defaults.withCredent

  • RestTemplate请求失败自动重启机制精讲

    目录 前言 一.SpringRetry配置生效 二.使用案例 三.测试结果 前言 本文是精讲RestTemplate第8篇,前篇的blog访问地址如下: RestTemplate在Spring或非Spring环境下使用精讲 RestTemplate实现多种底层HTTP客户端类库的切换用法 RestTemplate发送HTTP GET请求使用方法详解 RestTemplate发送HTTP POST请求使用方法详解 RestTemplate的DELETE及PUT等请求方法使用精讲 RestTempl

  • 切记ajax中要带上AntiForgeryToken防止CSRF攻击

    经常看到在项目中ajax post数据到服务器不加防伪标记,造成CSRF攻击 在Asp.net Mvc里加入防伪标记很简单在表单中加入Html.AntiForgeryToken()即可. Html.AntiForgeryToken()会生成一对加密的字符串,分别存放在Cookies 和 input 中. 我们在ajax post中也带上AntiForgeryToken @model WebApplication1.Controllers.Person @{ ViewBag.Title = "In

  • Python3爬虫带上cookie的实例代码

    Cookie的英文原意是"点心",它是在客户端访问Web服务器时,服务器在客户端硬盘上存放的信息,好像是服务器发送给客户的"点心".服务器可以根据Cookie来跟踪客户状态,这对于需要区别客户的场合(如电子商务)特别有用. 当客户端首次请求访问服务器时,服务器先在客户端存放包含该客户的相关信息的Cookie,以后客户端每次请求访问服务器时,都会在HTTP请求数据中包含Cookie,服务器解析HTTP请求中的Cookie,就能由此获得关于客户的相关信息. 下面我们就来

  • ASP.NET Core 实现自动刷新JWT Token

    目录 原理 实现 结论 前言: 为了安全性考虑,我们可以设置JWT Token较短的过期时间,但是这样会导致客户端频繁地跳到登录界面,用户体验不好. 正常解决办法是增加​​refresh_token​​,客户端使用refresh_token去主动刷新JWT Token. 这里介绍一种变通的方式,自动刷新JWT Token. 原理 我们读取每个请求的​​Authorization​​头,获得当前请求的JWT Token. 检查当前token的过期时间,如果在30分钟以内,那么我们就生成一个具有新过

  • vue动态绑定多个class以及带上三元运算或其他条件

    目录 动态绑定多个class带上三元运算或其他条件 动态绑定属性 例子 实现 一个标签中含有多个class(其中包含三元表达式)的写法 1.数组形式 2.字符串拼接 动态绑定多个class带上三元运算或其他条件 动态绑定属性 在v-for循环中,根据需求,在10条数据里,前3条添加不一样的样式. 例子 设置第一条数据的样式为one <li v-for="(item,index) in items" :key="index">     <span :

  • vue/js实现页面自动往上滑动效果

    本文实例为大家分享了vue/js实现页面自动往上滑动的具体代码,供大家参考,具体内容如下 最近做的新项目中要求让看不见的内容自动往上滑动一定的距离,使之可以看到,下面我来分享一下. 效果图: 我主要是使用 scrollTop 来做的往上滑动的功能,使用 animate 函数使之有一定的动画效果.有一个注意点就是要滚动的元素是父级标签,比如我下面列举的代码:id=“scrollbody” 是放在父级标签那里的,它包裹着多项 class=“item” ,如果还是不懂的话,就看使用了v-for在哪个标

随机推荐