繁体   English   中英

Laravel JWT Auth 在登录时获取用户

[英]Laravel JWT Auth get user on Login

https://github.com/tymondesigns/jwt-auth是否可以获取current user 因为现在我只能生成一个令牌(当用户登录时)。

public function login(Request $request)
{
    $credentials = $request->only('email', 'password');

    try {
        if (! $token = JWTAuth::attempt($credentials)) {
            return response()->json(['error' => 'invalid_credentials'], 401);
        }
    } catch (Tymon\JWTAuth\Exceptions\JWTException $e) {
        return response()->json(['error' => 'could_not_create_token'], 500);
    }

    return response()->json(compact('token'));
}

你不需要Auth::user();

您可以使用toUser的方法JWTAuth 只需将令牌作为参数传递,您将获得用户信息:

$user = JWTAuth::toUser($token);

return response()->json(compact('token', 'user'));

有关更多信息,这是 toUser 方法:

/**
 * Find a user using the user identifier in the subject claim.
 *
 * @param bool|string $token
 *
 * @return mixed
 */

public function toUser($token = false)
{
    $payload = $this->getPayload($token);

    if (! $user = $this->user->getBy($this->identifier, $payload['sub'])) {
        return false;
    }

    return $user;
}

您可以获得记录的用户数据。

$credentials = $request->only('code', 'password', 'mobile');
try {
    // verify the credentials and create a token for the user
    if (! $token = JWTAuth::attempt($credentials)) {
        return response()->json(['error' => 'invalid_credentials'], 401);
    }
} catch (JWTException $e) {
    // something went wrong
    return response()->json(['error' => 'could_not_create_token'], 500);
}

$currentUser = Auth::user();
print_r($currentUser);exit;

您还可以使用JWTAuth::user()方法。

user()方法调用在toUser()方法中返回,该方法本身是authenticate()方法的别名,该方法通过令牌对用户进行身份验证。 如果用户已经通过身份验证,则无需再次对其进行身份验证( toUser() ),而是可以使用user()方法来获取经过身份验证的用户。

// $token = JWTAuth::attempt($credentials) was successful...

$user = JWTAuth::user();

return response()->json(compact('token', 'user'));

它对我来说很好用(laravel 5.7)你必须将令牌发布给我的功能,并将返回用户使用 Tymon\\JWTAuth\\Facades\\JWTAuth;

public function me(Request $request)
{
    $user = JWTAuth::user();
    if (count((array)$user) > 0) {
        return response()->json(['status' => 'success', 'user' => $user]);
    } else {
        return response()->json(['status' => 'fail'], 401);
    }
}

只需要在指定的路由中间件里面返回你定义的路由 api 路由

Route::group(['middleware' => 'jwt.auth'], function () {
    Route::post('/user', function (Request $request) {
        try {
            $user = \Illuminate\Support\Facades\Auth::user();
            return $user;
        } catch (\Tymon\JWTAuth\Exceptions\UserNotDefinedException $e) {
            return '$user';
        }
    });
});

试试这个(它适用于 laravel 5.6,5.7):

use Tymon\JWTAuth\Facades\JWTAuth;
use Tymon\JWTAuth\Exceptions\JWTException;

// code to generate token for user with email testuser@gmail.com
$user=User::where('email','=','testuser@gmail.com')->first();

if (!$userToken=JWTAuth::fromUser($user)) {
   return response()->json(['error' => 'invalid_credentials'], 401);
}

return response()->json(compact('userToken'));

您可以使用以下方法获取与令牌相关的当前用户:

$user = JWTAuth::setToken($token)->toUser();

在 Laravel 7.2 中,如果上述方法均无效,则使用这样的方法来检索用户:

$credentials = request(['email', 'password']);

if (! $token = auth('api')->attempt($credentials)) {
        return response()->json(['error' => 'Unauthorized'], 401);
}  
    
$user = auth('api')->user();
    
dd($user);

解决方案谁都在努力验证用户和令牌然后保护

我面临的问题

即使我放置了当前令牌,Jwt 也不会返回任何用户

返回空值

 $user = JWTAuth::user(); //getting null

返回假

 $user = JWTAuth::parseToken()->authenticate();

返回假

auth()->user()

在转到解决方案中间件之前要检查的解决方案和您的路由保护很重要,所以请记住

保护设置 config/auth.php

'guards' => [
    'website_admin' => [
        'driver' => 'jwt',
        'provider' => 'website_admin',
    ],
  ]

提供者

'providers' => [
      'super_admin' => [
            'driver' => 'eloquent',
            'model' => App\Website_super_admin_auth::class,
        ],
]

中间件(必须)

<?php

namespace App\Http\Middleware;

use Closure;
use JWTAuth;
use Exception;
use Tymon\JWTAuth\Http\Middleware\BaseMiddleware;

class JwtMiddleware extends BaseMiddleware
{

    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        try {
            $user = JWTAuth::parseToken()->authenticate();
        
        } catch (Exception $e) {
            if ($e instanceof \Tymon\JWTAuth\Exceptions\TokenInvalidException){
                return response()->json(['status' => 'Token is Invalid']);
            }else if ($e instanceof \Tymon\JWTAuth\Exceptions\TokenExpiredException){
                return response()->json(['status' => 'Token is Expired']);
            }else{
                return response()->json(['status' => 'Authorization Token not found']);
            }
        }
        return $next($request);
    }
}

路由(应指定带守卫的中间件)

Route::group(['prefix' => 'super_ad',  'middleware' => ['jwt.verify','auth:super_admin']], function()
{
 Route::get('/test', function (){
    // $user = JWTAuth::parseToken()->authenticate(); <-------check user here
 
    $user=auth()->user();
      // return $user;
});
})
$user = JWTAuth::setToken($token)->toUser();

Auth::login($user, $remember = true);
  public function user(Request $request){ 
    /// get user details from token
     $user = JWTAuth::toUser($this->bearerToken($request));
   // get payloads in the token
   $payload = JWTAuth::getPayload($this->bearerToken($request));
   }


public function bearerToken($request)
{
   $header = $request->header('Authorization', '');
   if (Str::startsWith($header, 'Bearer ')) {
            return Str::substr($header, 7);
   }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM