Угловой сброс токена csrf - PullRequest
0 голосов
/ 25 мая 2018

Я использую Angular 6 и с трудом интегрирую CSRF Django с Angular.Я обнаружил в этой теме , что Django изменяет токен при входе в систему, поскольку я могу одновременно регистрироваться и входить в систему с помощью запросов на публикацию с тем же новым сеансом, но не публиковать что-либо после входа в систему, кажется, имеет смысл.

Возникает вопрос: как мне сбросить токен csrf при входе в систему?Способ обработки csrf теперь в моем приложении Angular показан в следующем коде для модуля моего приложения:

import { BrowserModule } from '@angular/platform-browser';
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
import { NgModule } from '@angular/core';
import { HttpClientModule } from '@angular/common/http';
import { HttpModule, XSRFStrategy, CookieXSRFStrategy } from '@angular/http'

import { AppComponent } from './app.component';
import { AppRoutingModule } from './app-routing.module';
import { RegisterComponent } from './register/register.component';
import { LoginComponent } from './login/login.component';
import { AlertComponent } from './_directives/alert.component';
import { ProfileComponent } from './profile/profile.component';
import { AuthGuardService } from './_guards/auth-guard.service';
import { AlertService } from './_services/alert.service';
import { AuthService } from './_services/auth.service';
import { UserService } from './_services/User.service';

@NgModule({
  declarations: [
    AppComponent,
    RegisterComponent,
    LoginComponent,
    AlertComponent,
    ProfileComponent,
  ],
  imports: [
    BrowserModule,
    FormsModule,
    ReactiveFormsModule,
    AppRoutingModule,
    HttpClientModule,
    HttpModule
  ],
  providers: [
    {
      provide: XSRFStrategy,
      useValue: new CookieXSRFStrategy('csrftoken', 'X-CSRFToken')
    }
  ],
  bootstrap: [AppComponent]
})
export class AppModule { }

Итак, мой вопрос: как мне заставить мое приложение сбросить значение при входе в систему?(Не обязательно специально входить в систему, но как мне получить это значение для сброса.)

1 Ответ

0 голосов
/ 25 мая 2018

Отличный вопрос, это немного сложно, и мой ответ очень не проверен.Однако, поскольку не было ни одного поста / статьи, которую я мог бы найти, я решил изложить, что я делаю из этой проблемы, прочитав несколько источников:

  • Django и Angular оба понимают CSRF по умолчанию;поэтому не необходимо вручную установить явное значение заголовка CSRF при выполнении запросов POST.
  • Это отличается от, скажем, jQuery, где вам нужно найти CSRFToken из cookie, а затем установить значение в заголовках против ключа "X-CSRFToken"".
  • Однако, поскольку Angular не знает названия ключей, имени ключа для получения токена CSRF из cookie-файла и имени ключа, который необходимо установить в заголовке, необходимо настроить имена ключей в Angular.
  • Еще раз: здесь вы задаете только имена ключей, а не значения, из-за # 1 Angular делает это автоматически.

    HttpClient от Angular имеет встроенную поддержку клиентской части этого метода.Подробнее об этом читайте в руководстве HttpClient.

Вы можете установить следующие названия клавиш в Angular 1 :

`$httpProvider.defaults.xsrfCookieName = 'csrftoken';`
`$httpProvider.defaults.xsrfHeaderName = 'X-CSRFToken';`

То же самое может быть достигнуто в Angular 2 и выше следующим образом:

bootstrap(AngularApp, [
      HTTP_PROVIDERS,
      provide(XSRFStrategy, {useValue: new CookieXSRFStrategy('csrftoken', 'X-CSRFToken')})
    ]);
  • Да, вы правы, что при входе в систему значение CSRFToken меняется, и вынужно будет ПОЛУЧИТЬ его снова, прежде чем вы сможете сделать еще один запрос POST.В этом и заключается ваше решение: после входа в систему выполните простой запрос GET к тому же серверу Django, и он будет гарантировать, что возвращаемый файл cookie содержит недавно обновленный csrftoken .Это следует из той же логики, что и первый раз, когда вы делаете POST-запрос к API Django BE, просто сделайте GET-запрос заранее

Поскольку угловое приложение не обслуживаетсяdjango, чтобы позволить установить cookie, угловое приложение должно сначала выполнить запрос GET к django.

Этот подход работает только , если у вас естьCSRF_USE_SESSIONS установлен на False, что означает, что Django устанавливает значение токена CSRF как часть cookie

Связанное чтение:

...