小程序登錄邏輯思考
標(biāo)簽(空格分隔): 未分類
由于小程序不支持cookie
毒涧,如何才能記住狀態(tài)?
- 直接通過傳遞
openid
和session_key
奠旺,官方是不建議這么做的舌缤,存在安全隱患瓣距,官方建議加密openid
和session_key
生成一個類似token
的東西黔帕,前端緩存這貨,每次通過他來鑒別狀態(tài)蹈丸。 - 如何做成黄?
- 服務(wù)器獲取
openid
和session_key
,并簽名生成token
- 服務(wù)器將這個
token
緩存進(jìn)redis
如何緩存redis
redis相關(guān)交互token
過期刷新redis
-
token
發(fā)送給前端,每次帶著token
認(rèn)證
- 服務(wù)器獲取
- 關(guān)于
redis
- connect-redis Redis session store for Connect
- 遇到的一個愚蠢問題,redies連接后就會觸發(fā)
ready
逻杖,所以直接set
就好了
app.get('/test', function (req, res, next) { - client.on("ready",function(){ - console.log("ready成功") - }) + client.set('key', 'value') })
最后奋岁,關(guān)于整體邏輯,偽代碼
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)
// 存進(jìn)redis openid session_key
// 如果沒有帶token參數(shù),生成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中設(shè)置
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
})
}
// 驗(yàn)證登錄狀態(tài)
// 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("已經(jīng)登錄")
// }
// })
// })
});
}
//token為空第一次登錄荸百,將token存入
else{
console.log("未攜帶token")
let token=jwt.sign({
name: data.openid,
data: data
}, "secrect", {
expiresIn: 60 * 1000 *2
})
// 未執(zhí)行
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相關(guān)知識
jsonwebToken
JWTs實(shí)現(xiàn)細(xì)節(jié)
相關(guān)思考:如果截獲到tokens,也可以訪問闻伶,如何避免?