2

我正在使用 Drupal 7 服务 API (v7.x-3.17) 连接 Angular2 前端。

我无法使身份验证正常工作。当我登录时,我会收到所有正确的数据(session_name、sessid、token 等)。但是,当我进行任何其他后续调用(即系统/连接)时,它会返回一个不同的“sessid”并告诉我我是一个“匿名用户”。

它只是不承认我刚刚登录。这是我正在采取的步骤:

  1. 通过“用户/登录”调用登录。
  2. API 返回“sessid”、“session_name”、“token”和“user”对象以及所有正确的用户信息。
  3. 存储 X-CSRF-TOKEN 以供后续 API 调用。
  4. 将“X-CSRF-TOKEN”添加到标头并调用API以通过“system/connect”调用获取用户信息。
  5. API 返回一个新的/不同的“sessid”、相同的“session_name”和一个“匿名用户”的“用户”块。

对于我的生活,我无法弄清楚为什么它会返回一个匿名用户。谁能帮我解决这个问题?

这是我的用户/登录功能:

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

}
4

1 回答 1

2

所以....我要回答我自己的问题:)

事实上,这是一个 CORS 问题。登录正在工作并使用我的 session_name 和 sessid 响应“ set-cookie ”响应。但是,浏览器没有设置 cookie,因此,所有后续调用都不知道我是经过身份验证的用户。

解决方案?将“ withCredentials: true ”添加到我的登录 API 调用的标题中。像这样:

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

我希望这对遇到此问题的其他人有所帮助。

于 2017-02-05T15:25:12.880 回答