繁体   English   中英

Angular 2未使用JWT身份验证发送授权标头

[英]Angular 2 not sending Authorization header using JWT authentication

我正在尝试使用Angular2作为前端和Cakephp 3作为REST Api创建一个应用程序,身份验证工作正常,但是当我尝试访问任何其他URL时,我得到了401未经授权状态,并且我注意到请求方法是选项而不是我在代码中使用的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>

有人遇到同样的问题吗? 任何想法为什么会这样?

这不是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上由asker添加:

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM