Laravel PassportでOAuth2サービスプロバイダを後付けした
Laravel には Laravel Passport という OAuth2 実装があります。
API認証(Passport) 5.3 Laravel
普通はマニュアルどおりにやるだけで構築できるんですが、Laravel Native なアプリケーションでない場合、テーブル名やカラム名が違って単純にいきません。そんな場合の対応を残しておきます。
Laravel 5.5、Laravel Passport 4.0 で試しました。あんまり深掘りしてないので適当書いてるかもしれません。
前提
DBマイグレーションで生成される oauth_* テーブルはそのまま使います。
テーブル名が users じゃない場合
User クラスに $table プロパティをセットすればよいです。Eloquentの仕様ですね。
protected $table = 'user'; // テーブル名が user の場合
プライマリキーのカラム名が id じゃない場合
Eloquent 的には User クラスに $primaryKey をセットすればいいんですが、Laravel Passport には getAuthIdentifirName メソッドをオーバーライドする必要があります。
getAuthIdentifirName は Authenticatable インターフェースにあるメソッドです。
認証 5.3 Laravel
public function getAuthIdentifierName() { return 'user_id'; // プライマリキーが user_id の場合 }
ユーザ名のカラム名が username じゃない場合
User クラスで findForPassport メソッドをオーバライドします。
引数 $username に入力されたユーザ名がセットされるので、User モデルの検索条件を調整してレコードを返却すればOKです。
public function findForPassport($username) { return $this->where('user_name', $username)->first(); // カラム名が user_name の場合 }
パスワードのカラム名がpasswordじゃない・独自の保存形式の場合
User クラスで validateForPassportPasswordGrant() メソッドをオーバライドします。
引数 $password に入力されたパスワードがセットされるので、User モデルのパスワード情報と比較すればOKです。
public function validateForPassportPasswordGrant($password)
{
return $password === $this->pass; // カラム名がpass かつ 平文保存(!)の場合
}