【发布时间】:2020-06-01 00:15:31
【问题描述】:
我使用密码进行用户身份验证,每次身份验证后我都会分配一个安全的 cookie 来存储护照令牌。 A 能够使用Auth::attempt() 方法成功进行身份验证,但Auth::user() 为空。即使在同一个控制器中,在 logout() 方法上,用户也是未定义的,我什至不能Auth::logout()。
登录方式:
public function login(Request $request)
{
$request->validate([
'email' => 'required|string|email',
'password' => 'required|string',
]);
$credentials = \request(['email', 'password']);
if (Auth::attempt($credentials)) {
$user = Auth::user();
$token = $user->createToken('Personal Access Token')->accessToken;
$cookie = $this->getSessionCookie($token);
return response()
->json([
'user' => $user,
'token' => $token,
], 200)
->cookie(
$cookie['name'],
$cookie['value'],
$cookie['minutes'],
$cookie['path'],
$cookie['domain'],
$cookie['secure'],
$cookie['httponly'],
$cookie['samesite']
);
} else {
return response()->json([
'error' => 'Invalid Credentials',
], 422);
}
}
注销方法:
public function logout(Request $request)
{
$request->user()->token()->each(function ($token, $key) {
$token->delete();
});
$cookie = \Cookie::forget('auth_token');
Auth::logout();
return response()->json([
'message' => 'Logged out successfully.'
], 200)->withCookie($cookie);
}
这里Auth::logout()产生Method Illuminate\Auth\RequestGuard::logout does not exist.否则注销成功。
我的 API 路由:
Route::group(['prefix' => 'v1'], function() {
// Authentication
Route::post('/login', 'AuthController@login');
Route::post('/register', 'AuthController@register');
Route::post('/password/reset', 'AuthController@sendPasswordResetLink');
Route::post('/password/update', 'AuthController@callResetPassword');
// Articles
Route::get('/articles', 'ArticleController@index');
Route::middleware(['auth.header', 'auth:api'])->group(function () {
// Get Logged in User
Route::get('/user', function (Request $request) {
return $request->user(); // returns the actual logged in user
});
// Articles
Route::post('/articles', 'ArticleController@store');
Route::get('/articles/{id}', 'ArticleController@show');
Route::put('/articles/{id}', 'ArticleController@update');
Route::delete('/articles/{id}', 'ArticleController@destroy');
// Log Out
Route::post('/logout', 'AuthController@logout');
});
});
Auth::user() 为 null 的示例控制器:
class ArticleController extends Controller
{
public function index(Request $request)
{
$user = \auth()->user(); // null
$user = Auth::user(); // null
$user = $request->user(); // null
}
}
在 index 方法中,我知道为什么用户为 null,因为路由没有包含在 auth:api 中间件中,但是即使不需要,我如何在此方法中获取 auth 用户。
我确定我错过了一些东西,但我不知道是什么。我很乐意提供更多代码。
编辑:
我的auth.api中间件:
class AuthenticationHeader
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if (!$request->bearerToken()) {
if ($request->hasCookie('auth_token')) {
$token = $request->cookie('auth_token');
$request->headers->add(['Authorization' => 'Bearer ' . $token]);
}
}
return $next($request);
}
}
【问题讨论】:
-
什么是 auth.header 中间件?
-
@FouèdMoussi 它将不记名令牌安全 http cookie 附加到授权标头
-
您可以禁用它,然后再试一次吗?
-
@FouèdMoussi 我做了,但问题是,没有不记名令牌,护照的
auth:api拒绝请求,它真的是一个简单的中间件,我更新了代码,你可以看看它。跨度> -
我遇到了同样的问题,你找到什么解决方案了吗?
标签: laravel rest laravel-passport