LARAVEL & VUE:如何通过 API 请求获取登录用户的 API_TOKEN?

Posted

技术标签:

【中文标题】LARAVEL & VUE:如何通过 API 请求获取登录用户的 API_TOKEN?【英文标题】:LARAVEL & VUE: How can I get the API_TOKEN of the logged in user with an API request? 【发布时间】:2019-10-28 19:18:34 【问题描述】:

我有一个使用 VUE 和 LARAVEL 5.8 的 SPA 我已经设置了一个与登录用户关联的 API_TOKEN。登录后一切正常。我得到了 API_TOKEN,我将它保存到一个 var 中,并与 Axios 请求一起发送。在 Laravel 中,我有一个中间件负责处理令牌并将其与登录用户的设置进行比较。

问题发生在会话到期时。因为我仍然可以浏览私人页面并发出 API 请求来保存和删除内容。我认为这是可能的,因为我仍然在 var 中保存了相同的 API_TOKEN,并且中间件显然没有得到会话已过期。

所以我想在每次执行 Ajax 时获取 API_TOKEN,请求因此当会话过期时,我将无法获取令牌,因此我将无法完成请求。

这是我的设置。

web.php 是我唯一指向singlePageController 的php 路由:

Auth::routes();

Route::get('/any', 'SinglePageController@index')->where('any', '.*');

然后在singlePageController我返回视图:

class SinglePageController extends Controller
    
        public function index() 
        return view('app', ['loggedUser' => auth()->user()]);
    

然后我有 api.php 我有 API 路由。正如你在最后看到的,我有中间件将其设为私有。举个例子,这是我用来更新内容的例子:

Route::put('event/update/slug', 'EventController@update')->middleware('auth:api');

然后是那个 API 路由的相关控制器:

public function update(Request $request, $slug)

    $event = Event::where('slug', $slug)->first();

    $event->title = $request->input('title');

    return new EventResource($event);
 

最后,这是我用来定义 API 数据的显示内容和方式的资源:

public function toArray($request)

    // return parent::toArray($request);

    return [
        'id' => $this->id,
        'title' => $this->title,
        'slug' => $this->slug,
        'curator' => $this->curator,
        'featured_image' => $this->featured_image,
        'body' => $this->body,
        'date' => $this->date
    ];
 

以上就是我的流程。然后,当我进行 axios 调用以更新内容时,我正在执行以下操作:

    axios(
            method: 'PUT',
            url: '/api/event/update/' + this.$route.params.slug + '?api_token=' + this.isLogged.apiToken,
            data: dataToSave,
            headers: 
                'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
            
        )  
        .then((response) => 
            this.getNotification('Success: The Event has been saved');
        )
        .catch((error) => 
            this.getNotification('Error: Impossible saving the event');
            console.log(error);
        )

你知道怎么做吗?或者是否有更好的方法来实现?

【问题讨论】:

你能发布你的中间件代码吗? 就是这个laravel.com/docs/5.8/api-authentication#protecting-routes。但我不知道在哪里可以找到代码,因为它是在 Laravel 中构建的,而且显然它不在 Laravel 拥有的中间件之一中。我添加了我当前的设置 【参考方案1】:

你喜欢,你的登录方式应该是这样的。

  public function login(Request $request)
    

        if (Auth::attempt(['email' => $request['email'], 'password' => $request['password']])) 
            $user = Auth::user();
            $success = $user->createToken(config('app.name'))->accessToken;
            return response()->json(["token" => $success, 'status' => 200]);
         else 
            return response()->json(['message' => "Email or Password do not match"], 401);
        
    

【讨论】:

我添加了我当前的设置 您获得访问令牌了吗? 令牌不是问题。我要在执行 Ajax 请求时检查会话是否有效。这是关于会话,而不是令牌。 @rolfo85 检查会话是否有效,您可以在路由中使用 auth 中间件,要检查令牌是否有效,您可以在 api 路由中使用 api:auth 中间件 它不起作用。我将更新 API 路由包装到此 Route::group(['middleware' => ['auth:api', 'auth']], function() ... 但是如果我手动删除会话并尝试立即保存它,它保存没有错误。如果我反转并首先放入中间件“auth”,我会收到 401 错误。我认为这就是为什么在 Ajax 请求中没有会话信息,所以当 auth中间件正在检查它,它没有找到任何东西并抛出 401。

以上是关于LARAVEL & VUE:如何通过 API 请求获取登录用户的 API_TOKEN?的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 和 Vue JS 路由

将 Laravel 路由传递给 vue 组件

如何在惯性和 Laravel 8 中禁用 devtools

Laravel 55 - Passport & Vue - auth/login/logout

vue.js 组件使用 laravel 刀片作为模板

Laravel Vue 网络通知组件错误