Laravel JWT Auth让用户登录

时间:2016-10-05 08:37:29

标签: php laravel-5 jwt

是否可以使用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'));
}

10 个答案:

答案 0 :(得分:14)

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

$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;

答案 1 :(得分:14)

您不需要Auth::user();

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

JWTAuth

有关详细信息,请使用toUser方法:

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

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

答案 2 :(得分:3)

您还可以使用| | 101 | 132 | 160 | 165 | 200 | 285 | 334 | 1123 | 1601 | 1617 | 1991 | 7075 | |---|-----|-----|-----|-----|-----|-----|-----|------|------|------|------|------| | a | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | | b | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | | c | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 方法。

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

user()

答案 3 :(得分:1)

只需要返回指定的路由中间件内部 您定义的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';
        }
    });
});

答案 4 :(得分:1)

对我来说很好(laravel 5.7) 您必须将令牌发布给我函数并返回用户     使用Tymon \ JWTAuth \ Facades \ JWTAuth;

elapsed time2000061
elapsed timeelapsed time2000103
elapsed timeelapsed time20000222000061
elapsed time2000050
2000072
elapsed time2000061
elapsed time200012

答案 5 :(得分:0)

尝试一下(与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'));

答案 6 :(得分:0)

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

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

答案 7 :(得分:0)

在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);

答案 8 :(得分:0)

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

我面临的问题

即使我放置了当前令牌,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(应该指定带有guard的中间件)

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;
});
})

答案 9 :(得分:-1)

  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);
   }
}
相关问题