2017-10-19 113 views
0

我正嘗試使用Ionic 3/Angular 4.3爲現有Web應用程序構建移動客戶端。在使用withCredentials的設備上未發送Ionic 3中的Cookie:true

我們使用cookie進行會話和CSRF保護。

import { Injectable } from '@angular/core'; 
import { HttpEvent, HttpInterceptor, HttpHandler, HttpRequest } from '@angular/common/http'; 
import { Observable } from "rxjs"; 
import { CookieService } from 'ngx-cookie'; 
import 'rxjs/add/operator/map'; 

@Injectable() 
export class AuthInterceptor implements HttpInterceptor { 

    constructor(private cookies: CookieService) {} 

    intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> { 
    var authReq = this.cookies.get('XSRF-TOKEN') ? request.clone({ 
     withCredentials: true, 
     headers: request.headers.set('X-XSRF-TOKEN', this.cookies.get('XSRF-TOKEN')) 
    }) : request.clone({ withCredentials: true }); 
    return next.handle(authReq); 
    } 
} 

測試從瀏覽器的工作原理,只要細如我ionic serve address=localhost(繞過CORS需要地址標誌)運行:我已經爲了安裝和使用HTTP請求發送令牌餅乾實行以下HttpInterceptor

但是,當使用ionic cordova run android從Android設備進行測試時,Cookie似乎不會被髮送或持續存在。

從上面可以看到,我已將withCredentials設置爲true,因爲大多數類似帖子的回覆建議。

+0

服務器端組件是否處理自定義請求標頭要求正確的請求前請求? – CBroe

+0

@CBroe我已經允許在開發服務器上的所有來源,但不是在生產服務器上(我一直在閱讀,這是沒有必要的,因爲設備訪問與原始文件''') – Jaysbays

+0

談論https:// stackoverflow .com/a/13997235/1427878 – CBroe

回答

0

Cookie不是處理移動設備上身份驗證的好方法。有多個cookie存儲(webview有一個,有一個本地的,我認爲即使一些HTTP模塊有一個),所以他們必須同步工作可靠。 Android有自己的CookieSyncManager作爲一個實用程序(新的webviews顯然可以自己)。另外,當您的設備處於低內存時,Cookie將排在前面,以便被操作系統清除。因此,您的cookies會不時丟失,您的用戶會因爲需要重新登錄而感到不安。

那你應該怎麼做呢?你應該實現一個基於令牌的認證系統。使用native-storage或某些sql-lite存儲來存儲令牌。

+0

雖然我很欣賞這些信息,但這並不能回答我所問的問題。重寫認證代碼目前不是一種選擇,並且我無法訪問JS中的令牌cookie,因爲HttpOnly標誌已設置。 – Jaysbays

+0

它__很好地回答你的問題。您寫道「... _ cookie似乎不會被髮送或**持續** _ ...」,這可能是由於Cookie是移動設備上非常不穩定的事物。 – David

相關問題