之前鼓捣过一段时间小程序,准备用node和mongodb做小程序的后台,漫漫采坑路,今天开始第一步,先从小程序登录开始踩,如有不足之处,望指点。
小程序端
- 小程序端的逻辑比较简单
1 . 从缓存中读取token,如果有则说明用户已经登陆过小程序了
2 . 如果没有token,则说明用户第一次登录,拿到用户的code,在服务端获取openid,同时生成token,返回前端,保存到本地
App({
onLaunch: function () {
//调用api从本地缓存中获取token
var token = wx.getStorageSync('token') || '';
console.info('从本地缓存中获取token数据')
if(token == null || token == ''){
var that = this;
console.info('token is null');
that.login();
}else{
console.info('token is not null');
}
},
//登录接口,登陆成功后设置全局用户信息
login:function(){
//获取授权码code
wx.login({
success: function (res) {
console.info('授权码code')
var code = res.code;
console.info(code);
if (code) {
//获取用户信息接口
wx.getUserInfo({
success: function (res) {
var userInfo = res.userInfo;
var nickName = userInfo.nickName;
var avatarUrl = userInfo.avatarUrl;
//调用后端登录接口
wx.request({
url: 'http://127.0.0.1:3000/login',
data: {
nickName: nickName,
avatarUrl: avatarUrl,
code:code
},
success:function(res){
console.info(res.data);
wx.setStorageSync('token', res.data.usertoken)
},
fail:function(res){
console.info('获取token失败');
console.info(res);
}
})
}
})
} else {
console.info('获取用户登录凭证失败');
}
}
})
},
globalData: {
userInfo: null
}
})
服务端
目录结构
- 项目目录简单说明
-
db
数据库目录,使用的是mongodb
数据库 -
models
数据库模型 -
schemas
定义mongodb
的数据结构 -
routes
路由文件-
mongodb_connect.js
定义所有与数据库操作相关的类 -
login.js
小程序登录的api
-
-
mongodb_connect.js
login
函数传入三个参数, nickName
(微信昵称),avatarUrl
(头像),code
(code凭证)
class Database {
constructor() {
}
//获取用户登录信息
login(res, nickName, avatarUrl, code) {
//生成token
function createToken() {
const chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
const length = chars.length;
let str = "";
for (let i = 0; i < length; i++) {
str += chars.substr(Math.round(Math.random() * length), 1);
}
return str;
};
request.get({
url: 'https://api.weixin.qq.com/sns/jscode2session',
json: true,
qs: {
grant_type: 'authorization_code',
appid: '开发者的APPID',
secret: '开发者的APPSECRET',
js_code: code
}
}, function (err, response, data) {
var openid = data.openid;
User.findOne({
openid: openid
}, function (err, result) {
if (result) {
res.send({
usertoken: result.token
})
} else {
var user = new User({
openid:openid,
nickName: nickName,
avatarUrl: avatarUrl,
creatAt: moment().format('YYYY-MM-DD HH:mm:ss'),
token:createToken()
}).save(function (err, result) {
res.send({
usertoken: result.token
})
});
}
})
})
}
}
-
login.js
- 小程序端访问接口
http://127.0.0.1:3000/login
,请求方式为GET
,服务端接收nickName
、avatarUrl
、code
- 小程序端访问接口
router.get('/',function(req,res,next){
var nickName = req.query.nickName;
var avatarUrl = req.query.avatarUrl;
var code = req.query.code
new Database().login(res,nickName,avatarUrl,code);
})
至此,小程序登录接口完成
tips
- 对于
token
的生成,我暂时定义了一个函数createToken
函数
function createToken() {
const chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
const length = chars.length;
let str = "";
for (let i = 0; i < length; i++) {
str += chars.substr(Math.round(Math.random() * length), 1);
}
return str;
};
- 之后可能会把
openid
进行MD5加密,将加密后的值作为token存进数据库。
第一次写简书,不足之处,忘见谅