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 '違います';
}
認証から追ったせいで小難しくなりましたが、ハッシュから見ていくとあっという間の話でした。