Django Rest Framework + Django CORSヘッダーを使用して、AngularJSで1ページのアプリケーションを開発しています。
私の問題は、バックエンドに接続したときに「csrftoken」Cookie がブラウザーに表示されないことです。
例: 投稿を使用してログインしています。「sessionid」Cookie を適切に取得しますが、「csrftoken」が表示されないため、csrf トークンがないために拒否されるため、クライアントから適切な投稿を行うことができません。
- API からの応答ヘッダーを分析しましたが、csrftoken がありません。
- 残りの API ブラウザを直接見たところ、問題なく表示されました。
- Django Rest Framework は認証されたユーザーに対してのみ CSRF を強制するため、最初の POST を実行してログインできます。再ログインしようとすると、「sessionid」-cookie が存在するため失敗します。
- stackoverflow に関するいくつかの投稿が示唆しているように、CSRF 保護をバイパスすることに興味はありません。
フロント/バックエンドからのいくつかのコード スニペット。これらは未完成のスニペットなので、下手に書かれたコードにこだわらないでください。
バックエンド 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, status, headers, config) {
console.log('Testing console error');
User.isLogged = false;
User.username = '';
});
};
}]);
良いヒント/アイデア/例を持っている人はいますか?