使用 laravel Sanctum 和 api 令牌身份验证获取用户时出现 401(未授权)
401 (Unauthorized) while fetching user using laravel Sanctum with api token authentication
我看了 this tutorial for api token authentication with laravel sanctum. When logging in, I retrieve a Bearer token which I add to the axios header. But when trying to fetch the user via /api/user, I get a 401. Notice that I don't use CSRF tokens since I'm using Sanctum Api Token Authentication 而不是 SPA 认证。
我有一个 api 文件,用于所有看起来像
的 axios 请求
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、'paths' => [[=41] 中有 'prefix' => 'api' =]] 在 config/cors.php 中 'api' => ['driver' => 'sanctum',...] 在我的 config/auth 中。 php
那个教程我看了两遍,完全一样地复制了所有内容(除了我使用的是 Quasar 框架),搜索了整个 google 和 Whosebug...我不明白,请帮助!我确实收到了 Bearer 令牌,因此该应用认为我已登录,但无法获取我的用户数据。在上面提到的教程的第 1 部分中,完成了相同的操作,但是使用 SPA 身份验证 (csrf) 并且这个确实有效!
更新
它似乎可以在 http://127.0.0.1:8000/, but not with MAMP serving on http://some-domain.local 或 public 域
上与 php artisan serve 一起使用
为什么...
在您的 .env
文件中进行设置。在我的例子中它是端口 8000
SESSION_DRIVER=cookie
SESSION_DOMAIN=localhost
SANCTUM_STATEFUL_DOMAINS=localhost:8000
已解决!
对于遇到此问题的其他人:
由于某种原因,我的 Bearer 令牌似乎已从 laravel 端点的请求中删除(我仍然不知道为什么)。
向 axios 添加自定义 header (X-Authorization) 并使用中间件解析服务器端修复它!更多信息 here
我看了 this tutorial for api token authentication with laravel sanctum. When logging in, I retrieve a Bearer token which I add to the axios header. But when trying to fetch the user via /api/user, I get a 401. Notice that I don't use CSRF tokens since I'm using Sanctum Api Token Authentication 而不是 SPA 认证。
我有一个 api 文件,用于所有看起来像
的 axios 请求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、'paths' => [[=41] 中有 'prefix' => 'api' =]] 在 config/cors.php 中 'api' => ['driver' => 'sanctum',...] 在我的 config/auth 中。 php
那个教程我看了两遍,完全一样地复制了所有内容(除了我使用的是 Quasar 框架),搜索了整个 google 和 Whosebug...我不明白,请帮助!我确实收到了 Bearer 令牌,因此该应用认为我已登录,但无法获取我的用户数据。在上面提到的教程的第 1 部分中,完成了相同的操作,但是使用 SPA 身份验证 (csrf) 并且这个确实有效!
更新
它似乎可以在 http://127.0.0.1:8000/, but not with MAMP serving on http://some-domain.local 或 public 域
上与 php artisan serve 一起使用为什么...
在您的 .env
文件中进行设置。在我的例子中它是端口 8000
SESSION_DRIVER=cookie
SESSION_DOMAIN=localhost
SANCTUM_STATEFUL_DOMAINS=localhost:8000
已解决!
对于遇到此问题的其他人: 由于某种原因,我的 Bearer 令牌似乎已从 laravel 端点的请求中删除(我仍然不知道为什么)。
向 axios 添加自定义 header (X-Authorization) 并使用中间件解析服务器端修复它!更多信息 here