2016-11-18 5 views
0

Я пишу некоторую интеграцию между Angular 2 (не большим экспертом в JS) и Rails 4.2. В Rails-стороне я использую программу для проверки подлинности. Дело в том, что когда я прошу войти в систему, заголовок Set-Cookie возвращается в ответ. Но тогда, когда я пытаюсь запросить любой требуемый для аутентификации ресурс, заголовок Cookie имеет значение "Set-Cookie=null" (например, нет значения Set-Cookie?). Вот как это делается:Угловая проверка подлинности cookie

session.service.ts

@Injectable() 
export class SessionService{ 
    private headers = new Headers({'Content-Type': 'application/json', 'Accept': 'application/json'}) 
    private createSessionUrl = 'http://localhost:3002/users/sign_in'; 

    constructor(
     private http: Http 
    ) { } 

    create(email: string, password: string): Promise<User>{ 
     return this.http.post(this.createSessionUrl, JSON.stringify({user:{email: email, password: password}}), 
      { headers: this.headers }) 
      .toPromise() 
      .then(response => response.json() as User) 
      .catch(this.handleError) 
    } 

    private handleError(error: any): Promise<any> { 
     return Promise.reject(error.message || error); 
    } 
} 

statistics.service.ts

import { Injectable }  from '@angular/core'; 
import { Headers, Http, RequestOptions } from '@angular/http'; 
import { Statistics }  from '../models/statistics.models' 

import 'rxjs/add/operator/toPromise'; 

@Injectable() 
export class StatisticsService{ 
    private headers = new Headers({'Content-Type': 'application/json', 'Accept': 'application/json'}) 
    private statisticsUrl = 'http://localhost:3002/statistics'; 

    constructor(
     private http: Http 
    ) {} 

    show(): Promise<Statistics>{ 
     let options = new RequestOptions({ headers: this.headers, withCredentials: true }); 
     return this.http.get(this.statisticsUrl, options) 
      .toPromise() 
      .then(response => response.json() as Statistics) 
      .catch(this.handleError) 
    } 

    private handleError(error: any): Promise<any> { 
     console.error('An error occurred', error); 
     return Promise.reject(error.message || error); 
    } 
} 

Насколько я знаю, let options = new RequestOptions({ headers: this.headers, withCredentials: true }); должен включать надлежащую Cookie в запросе.

Если вам нужна дополнительная информация, напишите в комментариях.

ответ

1

Ваш вопрос довольно старый, но я надеюсь, что он все равно поможет. Я тоже наткнулся на эту проблему и хотел ответить на ваш вопрос. Теперь я позабочусь об этом.

Я думаю, вы забыли опцию withCredentials в запросе POST вашего session.service.ts. Как отправить запрос с учетными данными (адрес электронной почты и пароль), и вы ожидаете ответа установить куки, вы должны сказать HTTP-службу о том, что:

return this.http.post(
    this.createSessionUrl, 
    JSON.stringify({user:{email: email, password: password}}), 
    { headers: this.headers, withCredentials: true } 
) 

Теперь куки должны быть сохранены в браузере, и следующий запрос статистики должен содержать правильный файл cookie.

Это работает?

Cheers,
Friedrich

Смежные вопросы