小程序登录逻辑思考
标签(空格分隔): 未分类
由于小程序不支持cookie
,如何才能记住状态?
- 直接通过传递
openid
和session_key
,官方是不建议这么做的,存在安全隐患,官方建议加密openid
和session_key
生成一个类似token
的东西,前端缓存这货,每次通过他来鉴别状态。 - 如何做?
- 服务器获取
openid
和session_key
,并签名生成token
- 服务器将这个
token
缓存进redis
如何缓存redis
redis相关交互token
过期刷新redis
-
token
发送给前端,每次带着token
认证
- 服务器获取
- 关于
redis
- connect-redis Redis session store for Connect
- 遇到的一个愚蠢问题,redies连接后就会触发
ready
,所以直接set
就好了
app.get('/test', function (req, res, next) { - client.on("ready",function(){ - console.log("ready成功") - }) + client.set('key', 'value') })
最后,关于整体逻辑,伪代码
if(token){
if(verify(token)){
success
}
else{ //token过期
setToken
saveReadis(Token)
res.send(Tokken)
}
}
else{
setToken
saveRedies(Token)
res.send(Token)
}
整体代码
app.get('/onLogin',function(req,res,next){
console.log("onLogin 接口访问成功")
// console.log("req code",req)
let JSCODE=req.query.code
let hasToken=req.query.token
let wechatUrl="https://api.weixin.qq.com/sns/jscode2session?appid="+appid+"&secret="+secret+"&js_code="+JSCODE+"&grant_type=authorization_code"
let grant_type='authorization_code'
// console.log(JSCODE)
request(wechatUrl,(err,response,body)=>{
// console.log(response)
let data=JSON.parse(body)
console.log(data)
res.set({
"Access-Control-Allow-Origin": "*"
,"Access-Control-Allow-Methods": "POST,GET"
,"Access-Control-Allow-Credentials": "true"
});
// res.json(data)
// 存进redis openid session_key
// 如果没有带token参数,生成token
//
// console.log("hasToken",hasToken)
if(hasToken){
console.log("hasToken",hasToken)
jwt.verify(hasToken, 'secrect', function(err, decoded) {
console.log("decoded",decoded) // bar
if(err){
// 过期
console.log("token过期")
let token=jwt.sign({
name: data.openid,
data: data
}, "secrect", {
expiresIn: 60 * 1000 *2
})
// 重新再redis中设置
client.set(data.openid,token,function(err,replies){
if(err){
throw(err)
}
else{
console.log("replies",replies)
res.json({
token:token,
session:data.session_key
})
}
})
}
else{
console.log("查找成功")
res.json({
token:hasToken,
session:data.session_key
})
}
// 验证登录状态
// let id=decoded.openid
// client.on("connect",function(){
// client.get("id",function(err,value){
// // token过期或者其他问题
// if(err){
// // throw(err)
// let token=jwt.sign({
// name:data.openid,
// data:data
// })
// client.set("openid")
// }
// else{
// console.log("已经登录")
// }
// })
// })
});
}
//token为空第一次登录,将token存入
else{
console.log("未携带token")
let token=jwt.sign({
name: data.openid,
data: data
}, "secrect", {
expiresIn: 60 * 1000 *2
})
// 未执行
client.set(data.openid,token,function(err,replies){
if(err){
throw(err)
}
else{
console.log("replies",replies)
res.json({
token:token,
session:data.session_key
})
}
})
// client.on("connect",function(){
// console.log("connect success")
// client.set("test",token,redis.print)
// res.json({
// token:token
// })
// })
}
// res.json({
// result: 'ok',
// token: token
// })
})
})
参考资料
token相关知识
jsonwebToken
JWTs实现细节
相关思考:如果截获到tokens,也可以访问,如何避免?