我正在使用Drupal 7 Services API(v7.x-3.17)连接Angular2前端。
我在使身份验证正常工作时遇到问题。当我登录时,我会收到所有正确的数据(session_name、sessiond、token等)。然而,当我进行任何其他后续调用(即系统/连接)时,它会返回一个不同的"会话",并告诉我是一个"匿名用户"。
它只是不知道我刚刚登录。以下是我正在采取的步骤:
- 通过"user/Login"调用登录
- API返回带有所有正确用户信息的"session"、"session_name"、"token"one_answers"user"对象
- 存储X-CSRF-TOKEN以备后续API调用
- 在表头添加"X-CSRF-TOKEN",调用API,通过"system/connect"调用获取用户信息
- API返回一个新的/不同的"sessiond"、相同的"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));
}
所以。。。。我要回答我自己的问题:)
事实上,这是一个CORS问题。登录名正在工作,并以">设置cookie"响应我的session_name和sessiond。但是,浏览器没有设置cookie,因此,所有随后的调用都不知道我是经过身份验证的用户。
解决方案?将">withCredentials:true"添加到我的登录API调用的头中。像这样:
let options = new RequestOptions({ headers: headers, withCredentials: true});
我希望这能帮助到其他有这个问题的人。