angularjs - 禁止 (403) CSRF 验证失败。请求中止。Django + AngularJS
问题描述
我正在运行一个 Django v1.10.8 项目。我有一个使用 AngularJS v1.5.6 处理的表单。我已将项目放在使用 SSL 的远程服务器上,在 HTTPS 上运行。
当我尝试提交我的自定义登录表单时,我收到此错误:Forbidden (403)
CSRF verification failed. Request aborted.
.
login_register.html
登录表格在这里:
<div ng-app="app" ng-controller="Ctrl">
<form method="post" name="loginForm" ng-submit="login()">
<fieldset ng-disabled="submittingForm">
<p>
<input
id="{{ login_form.username.id_for_label }}"
type="email"
name="{{ login_form.username.html_name }}"
placeholder="Email"
ng-model="login.email"
required>
</p>
<p>
<input
class="form-control"
id="{{ login_form.password.id_for_label }}"
name="{{ login_form.password.html_name }}"
placeholder="{% trans 'Password (8+ characters)' %}"
type="[[[ login.showPW ? 'text' : 'password' ]]]"
ng-minlength="{{ min_pw_length }}"
ng-maxlength="{{ max_pw_length }}"
ng-model="login.pw"
required
>
</p>
<button class="btn btn-primary" type="submit" ng-disabled="!login.email || !login.pw">{% trans "Log in" %}</button>
</fieldset>
</form>
</div>
login-register.js
:
var app= angular.module("app",[]);
app.config(function($interpolateProvider, $httpProvider){
$interpolateProvider.startSymbol("[[[");
$interpolateProvider.endSymbol("]]]");
$httpProvider.defaults.xsrfCookieName= "csrftoken";
$httpProvider.defaults.xsrfHeaderName= "X-CSRFToken";
});
app.controller("Ctrl", function($scope, $http, $window){
$scope.loginError= '';
$scope.login= function(){
$scope.submittingForm= true;
$scope.loginError= '';
var formData= {
"username": $scope.login.email,
"password": $scope.login.pw
};
$http.post(
"login",
JSON.stringify(formData)
).success(function(response){
if (response.success === false){
$scope.loginError= response.err_msg;
$scope.submittingForm=false;
return;
}
$window.location.href= GLOBAL_paths.home;
});
};
});
这是我的摘录local_settings.py
:
SESSION_COOKIE_SECURE = True
CSRF_COOKIE_SECURE = True
CSRF_COOKIE_HTTPONLY = True
X_FRAME_OPTIONS = "DENY"
SECURE_HSTS_SECONDS = 60
SECURE_CONTENT_TYPE_NOSNIFF = True
SECURE_BROWSER_XSS_FILTER = True
SECURE_SSL_REDIRECT = True
SECURE_HSTS_INCLUDE_SUBDOMAINS = True
尽管在 JS 中设置了 CSRF 令牌,为什么我会收到此 403 错误?
解决方案
表单标签后应该有一个CSRF令牌
<form method="post" name="loginForm" ng-submit="login()">
{% csrf_token %}
推荐阅读
- javascript - ES6 类:将“this”绑定到嵌套函数
- javascript - 如何使用 React Router 将数据传递给不在 URL 中的另一个组件
- python - OpenCV 录制的网络摄像头视频比现实生活中的 Python 更快
- azure - 是否可以将 Azure SignalR 服务与本地 SignalR 结合使用?
- javascript - 调用vue路由器时超出最大调用堆栈大小
- c++ - OpenGL奇怪的鼠标旋转结果
- css - 如何识别设备是水平旋转还是垂直旋转?
- sql - 如何从以 BLOB 类型存储在列中的 XML 中提取数据(通过 SQL 查询)
- pine-script - 有没有办法从数据窗口中隐藏特定的指标值?
- angular-material - 如何从 Angular Material 中的 mat-slide-toggle 中删除 ws:nowrap?