将用户角色添加到jwt,laravel 5 jwt-auth

时间:2015-03-12 16:04:42

标签: php laravel jwt

我有一个laravel 5后端,在jwt-auth登录时发送一个jwt-token作为json响应。

现在我想将用户角色添加到laravel发送的jwt令牌中,我尝试了以下方式:

这是我当前的控制器

<?php 
namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use JWTAuth;
use Tymon\JWTAuth\Exceptions\JWTException;
use Illuminate\Database\Eloquent\Model;
use App\User;

class AuthenticateController extends Controller
{
    public function authenticate(Request $request)
    {
        // grab credentials from the request
        $credentials = $request->only('email', 'password');
        $user = User::where('email', '=', $credentials['email'])->first();
        $customClaims = ['role' => $user->role];

        try {
            // attempt to verify the credentials and create a token for the user
            if (! $token = JWTAuth::attempt($credentials, $customClaims)) {
                return response()->json(['error' => 'invalid_credentials'], 401);
            }
        } catch (JWTException $e) {
            // something went wrong whilst attempting to encode the token
            return response()->json(['error' => 'could_not_create_token'], 500);
        }
        // all good so return the token
        return response()->json(compact('token'));
    }
}
?>

有更简洁的方法吗?

4 个答案:

答案 0 :(得分:2)

您当前正在查询该用户两次,一次使用该电子邮件以获取该角色,另一次使用jwt::attempt()方法。我建议将查询减少到只有一个但执行身份验证{Auth ::尝试($ credientials)}然后 将检索到的用户与自定义声明一起传递到JWT::fromUser()方法。所以

JWT::fromUser($user,['role' => $user->role])

答案 1 :(得分:1)

奇怪的是,指定一些 $ customClaims 作为尝试()方法的第二个参数实际上对我有效。

但是,您是否尝试使用 JWTFactory Facade?它可以让你创建你想要的每种令牌。

您可以在此处获取更多信息:JWT-Auth Creating Tokens Page

作为installation guide suggests,请不要忘记在安装JWT-Auth时将其添加为Facade!

希望它有所帮助!

答案 2 :(得分:0)

目前稳定版的JWTAuth [0.5.9]似乎没有更清洁的方式。

查看以下问题#89 #108

正如作者在他的评论中所指出的那样,他的下一个版本将会对这个问题进行改进。你可以看看他的开发分支。

答案 3 :(得分:0)

JWT v1.0的文档引起混乱。
将此方法添加到用户模型中,以便在验证用户身份时可以添加自定义声明:

public function getJWTCustomClaims()
{

        return = [
            'type' => 'driver',
            'id' => $this->driver->id
        ];
}