【问题标题】:Angular 2 not sending Authorization header using JWT authenticationAngular 2 不使用 JWT 身份验证发送授权标头
【发布时间】:2017-04-25 18:19:43
【问题描述】:

我正在尝试使用 Angular2 作为前端和 cakephp 3 作为 REST Api 创建一个应用程序,身份验证工作正常,但是当我尝试访问任何其他 url 时,我得到 401 Unauthorized状态,我注意到请求方法是 OPTIONS 而不是我在代码中使用的 GET ,并且带有我的令牌的 Authorization 标头是未发送到服务器:

这是我的 user.service.ts 代码:

constructor(private http: Http,
          private router: Router,
) { }

login(email: string, password: string){
    let headers: Headers = new Headers({ 'Accept': 'application/json','Content-Type': 'application/json' });
    let options: RequestOptions = new RequestOptions({headers: headers});

    return this.http.post('http://www.students.com/api/users/token.json', {email: email, password: password}, options)
  .map((data: Response)=> data.json())
  .subscribe(
    (data)=> this.handlData(data),
    (error)=> this.handlError(error)
  );
}

getSessionData(){
    let token = localStorage.getItem('usr_token');
    let headers = new Headers({ 'Accept': 'application/json', 'Authorization': 'Bearer ' + token });
    let options: RequestOptions = new RequestOptions({headers: headers});

    return this.http.get('http://www.students.com/api/users/getSessionData', options).subscribe(
       data => console.log(data),
       err => console.log(err)
     );
}

handlData(data){

    if(data.success){
        let usrData = data.data.user;
        this.user = new User(usrData.email, usrData.firstname, usrData.lastname, usrData.role, data.data.token);
        localStorage.setItem('id_token', data.data.token);
    }
}

handlError(error){
   console.log(error);
}

我尝试使用 angular2-jwt 模块,但我遇到了同样的错误,为了确保我的 API 工作正常,我使用 Postman chrome 扩展对其进行了测试,它按预期工作:

这是我的 Apache2 VirtualHost 配置

<VirtualHost *:80>
    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/html/students
    ServerName www.students.com
    <Directory /var/www/html/students>                        
        Require all granted  
        Options Indexes FollowSymLinks Includes
        AllowOverride all
    </Directory>
    Header always set Access-Control-Allow-Origin "*"                   
    Header always set Access-Control-Allow-Methods "POST, GET, OPTIONS"
    Header always set Access-Control-Allow-Headers "Origin, X-Requested-With, Content-Type, Accept, Authorization"
</VirtualHost>

有人遇到过同样的问题吗?任何想法为什么会发生这种情况?

【问题讨论】:

  • 你看过this answer
  • 感谢您的快速回复,不幸的是我已经这样做了,但没有运气

标签: angular cakephp get header authorization


【解决方案1】:

这不是 Angular 的问题,而是您的后端的问题。 Angular 试图通过检查服务器是否在 OPTIONS 请求上返回 OK 来发出预检请求。您应该将后端设置为响应 200 或 204 响应 OPTIONS 请求。

如果你使用的是 node.js:

app.use('/api', (req, res, next) => {
    /** Browser check for pre-flight request to determine whether the server is webdav compatible */
    if ('OPTIONS' == req.method) {
        res.sendStatus(204);
    }
    else next();
});

或 laravel (PHP):

App::before(function($request)
{
    // Sent by the browser since request come in as cross-site AJAX
    // The cross-site headers are sent via .htaccess
    if ($request->getMethod() == "OPTIONS")
        return new SuccessResponse();
});

这将告诉浏览器服务器可以适当地处理 webdav 请求方法。

更新:由询问者在 CakePHP 上添加:

public function initialize() {
    parent::initialize();

    if($this->request->is('options')) {
        $this->response->statusCode(204);
        $this->response->send();
        die();
    }

    $this->Auth->allow(['add', 'token']);
}

【讨论】:

  • 非常感谢,现在我明白为什么会这样了,所以如果有人在 Cakephp3 中遇到同样的问题,这就是我解决问题的方法:public function initialize() { parent::initialize(); if($this-&gt;request-&gt;is('options')) { $this-&gt;response-&gt;statusCode(200); $this-&gt;response-&gt;send(); die(); } $this-&gt;Auth-&gt;allow(['add', 'token']); },但我还是不明白为什么在每个 POST 或 GET 请求之前发送一个 OPTIONS 请求
  • @yassineelkhanboubi POST、GET、PUT 和类似的方法(我认为它们被正确地称为 WebDav 方法)在服务器上并不是主流。所以浏览器需要向服务器发送一个“preflight” OPTIONS 请求,以确定服务器是否真的支持 POST 和 GET(以及 PUT、PATCH 等)方法。根据我的经验,我必须在某些服务器环境中执行此操作,但在其他环境中则不需要。所以我认为在服务器级别有更合适的方法来做到这一点。我更新了我的答案,将您的解决方案包含在 Cake PHP 3 中。
  • @yassineelkhanboubi 请注意,204 是更适合空内容的响应代码。
  • 非常感谢您的解释和更新。
猜你喜欢
  • 2018-03-04
  • 1970-01-01
  • 2020-08-05
  • 1970-01-01
  • 2017-04-15
  • 2013-04-17
  • 2016-08-03
  • 2021-07-17
  • 2012-04-24
相关资源
最近更新 更多