【Laravel】ユーザのパスワード認証の実装を追う

 Laravelの用意した認証機能フレームワークでは要件を満たせないが暗号化の様なクリティカルな部分は抜き出して使いたいときがあります。実装を追うことでどこで何をしているか探します。
 Laravelのパスワードチェックはインターフェース\Illuminate\Contracts\Auth\UserProviderのvalidateCredentialsメソッドの実装で行われています。よくあるドキュメントにも書かれた認証ユーザもでる作成方法である\Illuminate\Auth\Authenticatableをuseする方法では\Illuminate\Auth\EloquentUserProviderクラスに実装があります。これは次の様になっています。

// \Illuminate\Auth\EloquentUserProvider
    /**
     * Validate a user against the given credentials.
     *
     * @param  \Illuminate\Contracts\Auth\Authenticatable  $user
     * @param  array  $credentials
     * @return bool
     */
    public function validateCredentials(UserContract $user, array $credentials)
    {
        $plain = $credentials['password'];
// Hasherのcheckメソッド実装が通ればOK
        return $this->hasher->check($plain, $user->getAuthPassword());
    }
    
    /**
     * Create a new database user provider.
     *
     * @param  \Illuminate\Contracts\Hashing\Hasher  $hasher
     * @param  string  $model
     * @return void
     */
    public function __construct(HasherContract $hasher, $model)
    {
        $this->model = $model;
// Hasherはインスタンス生成時に登録される
        $this->hasher = $hasher;
    }
// \Illuminate\Auth\CreatesUserProviders
    /**
     * Create an instance of the Eloquent user provider.
     *
     * @param  array  $config
     * @return \Illuminate\Auth\EloquentUserProvider
     */
    protected function createEloquentProvider($config)
    {
// Laravelに設定されたHasherを用いる
        return new EloquentUserProvider($this->app['hash'], $config['model']);
    }

 Laravel自体で用いるHasherは次のドキュメントで説明されています。
ハッシュ 6.x Laravel
 Laravelに登録されたHasherを呼び出す方法は簡単です。

Hash::任意のメソッド名();

 Hashファサードで繋がれた先がLaravelに登録されたHasherそのものです。ですので以下のコードで暗号化に関するLaravelの認証処理の暗号関連を再現できます。

 // ドキュメントにもある暗号化処理
$encryptedPassword = Hash::make($平文パスワード);

// 暗号化された値と平文の値が同じかチェック
if(Hash::check($平文パスワード, $encryptedPassword)){
    echo '同じです';
}else{
    echo '違います';
}

 認証から追ったせいで小難しくなりましたが、ハッシュから見ていくとあっという間の話でした。

>株式会社シーポイントラボ

株式会社シーポイントラボ

TEL:053-543-9889
営業時間:9:00~18:00(月〜金)
住所:〒432-8003
   静岡県浜松市中央区和地山3-1-7
   浜松イノベーションキューブ 315
※ご来社の際はインターホンで「316」をお呼びください

CTR IMG