2016-12-10 13 views
2

私はフロントエンドとしてAngular2を使用してアプリケーションを作成しようとしています、そして、REST APIとしてcakephp 3、認証はうまくいきます。しかし、他のURLにアクセスしようとすると、 401の権限状態、と私はリクエストメソッドがOPTIONS代わりのは、私は私のコードで使用され、私のトークンと認証ヘッダーがサーバーに送信されませんをGETであることに気づい:角2はJWT認証を使用して認証ヘッダーを送信しません

enter image description here

ここに私の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が正常に動作することを確認するために、私はポストマンクロームでそれをテストしました拡張とそれが期待通りに働いていた:

enter image description here

を、ここに私のApache2のVirtualHostの設定です

<VirtualHost *:80> 
    ServerAdmin [email protected] 
    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> 

誰かが同じ問題を抱えていましたか?それはなぜ起こっているのでしょうか?

+0

は、あなたが見てきました[この回答](http://stackoverflow.com/a/38186000/2435473) –

+0

は、あなたの迅速な返事をありがとうございました残念ながら私はすでに行っていましたが運がありません –

答えて

3

これはAngularでは問題ありませんが、バックエンドでは問題ありません。 Angularは、サーバーがOPTIONS要求でOKを返すかどうかを調べることによって、プリフライトリクエストを作成しようとしています。 OPTIONS要求に対して200または204で応答するようにバックエンドを設定する必要があります。

を使用している場合の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の要求メソッドを処理できるブラウザを教えてくれます。

UPDATE: CakePHPの上アスカーによって追加:

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

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

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

どうもありがとう、なぜこれが起こっているのか分かりましたので、誰かがCakephp3で同じ問題を抱えていた場合、これが私が問題を解決した方法です: 'public function initialize() { parent :: initialize(); if($ this-> request->( 'options')){ $ this-> response-> statusCode(200); $ this-> response-> send(); die(); } $ this-> Auth-> allow(['add'、 'token']); } '、しかし、私はまだOPTIONSリクエストがPOSTまたはGETリクエストの前に送信される理由を理解していません。 –

+0

@yassineelkhanboubi POST、GET、PUTなどのメソッド(WebDavメソッドと正しく呼ばれていると思います) 。そのため、ブラウザは、サーバーが実際にPOSTメソッドとGET(およびPUT、PATCHなど)メソッドをサポートしているかどうかを判断するために、サーバーに "プリフライト" OPTIONS要求を送信する必要があります。私の経験では、いくつかのサーバー環境ではなく、他のサーバー環境でこれを行う必要がありました。ですから、サーバーレベルでこれを行うより適切な方法があると思います。あなたの解決策をCake PHP 3に含めるように私の答えを更新しました。 – borislemke

+0

@yassineelkhanboubi 204は空のコンテンツのより適切な応答コードです。 – borislemke

関連する問題