小程序开发--API之登录授权逻辑

小程序登录授权获取逻辑

原生的小程序提供许多开放接口供使用者开发,快速建立小程序内的用户体系。

下面将小程序校验、登录、授权、获取用户信息诸多接口串联起来,以便更直观的认识到这些接口是如何在实际应用中使用的。

一、 检验、登录

wx.checkSession({
    success: function() {
       //session_key 未过期,并且在本生命周期一直有效
    },
    fail: function() {
        //session_key 已经失效,需要重新执行登录流程
        wx.login({
            success: (res) => {
                if (res.code) {
                    //发起网络请求
                    wx.request({
                        //开发者服务器通过code换取用户唯一标识openid 和 会话密钥session_key。
                        url: 'https://test.com/onLogin',                  
                        data: {
                            // 临时登录凭证code,并回传到开发者服务器
                            code: res.code
                        },
                        success: function(result) {
                            //返回业务数据,前后端交互身份识别
                        }
                    })
                } else {
                    console.log('登录失败!' + res.errMsg)
                }
            }
        });
    }
})

login说明:

  1. 小程序调用wx.login() 获取 临时登录凭证code ,并回传到开发者服务器。

  2. 开发者服务器以code换取 用户唯一标识openid 和 会话密钥session_key。

之后开发者服务器可以根据用户标识来生成自定义登录态,用于后续业务逻辑中前后端交互时识别用户身份。

会话密钥session_key有效性:

开发者如果遇到因为session_key不正确而校验签名失败或解密失败,请关注下面几个与session_key有关的注意事项。

  1. wx.login()调用时,用户的session_key会被更新而致使旧session_key失效。开发者应该在明确需要重新登录时才调用wx.login(),及时通过登录凭证校验接口更新服务器存储的session_key。

  2. 微信不会把session_key的有效期告知开发者。我们会根据用户使用小程序的行为对session_key进行续期。用户越频繁使用小程序,session_key有效期越长。

  3. 开发者在session_key失效时,可以通过重新执行登录流程获取有效的session_key。使用接口wx.checkSession()可以校验session_key是否有效,从而避免小程序反复执行登录流程。

  4. 当开发者在实现自定义登录态时,可以考虑以session_key有效期作为自身登录态有效期,也可以实现自定义的时效性策略。

二、 授权获取用户信息

// 可以通过 wx.getSetting 先查询一下用户是否授权了 "scope.record" 这个 scope
wx.getSetting({
    success(res) {
        if (!res.authSetting['scope.record']) {
            wx.authorize({
                scope: 'scope.record',
                success() {
                    // 用户已经同意小程序使用录音功能,后续调用 wx.startRecord 接口不会弹窗询问
                    wx.startRecord()
                }
            })
        }
    }
})

注意:wx.authorize({scope: "scope.userInfo"}),无法弹出授权窗口,请使用 <button open-type="getUserInfo"></button>

如果用户已经授权,要获取用户信息,调下面接口:

wx.getSetting({
    success: (res)=>{
        if (res.authSetting['scope.userInfo']) {
            // 已经授权,可以直接调用 getUserInfo 获取头像昵称
            wx.getUserInfo({
              withCredentials: true,
              success: (res) => {
                  console.log(res);
              }                           
            })
        }
    }
}); 

注意:

  1. 当用户未授权过,调用该接口将直接报错
  2. 当用户授权过,可以使用该接口获取用户信息

posted on 2018-06-04 10:55  世界之魂  阅读(785)  评论(0编辑  收藏  举报

导航