【问题标题】:Angular2 and Drupal 7 Service API AuthenticationAngular2 和 Drupal 7 服务 API 身份验证
【发布时间】:2017-02-05 23:25:12
【问题描述】:

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

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

它只是无法识别我刚刚登录。这是我正在采取的步骤:

  1. 通过“user/login”调用登录。
  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)); 

}

【问题讨论】:

    标签: angular authentication drupal drupal-7 drupal-services


    【解决方案1】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-11
      • 2021-11-22
      • 1970-01-01
      • 2016-06-10
      • 2020-04-22
      相关资源
      最近更新 更多