2017-02-05 1 views
2

Drupal 7 서비스 API (v7.x-3.17)를 사용하여 Angular2 프런트 엔드와 연결합니다.Angular2 및 Drupal 7 서비스 API 인증

인증이 올바르게 작동하는 데 문제가 있습니다. 로그인 할 때 올바른 데이터 (session_name, sessid, 토큰 등)를 모두 수신합니다. 그러나 다른 후속 호출 (예 : 시스템/연결)을 수행하면 다른 "sessid"를 반환하고 내가 "익명 사용자"라고 알려줍니다.

그냥 난 그냥 로그인을 인식하지 않습니다 여기에 내가 복용하고있는 단계입니다. "사용자/로그인"전화를 통해

  1. 로그인.
  2. API는 모든 올바른 사용자 정보가있는 "sessid", "session_name", "token"및 "user"개체를 반환합니다.
  3. 후속 API 호출을 위해 X-CSRF-TOKEN을 저장하십시오.
  4. 헤더에 "X-CSRF-TOKEN"을 추가하고 "system/connect"호출을 통해 사용자 정보를 얻기 위해 API를 호출하십시오.
  5. API는 새로운/다른 "sessid", 동일한 "session_name"및 "익명 사용자"에 대한 "user"블록을 반환합니다.

나를 기다리는 동안 익명 사용자를 돌려 보내는 이유를 알 수 없습니다. 아무도 내가 이것을 알아낼 수있게 도와 줄 수 있습니까? 여기

내 사용자/로그인 기능입니다 :

//////////////////////////////////////////////////// 
// 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

그래서 .... 나는 거 내 자신의 질문에 대답 해요 :)

을 : 여기
//////////////////////////////////////////////////// 
// 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:[]; 
} 

내 사용자입니다/기능을 연결

사실 CORS 문제였습니다. 로그인이 작동하고 있으며 내 session_name 및 sessid에 "세트 쿠키"응답으로 응답했습니다. 그러나 브라우저는 쿠키를 설정하지 않았으므로 이후의 모든 호출은 내가 인증 된 사용자인지 알지 못했습니다.

해결책? 내 로그인 API 호출의 헤더에 "withCredentials : true"을 추가하십시오. 좋아요 :

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

이 정보가 도움이 되었기를 바랍니다.