Laravel Sanctum Vuejs 验证自动登录的电子邮件

时间:2021-02-23 21:23:11

标签: laravel vue.js authentication nuxt.js laravel-sanctum

我有一个带有 Sanctum 身份验证的 Laravel 7 API,VueJS (Nuxt SPA) 前端。注册(Laravel 身份验证脚手架)后,用户必须验证他们的电子邮件地址。通常 app+auth 工作正常,但我注意到以下是可能的:

  1. 用户注册帐号
  2. 用户收到一封带有验证 URL 的电子邮件并使用它,在前端 /verify-email/ 路由中使用 &expires= 和 &signature= 参数进行处理
  3. 在VueJS创建的方法中处理电子邮件验证(对Laravel Auth\VerificationController@verify API端点的axios GET请求)后,无论成功还是错误,用户都将被重定向到主页登录页面 this.$router.push(' /')
  4. 根据我对 Nuxt Auth 模块 (https://auth.nuxtjs.org/) 的配置,这会导致前端 /login/ 路由
  5. 这是关键步骤。重定向后,Vue 表现得好像我没有登录并强制用户从 http://localhost:3000/ 到 http://localhost:3000/login。但是,如果我完全刷新页面或转到地址栏中的 http://localhost:3000,访问者会突然通过身份验证并访问其帐户上的主页。这真的是它应该如何工作还是我的设置不正确? (用户在没有实际登录的情况下登录感觉有点狡猾)

我试图准确了解身份验证发生的位置。注册完成后但在验证电子邮件之前,在 /login/ 上有一个对标准用户端点 /api/user 的请求,并带有 403 响应。我认为这是正常的 Nuxt 身份验证模块行为。 我可以看到电子邮件验证 api 端点具有带有 Set-Cookie XSRF-token 和 session 的响应标头。应该有吗?

我的 VerificationController/verify 方法看起来像这样

class VerificationController extends Controller
{
    use VerifiesEmails;

    /**
     * Mark the authenticated user's email address as verified.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function verify(Request $request)
    {
        if ($request->route('id') == $request->user()->getKey() &&
            $request->user()->markEmailAsVerified()) {
            event(new Verified($request->user()));
        }

        return response()->json('Email verified.');
    }

我的 Nuxt/Vue 验证电子邮件页面组件如下所示

export default {
  auth: 'guest',
  created() {
    this.$axios.get(this.$route.query.query)
    .then(response => {
      this.$router.push('/');
    })
    .catch(error => {
      console.log(error);
      this.$router.push('/');
    })
  }
}

Laravel web.php/auth 路由

Route::group(['prefix' => 'auth'], function(){
    Auth::routes();
    Route::get('email/verify/{id}', 'Auth\VerificationController@verify')->name('verification.verify');
    Route::get('email/resend', 'Auth\VerificationController@resend')->name('verification.resend');
});

我要么不希望用户登录(最好),要么在验证电子邮件后直接成功登录以明确用户已登录

0 个答案:

没有答案