即先发起wxlogin请求,得到code后经第三方服务器想微信服务器发送请求获取openid,assessToken等敏感信息,这里我们需要以assessToken作为登录状态保持的依据。
1首次登录小程序,本地存储中还不存在token,即需要发起登录请求得到token,并存到本地存储
2小程序本地存储中已存在token,但是已过期,即需要再次发起登录请求以获得token,并覆盖掉本地存储中原先的token
3小程序本地存储中存在token且有效,即保持登录状态
最近开发微信小程序,做登录功能时遇到下图。
看太懂,有几处疑惑地方:
下面就是寻找答案的过程。
豪车模型
邻居模型
在上面两个模型中。豪车的主钥匙赋予泊车钥匙部分权限,而你赋予你的邻居所有的权限。比较之下,我们更希望使用豪车模型赋予部分权限,而不是邻居模型,万一他偷偷配了把钥匙呢?这种授权存在不安全性,在网络开发中也是如此。
登录时可以选择社交账号登录,这里以 QQ 为例。这里涉及三方:当前要登录的用户,以下简称 用户 ,其它两方是: , QQ 服务器 。因为 用户
之前注册过 QQ, 请求 QQ 服务器 授权用户的 QQ 基本信息,这样用户就不用在上再进行注册了。
下面来探讨下 QQ 服务器 如何授权 当前 用户 的 QQ 基本信息。
这种方法比较简单, 用户 告诉 它的 QQ 账号密码,拿着账号密码去请求 QQ 服务器获取用户基本信息。
优点 : *** 作简单。
缺点 :用户将 qq 账号密码给了,获得了该用户在 QQ 上的所有特权,不仅可以查看基本信息,还可以查看 QQ 空间,查看 QQ 邮箱等,而用户的本意是只让获取 QQ 基本信息这一项特权。
下面是在 小胡子哥的个人博客 里看到的,将整个授权过程讲解的生动形象,我就不做二次加工,直接截取部分内容如下。
开发微信小程序第一步要在 微信公众平台 上注册一个账号,注册完成后在 设置 > 开发设置 里可以看到 AppID 和 AppSecret,这相当于上面提到的 Client Id 和 Client Secret。
微信登录用户 在 微信 中打开 小程序 , 小程序 中运行了 wxlogin 接口,此时 小程序 拿着 appid 去请求 微信服务器 给 小程序 授权,让它可以调用一些微信接口,比如获取微信登录用户的基本信息。因为是 微信登录用户 进行 *** 作的,所以微信那端默认是同意授权的。(appid 哪里来?在新建小程序项目时输入,每个 appid 和小程序都是一一对应的)
上面也提到,这个 code 可能会泄露,所以需要 code + appid + appsecret 去再次拜访微信服务器获取令牌 session_key 和用户标识 openid。
这里有个疑问?为什么获取 code 在小程序上做,而获取 session_key 在第三方服务器上 *** 作?这是因为获取 code 需要使用 appid 去跳转微信服务器授权页面,再使用当前 微信登录用户 默认同意此次授权,如果坐在第三方服务器上,appid 我们是知道的,但是当前 微信登录用户 是不知道,只要手机上的微信知道。
那为什么请求 session_key 在第三方服务器上 *** 作?这是因为前面也说过 code 只能表明微信服务器统一此次授权,但是 code 可能会泄露,还需要第二张门票 appsecret 告诉微信服务器 “就是我,不是别人” 来请求获取 session_key 的。可见 appsecret 对于安全的重要性,放在第三方服务器方便管理。
关于 openid 和 session_key 说明?session_key 就是返回的绿卡,此后每次访问微信服务器资源都要带上它,这样微信服务器才知道此次请求是有授权的,我可以把资源给你。openid 是同意授权的那个人,这里是 微信登录用户 的标识 ID。也就是为什么 code 要在小程序中获取中我们不知道的那个 微信登录用户 ID。
到此,上图中涉及 Oauth20 的部分已经结束,下面的那些都是普通的 session 维持会话机制,这里就不再赘述。
由于作者文笔有限,文章如有遗漏或表达有误,请不吝赐教。如果仍对微信授权或 Oauth20 有疑问的,欢迎留言讨论。
1、在顺丰appjs中使用onLaunch,onLaunch中执行wxlogin,每次进入小程序,自动登录(点击“退出登录”按钮也会自动登录)。
2、不执行wxlogin,每次进入小程序,直接进入login界面,放弃自动登录。
微信小商店的装修功能中,调用wxlogin是为了获取用户的登录凭证code,以便在后台服务器上进行用户身份验证和授权处理。
具体而言,当用户在小商店中要进行购买、评价等 *** 作时,小商店需要向后台服务器发送请求,以确认该用户的身份和权限。如果用户没有登录,那么小商店就需要引导用户去微信授权登录,获取用户的code。通过调用wxlogin接口,小程序可以获取到用户登录凭证code,然后将此code传递给后台服务器,以完成用户身份验证和授权处理的过程。
总之,wxlogin是微信小商店装修中常用的一个API接口,它能帮助小商店实现用户身份验证和授权处理,提升用户体验和交易安全性。
电脑微信登入小程序数字信封解密失败是回调中调用wxlogin登录,会刷新登录态。。此时服务器使用code换取的sessionKey不是加密时使用的sessionKey,导致解密失败。解决方法是开发者提前进行login。或者在回调中先使用checkSession进行登录态检查,避免login刷新登录状态。
微信利用了自己的账号系统,给每个小程序主体提供了拿到该用户在当前主体的唯一识别码(open_id)的api: wxlogin
code换open_id必须通过服务器处理,需要使用到app_secret, 文档地址:
>
微信小程序获取用户信息的接口确实已经被封了,因此现在需要使用微信登录的方式进行用户身份验证和获取用户信息。在小程序中首先通过wxlogin()接口获取用户登录凭证code,然后在小程序后台配置开发者服务器地址和域名,在开发者服务器端使用code请求微信服务器获取openid和session_key等信息。之后就可以得到openid等用户信息并存储到开发者服务器端进行相关业务逻辑处理。同时需要注意需要在小程序中进行用户授权,以获取用户允许授权后的信息。
多次拒绝登录和允许登录
微信小程序的登录获取用户信息,是通过微信d出窗口,用户可点击允许 和拒绝两个按钮,点击允许,则获取用户信息登录成功,若点击拒绝,则获取失败,可通过二次请求调用d起获取用户信息窗口。
具体代码如下:
//appjs
App({
onLaunch: function () {
//调用API从本地缓存中获取数据
var logs = wxgetStorageSync('logs') || [];
logsunshift(Datenow());
wxsetStorageSync('logs', logs);
consolelog('logs',logs);
},
getUserInfo:function(cb){
var that = this;
//调用登录接口
function getOpenid(backMsg){
thatglobalDatauserInfo = backMsguserInfo;
thatglobalDataencryptedData = backMsgencryptedData;
thatglobalDataiv = backMsgiv;
thatglobalDatalogin = true;
consolelog(thatglobalDatacode);
wxrequest({
url:thatlocalUrl+'Login/sendCodeLogin',
data:{
code:thatglobalDatacode,
encryptedData: backMsgencryptedData,
iv:backMsgiv
},
success:function(openData){
consolelog('返回openid',openData,openDatadata);
if(openDatadatacode==1001){
thatglobalDataopenid = openDatadatadataopenid;
wxsetStorageSync('openid',thatglobalDataopenid);
wxsetStorageSync('userInfo',thatglobalDatauserInfo);
wxsetStorageSync('isManager', openDatadatadataisManager);
wxshowToast({
title: '登录成功',
icon: 'success',
duration: 500
});
typeof cb == "function" && cb(thatglobalDatauserInfo);
}else{
wxshowLoading({
title: '登录失败'
});
setTimeout(function () {
wxhideLoading();
}, 500)
}
}
})
}
wxlogin({
success: function (msg) {
consolelog('code',msg);
if(msgcode){
thatglobalDatacode = msgcode;
if(thatglobalDatalogin==false){
wxopenSetting({
success: function (data) {
if(data) {
if (dataauthSetting["scopeuserInfo"] == true) {
//loginStatus = true;
wxgetUserInfo({
withCredentials: false,
success: function (res) {
consolelog('第二次成功',res);
getOpenid(res);
},
fail: function (res) {
thatglobalDatalogin = false;
consolelog('二次失败',res);
}
});
}else{
thatglobalDatalogin = false;
consolelog('二次失败02');
}
}
},
fail: function () {
consoleinfo("设置失败返回数据");
}
});
}else{
wxgetUserInfo({
success: function (res) {
consolelog('第一次成功',res);
getOpenid(res);
},fail:function(msg){
thatglobalDatalogin = false;
consolelog('第一次失败',msg);
}
})
}
}
},
fail:function(res){
consolelog(res);
}
})
},
globalData:{
userInfo:null,
encryptedData:null,
iv:null,
openid:null,
code:null
}
});
以上就是关于小程序中基于token的登录流程全部的内容,包括:小程序中基于token的登录流程、梳理微信小程序登录时序图:授权与 Oauth2.0、顺丰小程序打开不自动登录等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)