web-dev-qa-db-ja.com

Laravelへのログインをユーザーに要求せずにメールを確認する方法

私は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を有効にして、ユーザーがログインしていない場合でもメールを確認できるようにするにはどうすればよいですか?

9
Wai Yan Hein

まず、行ったように、$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%の場合、これはまったくリスクになりません。

7
Wouter Florijn
// 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);
}
0
Abid Shah

ログインせずにアクティブなユーザーアカウントにしたい場合は、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);
}
0
Surf Junky