小程序如何判斷用戶是哪個:
有Web開發經驗的都知道,客戶端用戶發起請求,服務器收到請求後,可以通過把用戶user_id記錄到session裏,然後下次通過session裏面的user_id來辨別是哪個用戶,然而小程序裏面對於沒有唯一的標識符,只有(暱稱,性別等),如果這些信息用戶一旦修改,服務器就沒法進行辨別了.
①:微信官方提供了一個接口wx.login,用於用戶獲取自己的code,用戶獲取code後將code發送到服務器
②:服務器然後通過微信官方接口,獲取用戶的唯一標識符openid和session_key,爲了安全性,服務器不要把openid直接暴露給用戶,可以自己隨機生成一個字符串,然後將這個字符串與這個用戶的openid session_key關聯起來,然後把這個隨機的字符串傳送給用戶,這個隨機生成的字符串就代替了openid(也叫做用戶態)
③:用戶獲取到用戶態後可以將其存儲到storage中,因爲小程序沒有cookie的功能,所以以後每次發起請求,可以把storage存儲的用戶態放到header中
④:小程序攜帶storage再次發起請求,服務器可以從header中獲取用戶態來辨別是哪個用戶了,然後就可以進行業務邏輯 數據返回了!
①:第一次進入此小程序的用戶:
onLogin: function () {
console.log('logining1')
this.getuserinfo
var that = this
wx.login({ //這裏請求wx.login接口獲取code
success(res) {
if (res.code) {
//發起網絡請求
wx.request({
url: 'http://127.0.0.1:8000/login', //將code傳給後端
data: {
code: res.code,
userInfo: app.globalData.userInfo.nickName
},
success: function (res) {
wx.setStorageSync('openid', res.data.user_uuid) //請求成功後,後端返回的唯一標識符(用戶態),存儲到Storage中
},
})
} else {
console.log('登錄失敗!' + res.errMsg)
}
}
})
},
②:服務器請求微信接口,獲取用戶的openid
#新用戶進入此視圖獲取session_key和openid,和用戶態,並將它們關聯
#老用戶 session_key過期的話會進入此視圖重新獲取session_key和新用戶態
def login(request):
code = request.GET['code']
req_result = requests.get('https://api.weixin.qq.com/sns/jscode2session?appid='+'你的小程序appid'+'&secret='+
'你的小程序secret_key'+'&js_code='+當前用戶的code+'&grant_type='+'authorization_code',
timeout=3, verify=False)
userdata = req_result.json()
user_uuid = str(uuid.uuid4()) # 隨機生成字符串user_uuid,自定義登錄態,暴露給給用戶的唯一標識
try:
user = User.objects.get(openid=userdata['openid'])
#如果已經存在的用戶user,只需要改變他的session_key即可
user.session_key = userdata['session_key']
#保存新的登錄態
user.user_uuid = user_uuid
user.save()
#第一次登錄,保存用戶的登錄信息,openid
except:
userinfo = request.GET.get('userInfo')
print(userinfo)
user = User(openid=userdata['openid'],
session_key=userdata['session_key'],user_uuid=user_uuid,username=userinfo)
user.save()
#將登錄態信息返回給微信用戶
res = {
'user_uuid':user_uuid
}
return JsonResponse(res)
③:小程序的session_key,以及下次如何帶着用戶態 請求服務器
這裏有個session_key還未解釋,session_key的作用:當用戶把自己的信息發送給服務器,這裏會通過微信接口的session_key進行信息加密,進一步保證用戶數據的安全性,session_key有時效,用戶長時間不登陸小程序,或者時間過長,session_key都會過期,過期就需要重新去微信官方接口申請新的session_key,並且服務器返回給用戶一個新的用戶態。
//用戶登陸
userLogin: function () {
var that = this; //這裏提前複製一份this爲that,因爲走到下面的函數後,this對象不在是當前的app
wx.checkSession({ //這裏的函數是微信接口用於判斷用戶的session_key是否過期
success: function () {
//存在登陸態
console.log('存在登錄態');
that.getuserinfo;//使用that
wx.navigateTo({
url: '../logs/logs',
})
},
fail: function () {
//不存在登陸態,去獲取登錄態
that.onLogin()
}
})
},
原文出處:https://www.cnblogs.com/szj666/p/11988495.html