2016-11-18 263 views
0

我正在編寫Angular 2(不是JS中的大專家)和Rails 4.2之間的一些集成。在Rails方面,我使用設計進行身份驗證。事情是當我要求登錄用戶時,Set-Cookie標題返回響應。但是,然後,當我試圖請求任何驗證所需的資源Cookie標頭的值爲"Set-Cookie=null"(如沒有值Set-Cookie?)。下面是它是如何做:Angular 2 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

你的問題是相當古老的,但我希望它無論如何幫助。我也偶然發現了這個問題,並希望找到你的問題。現在我處理這件事。

我想你忘記了session.service.ts的POST請求中的withCredentials選項。當您發送帶有憑據(電子郵件和密碼)的請求,你期待的迴應設置cookie,你應該告訴該HTTP服務:

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

現在的cookie應在瀏覽器和存儲下一個統計信息請求應包含正確的cookie。

這是行不通的?

乾杯,
Friedrich