2017-10-29 13 views
1

私はdjangoをバックエンド用のWeb APIとして、React JSをフロントエンド用のWeb UIとして使用しています。ユーザーはWeb UIからサインアップし、ユーザーの詳細を登録するPOSTリクエストをdjangoに送信します。私はCSRFのサインアップビューを保護したいと思います。したがって、私は以下の手順で出てくる。CRSFトークンのDjangoバグ

まず、サインアップページがロードされると、以下のコードでダッシュGETのcsrfトークンを保存する要求が発生します。

handleSend(){ 
    let req = { 
    url: 'http://localhost:9000/vcubes/retrieve_token/', 
    method : 'GET', 
    withCredentials: true 
    } 
    axios(req) 
} 

ユーザーが登録フォームを送信すると、別のPOSTリクエストが発生します。上記のコードで

const data = JSON.stringify({ 
     'first_name': this.state.first_name, 
     'last_name': this.state.last_name, 
     'email': this.state.email, 
     'contact_number': this.state.contact_number, 
     'password1': this.state.password1, 
     'password2': this.state.password2, 
     }) 
     let req = { 
     url: 'http://localhost:9000/vcubes/signup/', 
     method : 'POST', 
     headers: { 
       'Content-Type': 'text/plain' 
     }, 
     data: data 
     } 
     axios.defaults.headers.common['X-CSRF-TOKEN'] = this.getCookie('vcubes') 

、オプションは、実際のP​​OSTリクエストが発射され、第一ジャンゴ、その後ジャンゴ後200 OKを返送するために送信されます。

enter image description here enter image description here

サプライズ! Djangoは私がCSRFクッキーを設定しないと述べました。

Forbidden (CSRF cookie not set.): /vcubes/signup/ 
[30/Oct/2017 01:30:48] "POST /vcubes/signup/ HTTP/1.1" 403 2857 

私のsettings.pyは以下の通りです。私はグーグルとstackoverflowのからの問題を見つけるが、ほとんど任意の助けを得るないように一日を費やしてきたviews.py

@ensure_csrf_cookie 
def retrieve_token(request): 
    return HttpResponse(status=200) 

def signup(request): 
    print request.META 
    form = UserCreationForm(json.loads(request.body)) 
    # user = form.save(commit=False) 
    # user.is_active = False 
    # user.save() 
    # 
    # mail_subject = 'Activate your account.' 
    # message = render_to_string('acc_active_email.html', { 
    #  'name': user.get_full_name(), 
    #  'domain': 'localhost:9000', 
    #  'uid': urlsafe_base64_encode(force_bytes(user.pk)), 
    #  'token': account_activation_token.make_token(user), 
    # }) 
    # to_email = user 
    # email = EmailMessage(
    #  mail_subject, message, to=[to_email] 
    #) 
    # email.send() 
    return HttpResponse(status=200) 

INSTALLED_APPS = [ 
    'django.contrib.admin', 
    'django.contrib.auth', 
    'django.contrib.contenttypes', 
    'django.contrib.sessions', 
    'corsheaders', 
    'django.contrib.messages', 
    'django.contrib.staticfiles', 
    'rest_framework', 
    'custom_user', 
    'vcubes', 
] 

MIDDLEWARE = [ 
    'django.middleware.security.SecurityMiddleware', 
    'django.contrib.sessions.middleware.SessionMiddleware', 
    'corsheaders.middleware.CorsMiddleware', 
    'django.middleware.common.CommonMiddleware', 
    'django.middleware.csrf.CsrfViewMiddleware', 
    'django.contrib.auth.middleware.AuthenticationMiddleware', 
    'django.contrib.messages.middleware.MessageMiddleware', 
    'django.middleware.clickjacking.XFrameOptionsMiddleware', 
] 

CSRF_TRUSTED_ORIGINS = (
    'localhost:8000', 
    '127.0.0.1:8000' 
) 

CSRF_COOKIE_NAME = 'vcubes' 

CSRF_HEADER_NAME = 'HTTP_X_CSRF_TOKEN' 

CORS_ORIGIN_ALLOW_ALL = True 

CORS_ALLOW_CREDENTIALS = True 

CORS_ORIGIN_WHITELIST = (
    'localhost:8000', 
    '127.0.0.1:8000' 
) 


CORS_ALLOW_HEADERS = (
    'access-control-allow-credentials', 
    'access-control-allow-origin', 
    'access-control-request-method', 
    'access-control-request-headers', 
    'accept', 
    'accept-encoding', 
    'accept-language', 
    'authorization', 
    'connection', 
    'content-type', 
    'dnt', 
    'credentials', 
    'host', 
    'origin', 
    'user-agent', 
    'X-CSRF-TOKEN', 
    'X-CSRFToken', 
    'x-requested-with', 
) 

を(私はCORSとCSRFにいくつかの関連するコードを表示します) 。私を教えてください!

+0

も ​​'CSRF_COOKIE_SECURE'に設定されていますか? – scharette

+0

この投稿が表示されない場合は、多くの修正があります。[this](https://stackoverflow.com/questions/17716624/django-csrf-cookie-not-set) – scharette

+0

CSRF_COOKIE_SECUREが設定されていますデフォルトではfalseです。私の場合はこれで問題ありません。 –

答えて

0

あなたの投稿要求にはwithCredentials: trueが不足しています。つまり、CSRFクッキーはリクエストとともに送信されません。

+0

なぜ私はwithCredentialsを送る必要があります: 'axios.defaults.headers.common ['X-CSRF-TOKEN'] = this.getCookie( 'vcubes')'と一緒に本当ですか?後のコードがなければ、要求ヘッダーに 'Cookie:vcubes = 3HqESj1ea9Pw6gAah6CvlGOlvUDYURWMBBwsXYpzIJWvXT6Sjiylpf2hDlSZgLh'が残っています。 –

+0

CSRFの保護では、トークンを常にクッキーとして送信する必要があります。また、要求本体またはトークンとしてトークンを送信する必要があります。 – Alasdair

関連する問題