AngularJS Django Rest框架CORS(CSRF Coo??kie不显示在客户端)
我在AngularJS使用和Django Rest Framework Django CORS标题开发一个1页面的应用程序。
我的问题是,“csrftoken”cookie不会显示在我的浏览器,当我已经联系后端。 例如:我正在使用一个帖子登录。我得到“sessionid”cookie正确,但“csrftoken”从来没有显示,因此我不能做正确的帖子从我的客户端,因为我会因为缺乏csrf令牌而被拒绝。 >我已经分析了响应头从API和csrftoken不是。 前/后端的一些代码段。这些是未完成的代码片段,所以不要挂在写得不好的代码。 后端API LoginView class LoginView(APIView): renderer_classes = (JSONPRenderer,JSONRenderer) def post(self,request,format=None): serializer = LoginSerializer(data=request.DATA) if serializer.is_valid(): userAuth = authenticate(username=serializer.data['username'],password=serializer.data['password']) if userAuth: if userAuth.is_active: login(request,userAuth) loggedInUser = AuthUserProfile.objects.get(pk=1) serializer = UserProfileSerializer(loggedInUser) user = [serializer.data,{'isLogged': True}] else: user = {'isLogged': False} return Response(user,status=status.HTTP_200_OK) return Response(serializer.errors,status=status.HTTP_400_BAD_REQUEST) 客户端AngularJS登录控制器 .controller('LoginCtrl',['$scope','$http','uService','$rootScope',function(scope,$http,User,rootScope) { scope.login = function() { var config = { method: 'POST',withCredentials: true,url: rootScope.apiURL+'/user/login/',data : scope.loginForm }; $http(config) .success(function(data,status,headers,config) { if (status == 200) { console.log(data[0]); //Test code // succefull login User.isLogged = true; User.username = data.username; } else { console.log(data); //Test code User.isLogged = false; User.username = ''; } }) .error(function(data,config) { console.log('Testing console error'); User.isLogged = false; User.username = ''; }); }; }]); 任何人有任何好的提示/想法/例子?
在子域A上的AngularJS单页Web应用程序,使用CORS和CSRF保护与子域B上的Django JSON(REST)API通信
由于我目前正在进行类似的设置,并正在努力让CORS与CSRF保护结合正常工作,我想在这里分享我自己的学习。 设置 – SPA和API都位于同一域的不同子域: > AngularJS(1.2.14)单个网页应用程序在子域app.mydomain.com上 AngularJS应用程序通过Django应用程序在与Django API应用程序相同的项目中,这样它设置一个CSRF Coo??kie。参见,例如,也是How to run multiple websites from one Django project Django API应用程序 – 为了获得CORS和CSRF保护工作,我需要在API后端执行以下操作。 在此应用的settings.py(Django项目settings.py的扩展)中: >添加corsheaders应用程序和中间件以及CSRF中间件:
另见Django CORS headers on GitHub >将SPA Webapp的域添加到CORS_ORIGIN_WHITELIST
>将CORS_ALLOW_CREDENTIALS设置为True。这很重要,如果你不这样做,没有CSRF cookie将与请求一起发送
向处理JSON API请求的视图中添加ensure_csrf_cookie装饰器:
Django App for AngularJS – AngularJS应用程序通过同一个项目中的Django应用程序提供。此Django应用程序设置为设置CSRF Coo??kie。来自cookie的CSRF令牌然后用于对API的请求(其因此作为同一Django项目的一部分运行)。 注意,几乎所有与AngularJS应用程序相关的文件都是来自Django透视图的静态文件。 Django应用程序只需要提供index.html来设置cookie。 在settings.py这个应用程序(再次是Django项目settings.py的扩展),设置CSRF_COOKIE_DOMAIN,以便子域也可以使用它们:
在views.py中,我只需要渲染AngularJS index.html文件,再次使用ensure_csrf_cookie装饰器:
使用AngularJS向API发送请求 – 在AngularJS应用程序配置中设置以下$ httpProvider默认值:
再次注意withCredentials,这确保在请求中使用CSRF Coo??kie。 下面我展示如何使用AngularJS $ http服务和JQuery向api发出请求:
另见ngCookies module。 使用JQuery(1.11.0):
我希望这有帮助!! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |