1.获取参数,定义枚举,根据参数判断登录方式
const LoginType={
USER_MINI_PROCEDURE:1,
USER_NAME:2,
USER_MOBILE:3
}
router.post('/', async (ctx) => {
let token;
switch (ctx.request.body.type) {
//小程序登录
case LoginType.USER_MINI_PROCEDURE:
token =await WXManager.wxCodeToken(ctx.request.body.account)
break;
//账号密码登录
case USER_NAME:
break;
//手机号登录
case USER_MOBILE:
break;
default:
throw new global.errs.ParameterException('没有相应的处理函数')
}
ctx.body = {
token
}
})
2.小程序登录,获取参数请求微信接口返回openid,根据oepnid查询,如果不存在则新增数据,根据id,用户权限生成token
class WXManager {
static async wxCodeToken(code) {
const url = await util.format(global.config.wx.loginUrl, global.config.wx.appid, global.config.wx.appSecret, code)
const result = await axios.get(url)
const errcode = result.data.errcode
const errmsg = result.data.errmsg
if (errcode) {
throw new global.errs.AuthFailed('openid获取失败:' + errmsg)
}
let user = await User.getUserByOpenid(result.data.openid)
if (!user) {
user = await User.registerByOpenid(result.data.openid)
}
return generateToken(user.id, Auth.USER)
}
}
module.exports = WXManager
static async getUserByOpenid(openId){
const user=await User.findOne({
where:{
openId
}
})
return user
}
static async registerByOpenid(openId){
return await User.create({
openId
})
}