私はLaravelアプリケーションを開発しています。私のアプリケーションはLaravel組み込みの認証機能を使用しています。Laravelユーザーが登録すると、確認メールが送信されます。ユーザーがメール内のリンクをクリックしたことを確認すると、ユーザーはまだログインしていない場合、メールを確認するために再度ログインする必要があります。
VerificationController
class VerificationController extends Controller
{
use VerifiesEmails, RedirectsUsersBasedOnRoles;
/**
* Create a new controller instance.
* @return void
*/
public function __construct()
{
$this->middleware('auth');
$this->middleware('signed')->only('verify');
$this->middleware('throttle:6,1')->only('verify', 'resend');
}
public function redirectPath()
{
return $this->getRedirectTo(Auth::guard()->user());
}
}
この行にコメントしてみました。
$this->middleware('auth');
しかし、それは機能せず、代わりにエラーをスローします。 Laravelを有効にして、ユーザーがログインしていない場合でもメールを確認できるようにするにはどうすればよいですか?
まず、行ったように、$this->middleware('auth');
という行を削除します。
次に、verify
メソッドをVerifiesEmails
特性からVerificationController
にコピーし、少し変更します。メソッドは次のようになります。
public function verify(Request $request)
{
$user = User::find($request->route('id'));
if (!hash_equals((string) $request->route('hash'), sha1($user->getEmailForVerification()))) {
throw new AuthorizationException;
}
if ($user->markEmailAsVerified())
event(new Verified($user));
return redirect($this->redirectPath())->with('verified', true);
}
これにより、VerifiesUsers
トレイトのメソッドがオーバーライドされ、承認チェックが削除されます。
セキュリティ(間違っている場合は修正してください))
リクエストは署名され検証されているため、安全です。誰かが何らかの理由で確認メールにアクセスできる場合、他のユーザーのメールアドレスを確認することができますが、99%の場合、これはまったくリスクになりません。
// For Laravel 6 and Above
use Illuminate\Auth\Events\Verified;
use Illuminate\Http\Request;
use App\User;
// comment auth middleware
//$this->middleware('auth');
public function verify(Request $request)
{
$user = User::find($request->route('id'));
if (!hash_equals((string) $request->route('hash'), sha1($user->getEmailForVerification()))) {
throw new AuthorizationException;
}
if ($user->markEmailAsVerified())
event(new Verified($user));
return redirect($this->redirectPath())->with('verified', true);
}
ログインせずにアクティブなユーザーアカウントにしたい場合は、2つの手順で実行できます。
1- VerificationControllerの認証ミドルウェアを削除またはコメント
以下の例:
public function __construct()
{
//$this->middleware('auth');
$this->middleware('signed')->only('verify');
$this->middleware('throttle:6,1')->only('verify', 'resend');
}
2- {id}を渡すルートを検証するため、検証機能を編集して、以下のコードのようなルートIDリクエストでユーザーを見つけることができます。
ファイルパス:*:\ yourproject\vendor\laravel\framework\src\Illuminate\Foundation\Auth\VerifiesEmails.php
$user = User::findOrfail($request->route('id'));
完全な例
public function verify(Request $request)
{
$user = User::findOrfail($request->route('id'));
if (! hash_equals((string) $request->route('id'), (string) $user->getKey())) {
throw new AuthorizationException;
}
if (! hash_equals((string) $request->route('hash'), sha1($user->getEmailForVerification()))) {
throw new AuthorizationException;
}
if ($user->hasVerifiedEmail()) {
return redirect($this->redirectPath())->with('verified', true);
}
if ($user->markEmailAsVerified()) {
event(new Verified($request->user()));
}
return redirect($this->redirectPath())->with('registered', true);
}