先上张图:
如果到这就完了,此时的你心里是不是:
这张图是从微信开发文档上抄来的,接下来我们结合案例一步一步实现微信授权登陆的功能。
第一步:调用wx.login获取code
代码:
// 登录
wx.login({
success: res => {
// 发送 res.code 到后台换取 openId, sessionKey, unionId
console.log(res)
}
})
第二步:后台通过code获取openid、sessionKey、unionId,这里我们用node搭建一个简易后台
1、openId: 用户在当前小程序的唯一标识
2、sessionKey:具体啥作用我也不明白,先不管
3、unionId:用户在所有小程序、公众号、APP的唯一标识
代码:
const express = require('express')
const bodyParser = require('body-parser')
const jwt = require('jsonwebtoken')
const axios = require('axios')
// 创建服务
const app = express()
// 创建路由
const router = express.Router()
// 登录
router.post('/api/login', (request, reponse) => {
let wxCode = request.body.wxCode
// 向微信服务器请求获取openid
axios.request({
url: 'https://api.weixin.qq.com/sns/jscode2session',
method: 'get',
params: {
appid: '换成你的', //小程序 appId
secret: '换成你的', //小程序 appSecret
js_code: wxCode, //登录时获取的 code
grant_type: 'authorization_code' //授权类型,此处只需填写 authorization_code
}
}).then(res => {
// result就是我们拿到的session_key、openid、unionid
let result = res.data.data
reponse.send(result)
})
})
app.use(bodyParser.json())
app.use(router)
app.listen(3000, (err) => {
if(err) {
console.log(err)
}
console.log('服务启动在3000端口')
})
通过上一步我们已经拿到openid、session_key,我们可以使用一些加密工具按照自己的规则来生成token返给前端,这里我们使用jsonwebtoken;
1、’secret‘:加密规则
2、expiresIn: token有效期
代码:
// result就是我们拿到的session_key、openid、unionid
let result = res.data.data
// 生成token
let token = jwt.sign({ openid: result.openid, session_key: result.session_key}, 'secret', { expiresIn: 3600 * 24 * 7 })
reponse.send({
token
})
第三步:前端请求接口获取token
代码:
// 登录
wx.login({
success: res => {
// 发送 res.code 到后台换取 openId, sessionKey, unionId
wx.request({
url: 'http://localhost:3000/api/login',
method: 'POST',
data: {
wxCode: res.code
},
success: result => {
console.log(result)
}
})
}
})
拿到token后可以放在本地缓存,在随后的业务逻辑中携带token传给后台,后台来校验token的有效性和时效性;
这里提一下。我们常见的业务场景是打开一个小程序,进行相关操作提示微信授权,其实它这里的一个微信授权登陆是用来获取用户信息的,并不是登陆用的,这个也根据业务场景来决定。