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

时间:2019-06-14 07:20:59

标签: laravel api session vue.js axios

我有一个使用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);
        })

您知道如何制作吗?还是有更好的方法可以做到这一点?

1 个答案:

答案 0 :(得分:0)

您确实喜欢,您的登录方法应该是这样。

  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);
        }
    }