Laravel 5使用JWT创建自定义标记和解析

时间:2016-03-25 13:32:21

标签: php jwt laravel-5.2

我是laravel 5中JWT令牌系统的新手并使用tymon JWT Auth

我设法创建了我的自定义JWT令牌和我的代码,如下所示

use App\Http\Requests;
use App\Http\Controllers\Controller;

use Illuminate\Http\Request;
use Tymon\JWTAuth\JWTManager as JWT;
use JWTAuth;
use JWTFactory;

use Tymon\JWTAuth\Exceptions\JWTException;


public function login(Request $request)
    {

        $customClaims = ['foo' => 'bar', 'baz' => 'bob'];

        $payload = JWTFactory::make($customClaims);

        $token = JWTAuth::encode($payload);

        //  return response()->json(compact('token')); // This didnt work?Why?

        return response()->json(compact($token))->header('Authorization','Bearer '.$token);

    }

    public function getUser(){

        $token = JWTAuth::parseToken();

        echo $token;

    }

以下是我需要的以下说明

//  return response()->json(compact('token'));
  1. 为什么这给了我一个空的json对象{“token”:{}}

  2. 这是正确的方式,我可以在令牌中发送我的自定义数据并从同一令牌中获取foo和baz值吗?

  3. 使用postman测试时我的代码输出是一个空数组。作为[]。但我的标题添加了授权→Bearer eyJ0eXAiOiJKV1QiLCJhbG ... 它是否正确? Image

  4. 3A。而不是一个简单的空白数组,我需要一个成功的消息作为'授权':真。我怎样才能实现它?

    1. 我应该如何将此令牌传回测试。这个令牌应该在哪里使用邮递员传递。我通过标题传递了它,如图像enter image description here

    2. 所示
    3. 我如何使用laravel解析此令牌并获取自定义数据,即foo和baz作为令牌发送。我在这里调用的方法是getUser。

3 个答案:

答案 0 :(得分:1)

  1. 我不认为令牌创建正在正确构建。以下是登录令牌创建的工作代码。为此,请确保config / jwt.php下的“user”模型是适合您应用程序的正确用户模型。

    $user = array(
        'user' => $request->input('email'),
        'password' => $request->input('pass')
    );
    
    $customClaims= ['usr' => $user['user']];
    
    if(!$token = JWTAuth::attempt($user, $customClaims)){
        abort(401);
    }
    else{
        return response()->json(compact('token'));
    }
    
  2. 上面的代码中还包含自定义声明变量,您在正确的轨道上只需要作为尝试函数中的第二个参数传递。

  3. 只有客户端需要发送授权:Bearertoken标头以证明他们是他们所说的人(我来自android客户端/服务器jwt背景。很抱歉,如果这不适用于您的应用程序)

  4. 3A。对于用户浏览的任何后续页面,您只需添加一个像这样的if语句

          if(!$user = JWTAuth::parseToken()->authenticate()){
                abort(401);
        }
        else{
             // Code allowing the user to see protected content
        }
    
    1. 请参阅问题3的答案。包括带有授权BearerToken

    2. 的http标头
    3. 要从JWT Payload中提取数据,您需要在令牌中的第一个句点之后解码文本中的base64编码文本,并将其发送到字符串。然后通过base64_decode($ string)函数运行该字符串。那应该开始给你一些有效载荷数据。

    4. 希望这有帮助。

答案 1 :(得分:0)

我在这里遇到了同样的问题,我得到了以下解决方案:

public function whatEver()
{
    $token = JWTAuth::parseToken();
    $response = $token->getPayload()->get('foo');
    return $response
}

这应该返回bar

答案 2 :(得分:0)

您可以在用户模型中使用此方法:

/**
 * Return a key value array, containing any custom claims to be added to the JWT.
 *
 * @return array
 */
public function getJWTCustomClaims()
{
    return [
        'perms' => '

        '
    ];
}