使用 laravel Sanctum 和 api 令牌身份验证获取用户时出现 401(未经授权)[重复]

Posted

技术标签:

【中文标题】使用 laravel Sanctum 和 api 令牌身份验证获取用户时出现 401(未经授权)[重复]【英文标题】:401 (Unauthorized) while fetching user using laravel Sanctum with api token authentication [duplicate] 【发布时间】:2021-02-06 21:34:48 【问题描述】:

我看了 this tutorial 使用 laravel sanctum 进行 api 令牌认证。登录时,我检索了添加到 axios 标头的 Bearer 令牌。但是当尝试通过 /api/user 获取用户时,我得到了 401。请注意,我不使用 CSRF 令牌,因为我使用的是 Sanctum Api Token Authentication 而不是 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 框架),在谷歌和 *** 上搜索了一遍......我不明白,请帮忙!我确实收到了不记名令牌,所以应用程序认为我已登录,但无法获取我的用户数据。在上面提到的教程的第 1 部分中,也做了同样的事情,但使用 SPA 身份验证 (csrf) 并且这个确实有效!

更新

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

为什么...

【问题讨论】:

【参考方案1】:

解决了!

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

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

【讨论】:

【参考方案2】:

在您的.env 文件中设置它。就我而言,它是端口 8000

SESSION_DRIVER=cookie
SESSION_DOMAIN=localhost
SANCTUM_STATEFUL_DOMAINS=localhost:8000

【讨论】:

这似乎只在使用 php artisan serve 命令服务时才有效。不是在使用 MAMP 时 我在 laragon 上使用 fl.test 域检查了我的项目,但没有运行 artisan 命令,一切正常。我无法区分 laragon 和 MAMP 之间的区别。我看到的唯一区别是我没有将 api 驱动程序更改为“圣所”,而是将其保留为“令牌” 我已将 api 驱动程序设置回“令牌”,但没有任何区别。看来我只有在前端和后端在同一个域/子域上运行时才获得授权。无法让它在不同的域上工作。 (在公共域上托管时同样的问题)

以上是关于使用 laravel Sanctum 和 api 令牌身份验证获取用户时出现 401(未经授权)[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Laravel Sanctum auth:sanctum 路由允许在没有承载令牌的情况下访问

如何使用 CSRF 令牌测试 Laravel / Sanctum 端点

Laravel Sanctum Token API 身份验证在 Postman 中不起作用

如何使用 Laravel Sanctum 处理 SPA 和基于令牌的身份验证

Laravel Sanctum 令牌()未定义

如何使用 Laravel Sanctum 和 React 修复 401 Unauthorized 错误?