繁体   English   中英

使用JWT在Laravel中获得身份验证用户时出错

[英]Error while getting authenticated user in Laravel using JWT

我能够在laravel中使用JWT登录并获取用户令牌,但是在尝试通过传递该令牌来获取经过身份验证的用户(getAuthUser)时,出现以下错误:

“ SQLSTATE [42S22]:找不到列:'where子句'中的1054未知列”(SQL:从user中选择*,其中“ = 12限制1)”

AuthenticationController:

<?php
namespace Modules\Authentication\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;

use Illuminate\Support\Facades\Auth;
use App\Http\Requests;
use JWTAuth;
use JWTAuthException;

use Modules\Settings\Entities\Users;
use Modules\Authentication\Http\Requests\Authentication;
class AuthenticationController extends Controller
{

public function __construct()
{
    // $this->user = new Users;
     $this->guard = \Auth::guard('api');
}

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

    try {
        // verify the credentials and create a token for the user
        $token = JWTAuth::attempt($credentials);


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

    // if no errors are encountered we can return a JWT
    return response()->json(compact('token'));
}

public function getAuthUser(Request $request){

    $user = JWTAuth::user($request->token);  
    // dd($user);      
    return response()->json(['result' => $user]);
}
}

用户模型:

namespace Modules\Settings\Entities;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Contracts\Auth\Authenticatable;

use Tymon\JWTAuth\Contracts\JWTSubject;

class Users extends Model implements JWTSubject,Authenticatable{

Protected $table="user";
// protected $primaryKey = 'id';
protected $fillable = ['id','username','password','user_status_type_id','client_id','created_userid'];

protected $hidden = [
    'password', 'remember_token',
];

public function user_status(){

     return $this->belongsTo('Modules\Settings\Entities\UserStatusType','user_status_type_id');
}

public function user_client(){

    return $this->belongsTo('Modules\Settings\Entities\Client','client_id');

}


 public function role()
{
      return $this->belongsToMany('Modules\Settings\Entities\Role','user_role','user_id','role_type_id');
}

public function getAuthPassword() {
    return $this->password;
}


public function getJWTIdentifier()  {
    return $this->getKey(); 
}

public function getJWTCustomClaims()
{
return [];
}

public function getAuthIdentifierName(){}

public function getAuthIdentifier(){}

// public function getAuthPassword(){}
public function getRememberToken(){}
public function setRememberToken($value){}
public function getRememberTokenName(){}

}

路线:

Route::group(['middleware' => 'web', 'prefix' => 'api/v1/authentication', 'namespace' => 'Modules\Authentication\Http\Controllers'], function(){

Route::post('auth/login', 'AuthenticationController@login');
// Route::group(['middleware' => 'jwt.auth'], function () {
Route::get('user', 'AuthenticationController@getAuthUser');
// });
});

我正在通过GET在邮递员中对其进行测试:.... / api / v1 / authentication / user?token = {Token}

编辑:现在我在控制器中的getAuthUser方法如下所示:

 public function getAuthUser(Request $request){

    // $token = JWTAuth::getToken();
    // dd($token);


   $input = $request->all();
   JWTAuth::setToken($input['token']);
    // dd($input['token']);
    $user = JWTAuth::toUser($input['token']);  
    // dd($user);      
    return response()->json(['result' => $user]);
}

和在JWTAuth.php中

public function authenticate()
{
   // dd($this->getPayload()->get('sub'));
    $id = $this->getPayload()->get('sub');
    // dd($id);
    // dd($this->auth->byId($id));

    if (! $this->auth->byId($id)) {
        return false;
    }

    return $this->user();
}

在这里通过做dd($ id),id的值来了,但是如果我尝试做dd($ this-> auth-> byId($ id)),我会得到和以前一样的错误。

尝试使用此方法来检索用户:

public function getAuthUser()
{
    try {

        if (! $user = JWTAuth::parseToken()->authenticate()) {
            return response()->json(['user_not_found'], 404);
        }

    } catch (Tymon\JWTAuth\Exceptions\TokenExpiredException $e) {

        return response()->json(['token_expired'], $e->getStatusCode());

    } catch (Tymon\JWTAuth\Exceptions\TokenInvalidException $e) {

        return response()->json(['token_invalid'], $e->getStatusCode());

    } catch (Tymon\JWTAuth\Exceptions\JWTException $e) {

        return response()->json(['token_absent'], $e->getStatusCode());

    }

    // the token is valid and we have found the user via the sub claim
    return response()->json(['result' => $user]);
}

摘自文档, 从令牌中检索身份验证的用户

编辑:可能没有什么不同,但只是再次查看您的模型,我会说这需要

class Users extends Authenticatable implements JWTSubject

而不是

class Users extends Model implements JWTSubject,Authenticatable

暂无
暂无

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

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