我如何发送 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 令牌的主要内容,如果未能解决你的问题,请参考以下文章

如何从 jqgrid 发送 CSRF 令牌

如何在 javaScript 中获取 CSRF 令牌值

如何从 Postman REST 客户端发送 spring csrf 令牌?

如何忽略发送到 Django REST 框架的 CSRF 令牌?

ReactJS 和 Django:如何以正确的方式使用 axios 发送 csrf 令牌?

如何从Postman休息客户端发送spring csrf令牌?