Angular2和Drupal 7服务API认证



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

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

它只是不知道我刚刚登录。以下是我正在采取的步骤:

  1. 通过"user/Login"调用登录
  2. API返回带有所有正确用户信息的"session"、"session_name"、"token"one_answers"user"对象
  3. 存储X-CSRF-TOKEN以备后续API调用
  4. 在表头添加"X-CSRF-TOKEN",调用API,通过"system/connect"调用获取用户信息
  5. 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});

我希望这能帮助到其他有这个问题的人。

相关内容

  • 没有找到相关文章

最新更新