【发布时间】:2018-11-16 14:12:30
【问题描述】:
我有三种类型的 Authenticatable 模型,我需要为每种模型进行单独的 JWT 身份验证。让我详细解释一下我的问题。
我使用 MongoDB 作为我的数据库,Laravel MongoDB 是我使用的包。
User、Admin 和 ServiceProvider 是我的模型。
为了在 Laravel 中进行 JWT 身份验证,我使用 jwt-auth 包。用户模型(集合)没问题。当我想将 JWT 与任何其他模型一起使用时它不起作用并再次使用 user 完成所有操作。
我搜索了很多,发现要更改提供者用户模型,我可以使用Config::set(); 方法,如下所示,
Config::set('jwt.user', Admin::class);
Config::set('auth.providers.users.model', Admin::class);
但对 JWT 身份验证没有影响。 (我用Config::get()方法检查了'jwt.user'和'auth.providers.users.model'的值并返回,已改为'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 生成令牌,但是当我使用除 User 之外的任何模型运行 toUser 方法时,它返回 null!
我们将不胜感激任何解决方案。
【问题讨论】:
-
你试过
$admin = Admin::create(...吗?恐怕Admin::first()返回正确的用户。 -
糟糕!这只是一个测试。我首先使用的正确代码是
$admin = Admin::creat...。我会编辑这个。感谢您的通知! @revo -
好吧,顺便说一句,因为我不确定
jwt,我鼓励您为Admin模型使用完全限定名称。请将这两行Config::set('jwt.user' , "App\Admin"); Config::set('auth.providers.users.model', \App\Admin::class);替换为旧的并重新检查。 -
旧的是什么意思? @revo
-
我的意思是 old 我的意思是 current。
标签: php mongodb laravel laravel-5 jwt