使用JWT在Laravel中获取经过身份验证的用户时出错

时间:2017-11-06 06:52:11

标签: php laravel authentication jwt

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

  

" SQLSTATE [42S22]:未找到列:1054未知列''在'哪里   条款' (SQL:select * from user where`` = 12 limit 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');
// });
});

我在postman中测试它 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-&gt; auth-&gt; byId($ id)),我会得到与以前相同的错误。

1 个答案:

答案 0 :(得分:0)

尝试此操作来检索用户:

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

取自文档,Retreiving the Authenticated user from a token

修改 可能没有什么区别,只是再次看你的模型,我会说它需要

class Users extends Authenticatable implements JWTSubject

而不是

class Users extends Model implements JWTSubject,Authenticatable