出張おはき゛ろく

Twitterで書ききれないことを書こうと思います。

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 かつ 平文保存(!)の場合
}

注意

Laravel Passport の Laravel/Passport/Bridge/UserRepository.php にある getUserEntityByUserCredentials() の実装から類推しました。
文章化されている仕様かどうかは確認していません。