小程序使用微信登录态进行授权登录
1、调用wx.login生成code
wx.login()这个API的作用为当前用户生成一个临时的登录凭证,这个临时登录凭证有效期只有5分钟。拿到登录凭证后就可进行下一步操作,获取openid和session_key
Taro.login().then((res) => {
if (res.code) {
const { code } = res
getAuthCode({ code: res.code, appId: getGlobalData('appId') }).then((res) => {
// TODO code有效期只有五分钟,不一定存缓存?
setGlobalData('session', { ...res.data, code })
})
}
})
2、 获取openId和sessionKey
openId,标识每个用户在订阅号、服务号、小程序三种不同应用的唯一标识。每个用户在每个应用的openId都是不一致的,所以在小程序里,我们可以用openid来标识用户的唯一性
appId是微信小程序的应用标识,即application Identification,每个小程序都会有一个appId,跟人的身份证一样
session_key需要在我们自己的服务端请求微信的第三方接口,这个接口需要加上四个参数字段
参数 | 值 |
---|---|
appid | 小程序的appid |
secret | 小程序的secret |
js_code | 前面调用wx.login派发的code |
grant_type | 'authorization_code' |
const authPhoneFn = (params) => {
getAuthPhone(params).then((res) => {
if (res.code === 0) {
const params = {
...res.data,
grant_type: 'wechat-miniapp',
scope: 'server',
}
authTokenFn(params)
}
})
}
从这几个参数,我们可以看出,要请求这个接口必须先调用wx.login()来获取到用户当前会话的code。那么为什么我们要在服务端来请求这个接口呢?其实是出于安全性的考量,如果我们在前端通过request调用此接口,就不可避免的需要将我们小程序的appid和小程序的secret暴露在外部,同时也将微信服务端下发的session_key暴露给“有心之人”,这就给我们的业务安全带来极大的风险。除了需要在服务端进行session_key的获取,我们还需要注意两点:
- session_key和微信派发的code是一一对应的,同一code只能换取一次session_key。每次调用
wx.login()
,都会下发一个新的code和对应的session_key,为了保证用户体验和登录态的有效性,开发者需要清楚用户需要重新登录时才去调用wx.login()
- session_key是有失效性的,即便是不调用wx.login,session_key也会过期,过期时间跟用户使用小程序的频率成正相关,但具体的时间长短开发者和用户都是获取不到的
3、checkSession
验证登录态
4、