看过我之前写过的博客的应该知道我一直是 laravel-mix 的死忠粉,有好几篇文章都是关于它的。每每提到 laravel-mix 时更是不吝溢美之词。然而就在大概一个月前,我却决定不再使用它,而转
顺晟科技
2021-06-16 10:40:14
653
扫描代码登录已经成为一种越来越流行的登录方式,安全性高。同时,也让我们从大量记忆账户密码、手工输入的繁琐过程中解脱出来。有些平台甚至不用账号就可以扫描代码登录,省去注册的麻烦。
对于访问微信开放平台的微信官方账号应用来说,实现扫码登录还是挺容易的。在easy微信SDK的加持下,按下公文即可快速完成。不过,本文要讨论的是另一种情况。有时候因为某些原因,你的微信官方账号无法访问开放平台,但你想扫描微信代码登录。在这种情况下,你不能改变官方的套路。但只要我们做一些改变,就能实现这个需求。
#基本想法:
登录页面显示微信二维码(easy微信SDK创建,短命临时二维码)
用户扫码后将消息推送至服务器界面,界面根据业务情况进行判断处理,符合条件时触发微信可登录事件
微信可以登录事件实现了ShouldBroadcast接口,所以当它被触发时,也会广播到指定的频道
前端laravel-echo监控并处理通道中用户扫描码登录的消息
下面介绍具体实现,先展示渲染。
屏幕上显示程序运行的图片
#具体实施
有了这篇文章,我创建了一个简单的示例项目,可以和源代码一起克隆,效果更好。项目地址:https://github.com/tianyong90/laravel-qrcode-login
当然,件事是创建Laravel项目,同时安装前端和后端的依赖项
前端主要依靠laravel-echo和socket.io-client
事件广播的前端监控是关键,我们需要一个websocket服务器。Laravel官方文档在介绍消息广播时提到了Pusher和laravel-echo-server。因为我用laradock作为开发环境,它内置了laravel-echo-server容器,非常方便,所以我决定直接使用。其实也可以使用Pusher服务,所以需要安装pusher.js而不是socket.io-client,在中修改相关配置。同时env
配置项目
主要是配置数据库和redis连接,然后将BROADCAST_DRIVER设置为redis(这个很重要,如果使用pusher,需要修改为pusher)
如果QUEUE_CONNECTION设置为redis,请记住启动queue worker。
要启动语音应答服务器
因为使用了laradock,所以启动时只需要带laravel-echo-server参数,输入laradock目录
docker-compose up-d nginx PHP-worker nginx MySQL redis laravel-echo-server
创建微信登录事件
php artisan make:event微信登录
类微信可以登录实现ShouldBroadcast
{
使用可分派的、交互的套接字、序列化模型;
public $ token
/**
*创建新的事件实例。
*
* @ param $标记
*/
public function _ _ construct($ token)
{
$ this-token=$ token;
}
/**
*获取该活动应该播放的频道。
*
* @返回\照明\广播\频道|阵列
*/
公共函数broadcastOn()
{
返回新频道(“扫描-登录”);
}
}
最重要的是,事件应该实现ShouldBroadcast接口,并在broadcastOn方法中指定要广播的频道。微信可登录的公共属性令牌自动包含在广播数据中。
对接微信消息服务器
laravel-微信的配置和对接请阅读易微信SDK官方文档。
接收扫码消息并进行相关处理。
公共功能服务()
{
$app=app('微信. official _ account ');
$app-server-push(函数($message) {
if($ message[' Event ']==' SCAN '){
$ OpenID=$ message[' FromUserName '];
$ user=user : where(' open id ',$ open id)-first();
if ($user) {
//TODO:根据这里的情况添加其他认证逻辑
//使用laravel-passport的个人访问令牌
$ token=$ user-create token($ user-name)-access token;
//广播扫描码登录消息进行前端处理
事件(新微信登录($ token));
\Log:info('哈哈登录');
返回“登录成功!”;
}
返回“失败的鸟”;
} else {
//TODO:当用户不存在时,可以直接返回登录失败,也可以新建一个用户,登录该用户返回。
返回“登录失败”;
}
},\easy微信\内核\消息\消息: event);
return $ app-server-serve();
}
用easy微信创建一个临时二维码,显示在页面上。
公共函数索引()
{
$微信=app('微信. official _ account ');
$ result=$微信-二维码-临时(' foo ',600);
$ qrcodeUrl=$微信-QRcode-URL($ result[' ticket ']);
返回视图(' index ',compact(' QRcodeURl '));
}
img src={{ qrcodeUrl }} /
前端使用laravel-echo订阅对应的微信扫码登录事件,并接收其中的令牌,存储在本地存储器中,作为判断是否登录的凭证。同时,这个令牌也将作为访问后端api的授权基础。请注意,在前面的代码中,laravel-passport用于生成此个人访问令牌。如果不理解这个原理,可以参考Laravel官方文件。
从“laravel-echo”导入Echo
从“socket.io-client”导入io
window.io=io
让回声实例=新回声({
broadcaster: 'socket.io ',
host : window . location . hostname ' :6001 ',
})
echo instance . channel(' scan-log in ')。倾听('微信可登录',e={
localStorage.setItem('my_token ',this.token)
//其他处理
})
#摘要
此时,简单的扫描代码登录完成。当然,本文的示例代码并不优雅,流程可能不完善,主要是提供一个大概的思路。有了这个思路,我们就可以实现其他功能,如扫码登录、扫码投票等。取决于每个人的创造力。
16
2021-06
16
2021-06
16
2021-06
16
2021-06