2017-02-05 7 views
2

私はDrupal 7サービスAPI(v7.x-3.17)を使用してAngular2フロントエンドと接続しています。Angular2とDrupal 7サービスAPI認証

認証が正しく機能するのに問題があります。私がログインすると、すべての正しいデータ(session_name、sessid、tokenなど)が返されます。しかし、それ以降のコール(システム/接続)を行うと、別の「sessid」が返され、私は「匿名ユーザー」と伝えられます。

それはちょうど私がちょうどログインしていることを認識していないここで私が取ってい手順は次のとおりです。

  1. ログインを「ユーザー/ログイン」呼び出しを介して。
  2. APIは、すべての正しいユーザー情報を持つ "sessid"、 "session_name"、 "token"、 "user"オブジェクトを返します。
  3. 後続のAPI呼び出しのためにX-CSRF-TOKENを格納します。
  4. ヘッダーに "X-CSRF-TOKEN"を追加し、APIを呼び出して "system/connect"呼び出しでユーザー情報を取得します。
  5. APIは、「匿名ユーザー」のために、新しい/異なる「sessid」、同じ「session_name」、および「user」ブロックを返します。

私の人生にとって、なぜ匿名ユーザーが返されているのか分かりません。誰かが私にこれを理解させる手助けはできますか?ここで

は私のユーザー/ログイン機能である:ここで

//////////////////////////////////////////////////// 
// LOGIN API CALL 
// make call to login with 'user/login' api call 
//////////////////////////////////////////////////// 

login(data): Observable<User> { 

    // set variables 
    let url = this.postUrl + 'user/login'; 
    let headers = new Headers({'Content-Type': 'application/json'}); 
    let options = new RequestOptions({ headers: headers}); 

    // make the call 
    return this.http.post(url, data, options) 
     .map((res:Response) => this.loginData(res)) 
     .catch((error:any) => this.handleError(error)); 

} 

private loginData(res: Response) { 
    let body = res.json(); 
    Cookie.set('X-CSRF-TOKEN', body.token); 
    return body!=null?body:[]; 
} 

は私のユーザー/機能を接続するだけです:

//////////////////////////////////////////////////// 
// GET USER DATA OR "CONNECT" API CALL 
// get user data with 'system/connect' api call 
//////////////////////////////////////////////////// 

getUser(): Observable<any> { 

    // Retrieve the token 
    let token = Cookie.get('X-CSRF-TOKEN'); 

    // Prepare API call 
    let url = this.postUrl + 'system/connect'; 
    let body = { username: 'test', password: 'test' }; 
    let headers = new Headers('X-CSRF-TOKEN', token); 
    headers.append('Content-Type', 'application/json'); 

    let options = new RequestOptions({ headers: headers, withCredentials: true }); 

    return this.http.post(url, body, options) 
     .map((res:Response) => this.extractData(res)) 
     .catch((error:any) => this.handleError(error)); 

} 

答えて

2

ので....私つもりは自分の質問:)

に答えますよ

これは実際にはCORSの問題でした。ログインが正常に機能し、セッション名とsessidに "セットクッキー"と応答しました。しかし、ブラウザはクッキーを設定していないので、その後のすべての呼び出しで、私が認証されたユーザーであることがわかりませんでした。

解決策はありますか?私のログインAPIコールのヘッダーに「:クレジット:true」を追加します。ように:

let options = new RequestOptions({ headers: headers, withCredentials: true}); 

私はこれがこの問題を抱えている人に役立つことを望みます。

関連する問題