使用 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 中不起作用