前言:laravel passport 密码模式作为网站前后端分离后API验证登录的一种解决方案,本文主要记录这个过程中遇到的一些问题。

安装

laravel passport要求laravel版本大于等于5.3,因此必须把低于此要求的框架升级到5.3,具体做法可以参考上一篇博客。

升级完后,使用composer require laravel/passport=~1.0即可安装passport

按照官方文档指导,注册service provider、注册路由和引入HasApiToken等即可,在这里不再赘述。

遇到的问题

第一个问题:由于各种原因,用来对用户进行登录验证的字段和laravel默认往往不一样。这时候就要自定义登录的用户名和密码。

解决方案:

在用户模型里面添加一下两个方法,分别用来做用户名验证和密码验证:

/**
     * passport 验证用户名
     * @param $username
     * @return mixed
     */
    public function findForPassport($username) {
        return $this->where('FName', $username)->first();
    }

    /**
     * passport 验证密码
     * @param $password
     * @return bool
     */
    public function validateForPassportPasswordGrant($password)
    {
        return $this->FPwd == md5($password);
    }

第二个问题:跨域问题

解决方案:推荐直接使用barryvdh/laravel-cors扩展包

第三个问题:获取到access_token后,用来访问受保护的资源时,会自动跳转到首页

解决方案:这是由于从5.2升级到5.3后,没有更新.htaccess文件所致,将一下两行内容添加到末尾即可:

    # Handle Authorization Header
    RewriteCond %{HTTP:Authorization} ^(.*)
    RewriteRule .* - [e=HTTP_AUTHORIZATION:%1]
    

第四个问题:laravel只能验证session登录或passport登录,不能自动识别两种不同的请求

解决方案:
首先,要确保config/auth.php文件配置正确(因为从5.1升级而来的系统会发生了非常大的变化),这个文件里面default.guards的值会影响到laravel默认的验证方式。
这个问题也是由于升级框架后的历史遗留问题,需要将auth更改为:

//'auth' => \App\Http\Middleware\Authenticate::class,

'auth' => \Illuminate\Auth\Middleware\Authenticate::class,`


参考网站:


Laravel Passport

登陆发表评论