Laravel Passport 踩坑日记

以前的项目大多使用 DingoAPI + JWT-auth 实现的 API 认证,Laravel 虽然在很早就出了 Passport ,但一直没有怎么关注。
今天撸了一把 Passport ,虽然遇到不少坑,但是赶脚这个东西还是蛮好用的~


坑1:我暂时只想通过账号密码获取 token

Passport 一出生就自带了很多的路由。。 but,这些东东大部分对我是真的没用啊
解决方案:
在你的 AuthServiceProvider 里重新定义:

Passport::routes(function (RouteRegistrar $router) {
            $router->forAccessTokens();
        }, ['prefix' => 'api']);

坑2: 注册账号时,如何手动生成 Token ?

jwt-auth 的 JWTAuth::fromUser($user); 可以很简单的生成token,但是在 Passport 里似乎没有现成的方法。
解决方案:
注册完账号后,再一次主动请求 oauth/token

public function register(Request $request)
    {
        $validator = $this->validator($request->all());

        if ($validator->fails()){
            return response()->json($validator->errors());
        }

        event(new Registered($user = $this->create($request->all())));

        $client = \DB::table('oauth_clients')->where('password_client', 1)->first();

        $request->request->add([
            'username' => $user->email,
            'password' => $request->password,
            'grant_type' => 'password',
            'client_id' => $client->id,
            'client_secret' => $client->secret,
            'scope' => '*'
        ]);

        $proxy = Request::create(
            'oauth/token',
            'POST'
        );

        return Route::dispatch($proxy);
    }

执行,获得返回

{
  "token_type": "Bearer",
  "expires_in": 1296000,
  "access_token": "xxx",
  "refresh_token": "xxx"
}

完美解决。

坑3:我想要使用手机号登录

Passport 其实已经提供了动态修改用户登录的接口,只不过没有在文档里写出来
解决方案:
在你的 User Model 里增加如下方法

public function findForPassport($login) {
        return User::orWhere('email', $login)->orWhere('mobile', $login)->first();
    }

坑4: 当使用错误的 token 时, passport 总会跳转到 login 方法

查看源码发现 passport 用的是 web auth 中间件,难怪如此
在你的请求头里增加 Accept:application/json ,问题解决
例如:
file

暂时只遇到这几个坑,记录下,供大家参考

本作品采用《CC 协议》,转载必须注明作者和本文链接
本帖由系统于 6年前 自动加精
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 10

厉害了,我的一边

7年前 评论

授权后的用户信息怎么获取?要额外实现吗?

6年前 评论

手动生成Token只能通过这种方式吗? 感觉不太好。不知道哪位大神可以给出比较好的方案?

6年前 评论

@jacobsun guard不是默认的情况下,如何获得用户信息。auth()->guard('admin')->user(); 结果为null

6年前 评论

坑2: $user->createToken($mobile)->accessToken;
在 User Model 中 use HasApiTokens;

6年前 评论

你好,当使用错误的token时,会返回{ "message":"Unauthenticated." },这个返回的错误信息可以自定义吗?

6年前 评论

@Zccc 不行,但是可以通过捕获 Exception 的方法另类做到 链接

6年前 评论

@Zccc 这个问题解决了吗?

5年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!