我如何发送 CSRF 令牌
Posted
技术标签:
【中文标题】我如何发送 CSRF 令牌【英文标题】:How can i send a CSRF Token 【发布时间】:2018-08-27 15:06:45 【问题描述】:我正在尝试发送登录详细信息,但响应错误是 显示缺少 csrf 令牌。我如何从 Angular 2 发送 csrf 令牌 后端 Django。
import Injectable from '@angular/core';
import HttpClient, HttpHeaders from '@angular/common/http';
import Observable from 'rxjs/Observable';
import Cookie from 'ng2-cookies';
import 'rxjs/add/operator/map';
@Injectable()
export class AuthenticationService
constructor(private http: HttpClient)
login(username:string,password:string)
return this.http.post<any>('/api/auth',username:username,password:password,)
.map(user =>
//login successful if there a jwt token in the response
if(user && user.token)
localStorage.setItem('currentUser',JSON.stringify(user));
return user;
)
logout()
//remove user from local storage to log user out
localStorage.removeItem('CurrentUser');
【问题讨论】:
【参考方案1】:后端和前端必须在这方面协同工作。当以任何方式在后端启用 CSRF 时,基本上意味着每个请求都应该通过每个 HTTP 请求中的 HTTP 标头向服务器端发送一个唯一的(不完全是唯一的,稍后会详细介绍)标识符。
所以客户端(在本例中为 angular)必须知道 HTTP 标头的名称,并且必须设置该标头的值。
这个 HTTP 标头(或有效的 CSRF 令牌)的值是棘手的部分。通常要设置它,客户端会使用有效凭据继续调用服务器端 /csrf 类型的 API 以获取此值并将其设置在全局变量中(所有此类 /csrf 调用通常会定期进行,例如 15-30 秒。唯一性的实现由服务器决定)。或者为简单起见,CSRF 令牌值仅在用户登录时设置一次,并在整个会话期间保存在客户端。
然后,这个 CSRF 令牌作为 HTTP 标头的值与来自客户端的每个 HTTP 请求一起发送。服务器通过读取该标头来验证 CSRF 令牌并让 HTTP 请求通过。
请注意,以上所有内容也可以通过 cookie 而不是 HTTP 标头来实现。
行动项目:
与您的后端团队合作,了解 CSRF 令牌的 HTTP 标头名称以及设置其值的策略。或者如果不是 HTTP 标头,请检查是否在任何 cookie 中设置。
在Django csrf token + Angularjs 和AngularJS + Django Rest Framework + CORS ( CSRF Cookie not showing up in client ) (Django) 和How to add csrf token to angular 2 application (Spring 中查看如何通过 Angular js 进行设置>)
了解更多关于 CSRF 的信息:https://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF) 和https://dzone.com/articles/cross-site-request-forgery
【讨论】:
以上是关于我如何发送 CSRF 令牌的主要内容,如果未能解决你的问题,请参考以下文章
如何从 Postman REST 客户端发送 spring csrf 令牌?
如何忽略发送到 Django REST 框架的 CSRF 令牌?