Angular2 和 Drupal 7 服务 API 身份验证

标签 angular authentication drupal drupal-7 drupal-services

我正在使用 Drupal 7 Services 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”添加到 header 并调用API以通过“system/connect”调用获取用户信息。
  5. 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/

相关文章:

ruby-on-rails - Rails 设计自定义 url

html - Angular react 形式 - 无效输入上的样式字段颜色

angular 直接加载带有嵌套路由器导出的惰性模块

javascript - webpack 如何替换 .ts 文件中的字符串?

Android HttpClient Cookie

php - 允许匿名用户在 Drupal 中创建未发布的节点?

javascript - 如何从 View 中的数组中删除项目

php - 替代登录和身份验证方法(适用于老年人)

ajax - (drupal/whitehouse.gov) 如何动态加载节点内容而不重新加载页面?

drupal - 如何向 drupal organic group 'User and Group' 关系添加附加字段?