Laravel 5.5 与 Passport 4.0.0 的 一个坑

有一天提了一个问题, Passport JavaScript 消耗你的 API, 验证不通过?

我的环境是:

laravel 5.5
passport 4.0.x -dev
php 7.2

那一天,我想在 web 端调用 我在 api.php 写的接口,这样我就不用写两遍了。(懒是第一生产力。)事实证明是可以的,用户信息可以通过 cookie 下的 laravel_token 得到的。

重点是 这里有个 bug ,我当时不知道。

1.passport 4.0.0 需要换成 passport 4.0.x -dev

也就是 composer.json 中

"laravel/passport": "4.0.x-dev",

这告诉了我先看所用 github 中 package 版本 issue 有多重要。

下面的外国友人说了一句很风趣的话。

laravel 5.5 是 LTS ,但是 passport 4.0 不是 。

2. 根据提示还需要在 AuthServiceProviders 引入 两行代码,

use Laravel\Passport\Passport;
Passport::withoutCookieSerialization();

3. 问题产生原因:

vendor/laravel/passport/src/Guards/TokenGuard.php#

decodeJwtTokenCookie() 

发现 protected encrypter

vendor/laravel/framework/src/Illuminate/Contracts/Encryption/Encrypter.php#

<?php

namespace Illuminate\Contracts\Encryption;

interface Encrypter
{
    /**
     * Encrypt the given value.
     *
     * @param  string  $value
     * @param  bool  $serialize
     * @return string
     */
    public function encrypt($value, $serialize = true);

    /**
     * Decrypt the given value.
     *
     * @param  string  $payload
     * @param  bool  $unserialize
     * @return string
     */
    public function decrypt($payload, $unserialize = true);
}

这里错误

$unserialize = true

在 postman 中测试 ,可以正确得到用户信息。

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。