我正在使用 Drupal 7 Services API (v7.x-3.17) 与 Angular2 前端连接。
我无法正常进行身份验证。当我登录时,我会收到所有正确的数据(session_name、sessid、token 等)。但是,当我进行任何其他后续调用(即系统/连接)时,它会返回不同的“sessid”并告诉我我是“匿名用户”。
它只是无法识别我刚刚登录。以下是我正在采取的步骤:
- 通过“用户/登录”调用登录。
- API 返回“sessid”、“session_name”、“token”和“user”对象以及所有正确的用户信息。
- 存储 X-CSRF-TOKEN 以供后续 API 调用。
- 将“X-CSRF-TOKEN”添加到 header 并调用API以通过“system/connect”调用获取用户信息。
- API 返回一个新的/不同的“sessid”、相同的“session_name”以及“匿名用户”的“user” block 。
我一生都无法弄清楚为什么它会返回匿名用户。谁能帮我解决这个问题吗?
这是我的用户/登录功能:
////////////////////////////////////////////////////
// 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));
}
最佳答案
所以......我要回答我自己的问题:)
这实际上是一个 CORS 问题。登录正常,并使用我的 session_name 和 sessid 响应“set-cookie”响应。但是,浏览器没有设置 cookie,因此所有后续调用都不知道我是经过身份验证的用户。
解决方案?将“withCredentials: true”添加到我的Login API 调用的 header 中。就像这样:
let options = new RequestOptions({ headers: headers, withCredentials: true});
我希望这对遇到此问题的其他人有所帮助。
关于Angular2 和 Drupal 7 服务 API 身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42048923/