我坚持了大约三天。基本上,我正在尝试使用Tymon在laravel中生成JWT令牌。这是我的控制器文件。
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Http\Requests;
use App\User;
use JWTAuth;
use JWT;
use Tymon\JWTAuthExceptions\JWTException;
use Tymon\JWTAuth\Contracts\JWTSubject as JWTSubject;
class AuthenticateController extends Controller
{
public function index()
{
//
}
public function authenticate(Request $request)
{
$user = User::where('email', $request->only('email'))->first();
dd($user); //This does show some output
$token = JWTAuth::fromUser($user); //returns error message
return ["error" => NULL, "token" => $token];
}
}
Run Code Online (Sandbox Code Playgroud)
我使用Chrome邮递员测试了此api,但报告此错误:
JWT.php第73行中的ErrorException:传递给Tymon \ JWTAuth \ JWT :: fromUser()的参数1必须是Tymon \ JWTAuth \ Contracts \ JWTSubject的实例,是给定的App \ User实例,在/ Users / shankerm / mccadmin中调用217行上的/laravel/vendor/laravel/framework/src/Illuminate/Support/Facades/Facade.php并已定义
请给我一些建议。我是Laravel的新手,为此苦苦挣扎了很长时间。谢谢。
小智 7
首先你需要在你的 User 模型上实现 Tymon\JWTAuth\Contracts\JWTSubject 合约,这需要你实现两个方法 getJWTIdentifier() 和 getJWTCustomClaims()。
下面是您的代码的外观示例。请进行任何必要的更改以满足您自己的需要。
<?php
namespace App;
use Tymon\JWTAuth\Contracts\JWTSubject;
use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;
class User extends Authenticatable implements JWTSubject
{
use Notifiable;
// Rest omitted for brevity
/**
* Get the identifier that will be stored in the subject claim of the JWT.
*
* @return mixed
*/
public function getJWTIdentifier()
{
return $this->getKey();
}
/**
* Return a key value array, containing any custom claims to be added to the JWT.
*
* @return array
*/
public function getJWTCustomClaims()
{
return [];
}
}
Run Code Online (Sandbox Code Playgroud)
配置身份验证保护
注意:这仅在您使用 Laravel 5.2 及更高版本时有效。
在 config/auth.php 文件中,您需要进行一些更改以配置 Laravel 以使用 jwt 防护来支持您的应用程序身份验证。
对文件进行以下更改:
'defaults' => [
'guard' => 'api',
'passwords' => 'users',
],
...
'guards' => [
'api' => [
'driver' => 'jwt',
'provider' => 'users',
],
],
Run Code Online (Sandbox Code Playgroud)
这里我们告诉 api 守卫使用 jwt 驱动程序,我们将 api 守卫设置为默认值。
您正在使用软件包的较新版本。这就要求User Model执行者履行该合同。通过在模型中执行以下操作来解决它:
use Tymon\JWTAuth\Contracts\JWTSubject;
class User extends Model implements JWTSubject {
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2693 次 |
| 最近记录: |