首页 > 解决方案 > Laravel Passport CreateFreshApiToken 初始登录和工作流程

问题描述

我有一个 Vue CLI 前端,所以我尝试使用 Laravel Passport 来处理请求的身份验证。

https://laravel.com/docs/5.7/passport#sumption-your-api-with-javascript

我有api/login一条执行以下操作的路线(几乎从这里复制和粘贴):

public function login(){ 
  if(Auth::attempt(['email' => request('email'), 'password' => request('password')])){ 
    $user = Auth::user(); 
    $success['token'] =  $user->createToken('MyApp')->accessToken; 
    return response()->json(['user' => $user], $this->successStatus);
  } 
  else{ 
    return response()->json(['error'=>'Unauthorised'], 401); 
  } 
}

在我用 AJAX 请求点击它后,用户成功登录。

但是如果我在我的 Vue 操作中做这样的事情:

login({commit, dispatch}, {email, password}){
  axios.post('/api/login', {
    email, password 
  }).then( response => {
    console.log("Check login was successful", response.data);
    commit('setUser', response.data);
    axios.get("/api/user").then(response => {
      console.log("Still logged in:", response);
    });
  });

控制台显示以下内容:

Check login was successful {user: {…}}
GET http://localhost:8080/api/user 401 (Unauthorized)

Laravel 文档说...

此 Passport 中间件会将 laravel_token cookie 附加到您的传出响应中。

我在做什么错/如何访问它laravel_token以获取将来的请求?

标签: laravellaravel-passport

解决方案


我通过执行以下操作解决了这个问题。

我已经在创建accessToken,并且从未将其发回。所以第1步:

if(Auth::attempt(['email' => request('email'), 'password' => request('password')])){ 
  $user = Auth::user(); 
  $accessToken =  $user->createToken('MyApp')->accessToken; 
  return response()->json(compact('user','accessToken'), $this->successStatus);
} 

然后在我的 Axios 请求中:

axios.post('/api/login', {
    email, password 
  }).then( response => {
    // Send the auth token every time : )
    axios.defaults.headers.common['Authorization'] = "Bearer " + response.data.accessToken;
    commit('setUser', response.data.user);
  });

推荐阅读