close

最近我遇到一個需求,Laravel使用passport 來頒發token ,讓客戶端可以透過token存取api。 唯一有幾個地方需要客製化。

  1. 必須要按照給定的格式給response 。
  2. 登入的username和password並不在同一張表。原本是在同一張表的,後來需求變成要不同表。
  3. 驗證的方式並不像預設的演算法,而是要加鹽等等。

讓我們一個一個來解決這個問題。 我們先解3: 假設laravel 的auth provider是user的話 那麼照理說,你的User Model 會是這樣的:

class User extends Authenticatable

如果是這樣的話,那麼你只需要在這個class加上

    public function validateForPassportPasswordGrant($password)
    {   
        return isset($password);
    }

實際上絕對不要這樣寫,我只是給個範例而已。 首先,加上這個function 等於是overide驗證passowrd的function ,所以中間無論加入什麼規則,你只要回傳布林值就好了。回傳true就是通過,bool就是不通過。 這樣3就解了。 接下來解1 1需求是,要修改掉auth的response, 首先,先找到你的AuthServiceProvider.php 把boot()內容改成類似下面的內容

public function boot()
    {
        $this->registerPolicies();

        Passport::routes();

        Route::post('/oauth/token', [
            'uses' => '\App\Http\Controllers\PassportTokenController@issueToken',
            'as' => 'passport.token',
            'middleware' => 'throttle',
        ]);


    }

這裡主要是要蓋掉passport 提供的issueToken 方法的route。讓它導向我們自製的class\App\Http\Controllers\PassportTokenController的issueToken方法,而不是他原本的class。

接下來到自製的class的檔案。我這邊是直接做了一個controller。

....
class PassportTokenController extends AccessTokenController

這裡繼承了AccessTokenController ,也就是passport原本的class,因為我們的目的只是改寫issueToken的response而已,原本的方法還是要用的,所以用繼承會方便許多。 接下來就在class內overide他吧


    function issueToken(ServerRequestInterface $request)
    {
        $result = json_decode(parent::issueToken($request)->getContent(),true);
        return responder()->success($result);
    }

如你所見,我做的事情其實也不過就是把request丟到parent::issueToken()裡面,完全是照他原本的方法,只是我把他的結果拿出來解析,並且套上從別的套件來的responder而已。 這樣這個需求就完成了,下一個。

下一個需求: 登入的username和password並不在同一張表。原本是在同一張表的,後來需求變成要不同表。

我們回到User model吧,在User.php 裡面加入

 public function findForPassport($staffNo)
    {
        $staffTable =  Staff::where('staff_no', $staffNo)->first()->user_id;
        return $this->where('user_id', $staffTable)->first(); 
    }

Staff 是另外一個可以操作staff table的 model, staff_no是要登入的username欄位。而他們之間關聯的欄位就是user_id。也就是說帳號在Staff表,但密碼在User表。你只要重寫findForPassport這個function,並且根據你自己的規則能給出一個User的model 即可。

以上範例程式都沒有加入use ...字眼,請自行加入。

arrow
arrow
    文章標籤
    程式 laravel
    全站熱搜

    工程師黑田 發表在 痞客邦 留言(0) 人氣()