У меня есть три типа Authenticatable модели, и мне нужно иметь отдельную аутентификацию JWT для каждой.Позвольте мне подробнее рассказать о моей проблеме.
Я использую MongoDB в качестве базы данных, а Laravel MongoDB - это пакет, который я использую.
User
, Admin
и ServiceProvider
- мои модели.
Чтобы иметь JWT-аутентификацию в Laravel, я использую пакет jwt-auth .Это нормально с моделью пользователя (коллекция).когда я хочу использовать JWT с любой другой моделью, он не работает и снова все делает с user
.
Я много искал и обнаружил, что для изменения модели пользователя провайдера я могу использовать Config::set();
метод, как показано ниже,
Config::set('jwt.user', Admin::class);
Config::set('auth.providers.users.model', Admin::class);
Но не влияет на аутентификацию JWT.(Я проверил значения 'jwt.user'
и 'auth.providers.users.model'
с помощью метода Config::get()
и вернул его. Оно было изменено на 'App\Admin'
).
Нужно сказать, что мои коды максимально просты в соответствии ск документации пакета.Вот мой UserController
код:
class UserController extends Controller
{
public function login(Request $request)
{
$validator = Validator::make($request->all(), [
'email' => 'required|string|email|max:255',
'password' => 'required|min:6'
]);
if ($validator->fails()) {
return response()->json($validator->errors());
}
$credentials = $request->only('email', 'password');
try {
if (!$token = JWTAuth::attempt($credentials)) {
return response()->json(['error' => 'invalid_credentials'], 401);
}
} catch (JWTException $e) {
return response()->json(['error' => 'could_not_create_token'], 500);
}
$user = User::where('email', $request->email)->first();
return response()->json([
'user' => $user,
'token' => $token
]);
}
public function register(Request $request)
{
$validator = Validator::make($request->all(), [
'email' => 'required|string|email|max:255|unique:users',
'phone' => 'required|valid_phone|unique:users',
'password' => 'required|min:6',
'first_name' => 'required',
'last_name' => 'required',
]);
if ($validator->fails()) {
return response()->json($validator->errors());
}
User::create([
'phone' => $request->get('phone'),
'first_name' => $request->get('first_name'),
'last_name' => $request->get('last_name'),
'city_abbr' => $request->get('city_abbr'),
'email' => $request->get('email'),
'password' => bcrypt($request->get('password')),
]);
$user = User::first();
$token = JWTAuth::fromUser($user);
return response()->json([
'user' => $user,
'token' => $token
]);
}
}
И мой AdminController
:
class AdminController extends Controller
{
public function login(Request $request)
{
$validator = Validator::make($request->all(), [
'email' => 'required|string|email|max:255',
'password' => 'required|min:6'
]);
if ($validator->fails()) {
return response()->json($validator->errors());
}
$credentials = $request->only('email', 'password');
Config::set('jwt.user', Admin::class);
Config::set('auth.providers.users.model', Admin::class);
try {
if (!$token = JWTAuth::attempt($credentials)) {
return response()->json(['error' => 'invalid_credentials'], 401);
}
} catch (JWTException $e) {
return response()->json(['error' => 'could_not_create_token'], 500);
}
$admin = Admin::where('email', $request->email)->first();
return response()->json([
'admin' => $admin,
'token' => $token
]);
}
public function register(Request $request)
{
$validator = Validator::make($request->all(), [
'email' => 'required|string|email|max:255|unique:admins',
'phone' => 'required|valid_phone|unique:admins',
'password' => 'required|min:6',
'name' => 'required',
]);
if ($validator->fails()) {
return response()->json($validator->errors());
}
$admin = Admin::create([
'phone' => $request->get('phone'),
'name' => $request->get('name'),
'access' => $request->get('access'),
'email' => $request->get('email'),
'password' => bcrypt($request->get('password')),
]);
Config::set('jwt.user', Admin::class);
Config::set('auth.providers.users.model', Admin::class);
$token = JWTAuth::fromUser($admin);
return response()->json([
'admin' => $admin,
'token' => $token
]);
}
}
Я где-то не прав?Есть ли какое-нибудь решение для этого?
Обновление:
Чтобы быть уверенным в функциональности MongoDB, я тестирую все вышеописанные действия с реляционной базой данных, фактически MySQL.Ничего не изменилось!
JWTAuth генерирует токен, но когда я запускаю метод toUser
с любыми моделями, кроме User
, он возвращает ноль!
Любое решение будет оценено.