鍍金池/ 問答/PHP  網(wǎng)絡(luò)安全/ laravel passport 使用 javascript 調(diào)用接口出現(xiàn) 30

laravel passport 使用 javascript 調(diào)用接口出現(xiàn) 302 重定向錯(cuò)誤如何解決??

使用 laravel passport 作為 api 認(rèn)證。使用授權(quán)碼方式已經(jīng)申請(qǐng)到了有效token

postman 中運(yùn)行正常:

clipboard.png

通過 javascript 訪問的時(shí)候卻出現(xiàn)了問題!

clipboard.png

clipboard.png

javascript 代碼如下:

clipboard.png

我表示特別無語,為什么 postman 使用 token 都正常,然后 javascript 使用 token 訪問卻認(rèn)證不成功進(jìn)行了重定向!!

回答
編輯回答
別硬撐

當(dāng)請(qǐng)求包含自定義請(qǐng)求頭(有的時(shí)候Authorization也被算是自定義頭)的時(shí)候, 瀏覽器在發(fā)起真正的請(qǐng)求前會(huì)以options方式發(fā)起preflight請(qǐng)求. 而Laravel沒有正確處理好預(yù)檢請(qǐng)求, 所以就會(huì)返回404, 然后web服務(wù)器重定向404到錯(cuò)誤頁面。

下面的解決方式不是非常優(yōu)雅:
就是添加處理preflight的中間件.

<?php

namespace App\Http\Middleware;

use Closure;

class PreflightResponse
{
    /**
    * Handle an incoming request.
    *
    * @param \Illuminate\Http\Request $request
    * @param \Closure $next
    * @return mixed
    */
    public function handle($request, Closure $next )
    {
        if ($request->getMethod() === "OPTIONS") {
            return response('');
        }

            return $next($request);
     }
 }

然后在App/Http/kernel.php中注冊(cè)該中間件.

protected $middleware = [
    \App\Http\Middleware\PreflightResponse::class,
    // ...
];

應(yīng)該就能修復(fù)這個(gè)問題

2018年3月6日 06:24