Laravel Passport & 微信小程序的登录认证

安装和配置Laravel Passport

安装 Laravel Passport,可以参考 Laravel 文档 https://learnku.com/docs/laravel/6.x/passport/5152,执行命令生产生成访问令牌的「个人访问」客户端

php artisan passport:install

Passport 有几种认证模式,而个人访问令牌更适合微信小程序的应用场景

假设已经安装好了Passport,然后打开 app/Providers/AuthServiceProvider.php,在boot方法中添加

//Passport 个人访问令牌默认有效期30天
Passport::personalAccessTokensExpireIn(Carbon::now()->addDays(30));

在用户模型里引用,例如我的模型叫 Wxuser,可以参考文档说明

use Laravel\Passport\HasApiTokens;
use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;

class Wechat extends Authenticatable 
{
    use HasApiTokens, Notifiable;
}

修改config\auth.php 中相应的配置, 可以参考文档说明

'guards' => [
    'api' => [
        'driver' => 'passport',
        'provider' => 'wxusers', //修改users=>wxusers
        //'hash' => false,
    ],
],

Laravel 默认配置只支持一个 provider,当多用户模型认证时,我们可以在控制器的构造函数中来动态修改

//修改api供应商provider
Config::set('auth.guards.api.provider', 'wxusers');

api.php 中使用auth:api中间件即可将路由保护起来

Route::group(['middleware' => 'auth:api'] , function () {
    ...
});

基本的 Laravel Passport 安装和配置就已经完成了,现在可以开始使用了

Passport 个人访问令牌的使用

新建一个对应微信小程序 WxuserController 控制器,并设置好路由

Route::post('wxuser/login', 'Weapp\WxuserController@login')->name('weapp.wxuser.login');

login 方法中生成 accessToken 返回给小程序

public function login(Request $request)
{
    $input = Xss::xss_clean($request->input());

    if (empty($input['code'])) {
        return $this->apiJsonError('code参数缺失');
    }

    //通过code获取小程序authSession 
    $authSession = $this->authSession($input['code']);
    $wxuser = $this->model->where('openid', $authSession['openid'])->first();

    //根据openid生成唯一token
    $createToken = $wxuser->createToken($authSession['openid']);
    $accessToken = $createToken->accessToken;

    $data = ['token_type' => "Bearer", 'access_token' => $createToken->accessToken, 'expires_at' => $createToken->token->expires_at];
   
    return $this->apiJsonSucc($data);
}

微信小程序登录

通过 wx.login 来换取第三方的 access_token 并保存到本地

login: function() {
    const that = this;
    wx.login({
        success: res => {
            // 发送 res.code 到后台换取 openId, sessionKey, unionId
            app.wxRequest({
                url: '/wxuser/login',
                method: 'post',
                data: {
                    code: res.code
                },
                succ: function(res) {
                    const data = res.data; 
                    if (data.data) {
                        wx.setStorageSync('access_token', data.data.access_token)
                    }
                }
            })
        }
    })
},

这里我们可以在 app.js 中封装基础的 wxRequest 请求函数,把从后台获取的 access_token 添加到 header

wxRequest: function(obj, accessToken) {
    const that = this;
    const url = this.globalData.url;
    const header = {
        'Authorization': 'Bearer ' + (accessToken || wx.getStorageSync('access_token')),
        'Accept': 'application/json'
    };

    //加载中
    wx.showLoading()

    obj.url = url + obj.url;

    wx.request(Object.assign(obj, {
        header: Object.assign(header, obj.header ? obj.header : {}),
        success: function(res) {
            typeof(obj.succ) == 'function' && obj.succ(res);

            if (res.data && res.data.status != 0) {
                that.showToast(res.data.msg);
            } 
        },
        complete: function(res) {
            wx.hideLoading();
        }
    }));
},

好了,以上就是 Laravel Passport & 微信小程序登录认证的基本流程。

发表评论

电子邮件地址不会被公开。 必填项已用*标注