小程序是一个嵌入在微信中的轻应用,而微信是一个完整的APP,他们的入口不同,因此微信的登陆密码不可能共享到小程序中,小程序甚至无法获取微信的微信号。那小程序是怎样来登录的呢? 这就涉及到微信开放平台了。
很多网站支持QQ登录,微博登录,以及微信登录。 这种借账号体系的行为,我们早就讨论过,无需赘述。每个用微信的人,都一个微信号,在我们打开小程序时并没有这样一个登录操作,那么从微信中进入小程序,就需要一个什么号来标识这个小程序,这就是openID, 对于同一个小程序而言,不同用户的openID是不一致的。在微信的官方说明中,小程序通过调用wx.login()获取与用户对应的code(js_code), 然后把这code带给小程序后台,并回传到开发者服务器。于是乎小程序后台就拿到了区别于用户的code, 这实际上是微信给小程序的一个登录态标志。wx.login()获取用户code执行代码如下:
App({
onLaunch: function() {
wx.login({
success: function(res) {
if (res.code) {
//发起网络请求
wx.request({
url: \'https://test.com/onLogin\',
data: {
code: res.code
}
})
} else {
console.log(\'获取用户登录态失败!\' + res.errMsg)
}
}
});
}
})
但是code存在时效性,因此获取与微信号有一一对应关系的openID更为靠谱。调用接口获取登录凭证(code)进而换取用户登录态信息,包括用户的唯一标识(openid)及本次登录的会话密钥(session_key)等。用户数据的加解密通讯需要依赖会话密钥完成。调用login会引起登录态的刷新,之前的sessionKey可能会失效。session_key是对用户数据进行加密签名的密钥。为了自身应用安全,session_key不在网络上传输。
通过上述接口获得的用户登录态拥有一定的时效性。用户越久未使用小程序,用户登录态越有可能失效。反之如果用户一直在使用小程序,则用户登录态一直保持有效。具体时效逻辑由微信维护,对开发者透明。开发者只需要调用wx.checkSession接口检测当前用户登录态是否有效。登录态过期后开发者可以再调用wx.login获取新的用户登录态。通过wx.login获取到用户登录态之后,需要维护登录态。开发者要注意不应该直接把session_key、openid 等字段作为用户的标识或者session的标识,而应该自己派发一个 session登录态。对于开发者自己生成的session,应该保证其安全性且不应该设置较长的过期时间。session 派发到小程序客户端之后,可将其存储在storage,用于后续通信使用。
通过wx.checkSession可以检测用户登录态是否失效。并决定是否调用wx.login重新获取登录态。
如果把code当作微信给小程序的一个登录态票据,session则是小程序后台给小程序的登录态票据。在后续的操作后台要进行登录态校验,所有的业务逻辑应该围绕小程序和小程序后台展开,而微信则是提供了开放登录接口的能力。
推荐阅读:微信门店小程序怎么开发
参与讨论
发表评论