微信小程序登录验证

2,477 阅读3分钟

wx.login是什么

在微信小程序中,微信官方帮我们提供了登录接口wx.login,为什么这样做?这样做就免去了我们自己写登录接口并且官方推荐的更加安全。

如果我们不使用微信官方的wx.login接口,想象一下我们还要像web端一样在用户登入的时候还要输入账号密码,但是在微信小程序中,这显然不合理,既然我们都使用了微信小程序,那么直接微信登录不是更加合理吗?

wx.login主要作用是返回code给前端,然后前端将code返回给后端,后端调用微信api获取到openid和session_key,openid表示用户在当前小程序的唯一表示,session听名字就知道是会话密钥,并且设有过期时间,后端再将openid和做了加密的session返回给前端,session为什么做加密,因为不能将真实的session返回给前端,这样不安全。然后前端之后需要登录验证的接口都需要携带这个session才能够成功请求(这里就和我们平常的登录逻辑一样了)

wx.login({
    success: (res)=>{
        console.log(res.code)
    }
})

真实场景

但是在实际生产场景中,我们不希望所有人都可以访问到某些小程序,所以这里需要再多一层数据库层的验证,举个例子,当我们通过wx.login得到code的时候,我们返回后端的时候多带了一些表单验证,如下:

    wx.login({
    // 先获取wx.login的code
    success: (res) => {
      // 在和数据库数据做对比,register
      const obj = {
        "code": res.code,
        "username": this.data.username,
        "age": this.data.age,
      }
      register(obj).then((res) => {
          //假设返回exist表示验证通过
          if(res.exist === 1){
              //相应的操作
              wx.login({
                  success: (res)=>{
                      myLogin({code: res.code}).then(()=>{
                          //存储session的操作
                          //存储openid的操作
                      })
                  }
              })
          }
      })
    },
  })
  

在这段代码中register以及myLogin都是我封装好的promise请求,register表示表单和数据库作比较的过程,myLogin表示请求后端下发openid以及session,整个流程就是先通过表单以及code验证是否在数据库中存在该用户,这里为什么不直接传递表单而还要传递code是为了验证code是否是假的,如果是假的那就不用在进行表单验证了,验证成功之后在通过myLogin接口获取openid以及session。

你可能会疑问我这段代码为什么调用了两次wx.login因为code是一次性的,就举上述例子,当我们向后端发起register请求的时候,后端会携带这个code去请求微信api下发openid以及session,但是我们myLogin请求的时候也需要后端去执行同样的操作,但是code的特点就是请求一次code就只能执行一次下发session以及openid的操作,这就意味着我们后端需要调用几次请求openid,session的api就需要几次wx.login获取的code。

微信维护的session以及我们需要的session

微信session设计的过期时间一般和我们设置的sesion不一样,所以我们需要自己在设置一个过期时间,方法是在后端的高速缓存里面存储session并设置过期时间,当我们登录过期的时候重新wx.login获取code并更新后端高速缓存的session值

存在的不足以及解决方法

举上述例子,当我们输入表单的时候被他人看见,然后其他人再拿他的信息去自己微信上登录,那么也会登陆成功,这是一个安全性问题,根本的原因就是数据库中的表单数据没有和openid绑定起来,如果绑定起来那就只能在自己的微信登录这个小程序,但是考虑到实际情况也可以给表单加一个手机号验证,这样的话用户也可以在其他人微信上面登录,具体的情况可能有不同的方法。