你是怎样在 Laravel 中使用 passport 作为 API 的用户身份验证的?

想问一下用passport来对api进行身份验证的话基本的流程是怎么样的呢?我的理解是前端把用户名和密码等登录需要的信息发个自定义的login路由,login路由再转发给/oauth/token来获取access token,不知道对不对。如果是这样的,那么多种方式的登录在哪一步实现比较好呢?

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 10

passport 我自己也在探究能不能使用一种更友好的方式来获取 token,至于多种方式登录的话你可以根据请求的字段来获取 passport 需要的字段,比如手机号登录,可以根据手机号来查询 email,没有就 false,再去请求 token

7年前 评论

@小恪守 比如在手机号加验证码登录的情况下,passport就无能为力了,因为passport必须去比对password,又没有办法根绝手机号拿到用户密码的明文,对吧。

7年前 评论

@小恪守 你现在也是用我上面说的,前端发给后端,后端再转发给/oauth/token的方式吗?

7年前 评论

@小恪守 有看过,还是没有办法解决没有密码的情况

7年前 评论

是的,不可否认的是在没有密码的情况下不应该使用 password 的认证方式,你可以试试 私人访问令牌,我自己没有尝试过,所以不太清楚。

7年前 评论

@小恪守 私人令牌的token好像是永久有效的

7年前 评论

@小恪守 我还没用过passport,感觉有点尴尬啊,

7年前 评论
# vendor\laravel\passport\src\Bridge\UserRepository.php

public function getUserEntityByUserCredentials($username, $password, $grantType, ClientEntityInterface $clientEntity)
    {
        if (is_null($model = config('auth.providers.users.model'))) {
            throw new RuntimeException('Unable to determine user model from configuration.');
        }

        if (method_exists($model, 'findForPassport')) {
            $user = (new $model)->findForPassport($username);
        } else {
            $user = (new $model)->where('email', $username)->first();
        }

        if (! $user ) {
            return;
        } elseif (method_exists($user, 'validateForPassportPasswordGrant')) {
            if (! $user->validateForPassportPasswordGrant($password)) {
                return;
            }
        } elseif (! $this->hasher->check($password, $user->password)) {
            return;
        }

        return new User($user->getAuthIdentifier());
    }

这个是 passport 中的一小段源码,可以看得到除了 findForPassport 来解决通过其他字段获取用户之外还有 validateForPassportPasswordGrant 来验证该用户的合法性,两个方法都可以在 User Model 中进行定义。

7年前 评论

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