0

我观看了本教程以使用 laravel sanctum 进行 api 令牌身份验证。登录时,我检索了添加到 axios 标头的 Bearer 令牌。但是当尝试通过 /api/user 获取用户时,我得到一个 401。请注意,我不使用 CSRF 令牌,因为我使用的是Sanctum Api 令牌身份验证而不是 SPA 身份验证。

我有一个用于所有 axios 请求的 api 文件,看起来像

let axiosInstance = axios.create({
  baseURL: 'http://some-url.local/api',
})

let api = function () {
  let token = localStorage.getItem('token');
  if (token) {
    axiosInstance.defaults.headers.common['Authorization'] = `Bearer ${token}`;
  }
  return axiosInstance;
}

export { api }

一些认证功能

import {
  api
} from 'boot/axios'

export default {
  register(form){
    return api().post('/register', form)
  },
  login(form) {
    return api().post('/login', form)
  },
  logout(){
    return api().post('/logout')
  },
  auth(){
    return api().get('/user')
  }
}

登录控制器

class LoginController extends Controller{
  public function login(Request $request){
    $this->validate($request, [
        'email' => 'required|email',
        'password' => 'required',
        'deviceName' => 'required'
    ]);

    $user = User::where('email', $request->email)->first();

    if (!$user || !Hash::check($request->password, $user->password)) {
        throw ValidationException::withMessages([
            'email' => ['The provided credentials are incorrect.'],
        ]);
    }
    return $user->createToken($request->deviceName)->plainTextToken;
  }

  public function logout(Request $request)
  {
    $request->user()->tokens()->delete();

    return response()->json('logout successful', 201);
  }
}

在 routes/api.php 中路由

Route::middleware('auth:sanctum')->get('/user', function (Request $request) {
  return $request->user();
});

我在我的用户模型中使用 HasApiTokens,在 config/sanctum.php 中有 'prefix' => 'api',在 config/cors.php 中有 'paths' => ['api/*'] 并且有 'api' => [ 'driver' => 'sanctum',...] 在我的 config/auth.php

我看了该教程两次并复制了所有内容(除了我使用的是 Quasar 框架),搜索了整个谷歌和 stackoverflow ......我不明白,请帮忙!我确实收到了不记名令牌,所以应用程序认为我已登录,但无法获取我的用户数据。在上面提到的教程的第 1 部分中,也做了同样的事情,但是使用 SPA 身份验证 (csrf) 并且这个确实有效!

更新

似乎它适用于http://127.0.0.1:8000/上的 php artisan serve ,但不适用于http://some-domain.local或公共域上的MAMP

为什么...

4

2 回答 2

2

解决了!

对于其他有此问题的人:似乎由于某种原因,我的 Bearer 令牌已从 laravel 端点上的请求中删除(我仍然不知道为什么)。

向 axios 添加自定义标头(X-Authorization)并使用中间件解决服务器端问题!更多信息在这里

于 2020-10-24T21:47:51.283 回答
0

将此设置在您的.env文件中。在我的情况下,它端口 8000

SESSION_DRIVER=cookie
SESSION_DOMAIN=localhost
SANCTUM_STATEFUL_DOMAINS=localhost:8000
于 2020-10-23T21:04:21.643 回答