gpt4 book ai didi

php - 使用 Laravel 和 Mongodb 进行多 Jwt 身份验证

转载 作者:IT老高 更新时间:2023-10-28 12:31:13 26 4
gpt4 key购买 nike

我有三种类型的 Authenticatable 模型,我需要为每种模型进行单独的 JWT 身份验证。让我详细解释一下我的问题。

我使用 MongoDB 作为我的数据库和 Laravel MongoDB是我使用的包。

UserAdminServiceProvider 是我的模型。

要在 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 生成 token ,但是当我使用除 User 之外的任何模型运行 toUser 方法时,它返回 null!

我们将不胜感激任何解决方案。

最佳答案

这是您必须为我的项目添加 JWT 的多身份验证功能。

  1. tymon JWT auth包裹。在 JWTAuthServiceProvider 中,将 Tymon\JWTAuth\JWTAuthTymon\JWTAuth\Providers\User\UserInterface 定义类型从 singletonbootBindings 方法中的 bind

  2. 定义了一个新的中间件,下面的代码是它的handle方法:

    public function handle($request, Closure $next){
    if (!$request->header('Auth-Type')) {
    return response()->json([
    'success' => 0,
    'result' => 'auth type could not found!'
    ]);
    }
    switch ($request->header('Auth-Type')) {
    case 'user':
    $auth_class = 'App\User';
    break;

    case 'admin':
    $auth_class = 'App\Admin';
    break;

    case 'provider':
    $auth_class = 'App\ServiceProvider';
    break;

    default:
    $auth_class = 'App\User';

    }

    if (!Helpers::modifyJWTAuthUser($auth_class))
    return response()->json([
    'status' => 0,
    'error' => 'provider not found!'
    ]);

    return $next($request); }
  3. Helpers 中定义了一个名为 modifyJWTAuthUser 的函数,下面是它的内部:

    public static function modifyJWTAuthUser($user_class){
    if (!$user_class ||
    (
    $user_class != 'App\User' &&
    $user_class != 'App\Admin' &&
    $user_class != 'App\ServiceProvider'
    ))
    return false;

    try {
    Config::set('jwt.user', $user_class);
    Config::set('auth.providers.users.model', $user_class);

    app()->make('tymon.jwt.provider.user');
    return true;
    } catch (\Exception $e) {
    return false;
    } }
  4. Kernel.php 中引入了另一个 $routeMiddleware,如下所示:

    ...
    'modify.jwt.auth.user' => 改变JWTAuthUser::class,

  5. 最后一步,将 'modify.jwt.auth.user' 中间件添加到您想要的路由中。

但即使有了这些步骤,您一定遇到了新问题。这是关于通过登录凭据获取 auth token 并从 token 中获取 auth 用户。 (似乎更改配置值对 JWTAuth::attempt($credentials)$this->auth->authenticate($token) 没有影响)

解决从 token 获取授权用户的问题:

创建一个新的中间件 CustomGetUserFromToken,它扩展了 Tymon 的jwt.auth中间件,我的意思是GetUserFromToken,在第 35 行,和**替换**$user = $this->auth->authenticate($token);with$user = JWTAuth::toUser($token);`

并解决在登录问题中通过凭据获取 auth token :

首先,找到auth用户,然后通过Hash::check()方法检查用户是否存在并验证密码,如果这些条件返回true,则从用户那里生成一个 token .这是登录代码:

$admin = Admin::where('email', $request->email)->first();
if (!$admin || !Hash::check($request->get('password'), $admin->password)) {
return response()->json([
'success' => '0',
'error' => 'invalid_credentials'
], 401);
}

我不确定这种方式,但我认为在找到正确的方法之前它是正确的!

结论:

在 Laravel 中拥有多 JWT 身份验证功能可能还有很多其他方法可以做,但我确实喜欢这个并分享它以提供帮助。

我认为这个问题唯一重要的一点是 app()->make('tymon.jwt.provider.user');,在配置值更改后重新制作用户提供程序的能力。

任何其他解决方案将不胜感激。

关于php - 使用 Laravel 和 Mongodb 进行多 Jwt 身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50728067/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com