【问题标题】:How can i send a CSRF Token我如何发送 CSRF 令牌
【发布时间】: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');
    }
}

【问题讨论】:

    标签: javascript angular2-routing csrf


    【解决方案1】:

    后端和前端必须在这方面协同工作。当以任何方式在后端启用 CSRF 时,基本上意味着每个请求都应该通过每个 HTTP 请求中的 HTTP 标头向服务器端发送一个唯一的(不完全是唯一的,稍后会详细介绍)标识符。

    所以客户端(在本例中为 angular)必须知道 HTTP 标头的名称,并且必须设置该标头的值。

    这个 HTTP 标头(或有效的 CSRF 令牌)的值是棘手的部分。通常要设置它,客户端会使用有效凭据继续调用服务器端 /csrf 类型的 API 以获取此值并将其设置在全局变量中(所有此类 /csrf 调用通常会定期进行,例如 15-30 秒。唯一性的实现由服务器决定)。或者为简单起见,CSRF 令牌值仅在用户登录时设置一次,并在整个会话期间保存在客户端。

    然后,这个 CSRF 令牌作为 HTTP 标头的值与来自客户端的每个 HTTP 请求一起发送。服务器通过读取该标头来验证 CSRF 令牌并让 HTTP 请求通过。

    请注意,以上所有内容也可以通过 cookie 而不是 HTTP 标头来实现。

    行动项目:

    1. 与您的后端团队合作,了解 CSRF 令牌的 HTTP 标头名称以及设置其值的策略。或者如果不是 HTTP 标头,请检查是否在任何 cookie 中设置。

    2. Django csrf token + AngularjsAngularJS + Django Rest Framework + CORS ( CSRF Cookie not showing up in client ) (Django) 和How to add csrf token to angular 2 application (Spring 中查看如何通过 Angular js 进行设置>)

    3. 了解更多关于 CSRF 的信息:https://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF)https://dzone.com/articles/cross-site-request-forgery

    【讨论】:

      猜你喜欢
      • 2018-08-19
      • 2021-04-03
      • 2021-05-14
      • 2021-06-16
      • 2018-03-20
      • 2015-03-26
      • 1970-01-01
      • 2015-05-27
      • 2016-06-19
      相关资源
      最近更新 更多