暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

微信小程序授权流程

背井 2021-03-03
893

本文是有关身份验证的第三篇(算是实践篇)。前2篇分别是:

可以将本篇和第二篇进行对照阅读,思考Oauth2在小程序授权流程中的应用。




为什么要进行小程序授权?


  • 服务端调用小程序api时(如发送消息通知),需要传入自身凭证信息(access token)。

  • 为了获取用户的openid,以标识身份的惟一性。


小程序授权的分类


  • 服务端:通过服务端自有凭证(appid/app secret)获取access token。

  • 用户端: 通过让用户登录授权以获取用户信息。



分别如何操作


服务端


文档地址:https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/access-token/auth.getAccessToken.html


介绍:服务端在调用小程序接口时,大部分都需要传入access token参数。该token是小程序全局唯一后台接口调用凭据。


用法:


    GET https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET


    以node.js为例,只需要:


      const https = require('https');
      const qs = require('querystring');


      // 你的小程序 appid和secret
      const credencials = {
      appid: 'wxa0345xxxx',
      secret: 'fa01cbxxxx'
      };


      // 接口请求参数
      const params = {
      grant_type: 'client_credential',
      ...credencials
      }
      const url = 'https://api.weixin.qq.com/cgi-bin/token';
      const query = qs.stringify(params);


      https.get(`${url}?${query}`, async (res) => {


      let body = '';
      for await (const chunk of res) {
      body += chunk;
      }
      // 打印接口返回内容
      console.log(body);
      });


      运行上述代码,可以看到有access token返回:

        {
          "access_token""28_AWJL_Fl_S-e-oHgtPQ",
        "expires_in": 7200
        }



        用户端


        要获取用户的openid,需要分2步。

        我们先在小程序端让用户登录以获取code,然后将code上传到我们自己的服务端,在服务端利用code向小程序开放平台请求openid (注意code只能使用一次,且只有5分钟的有效期)


        获取code


        文档: https://developers.weixin.qq.com/miniprogram/dev/api/open-api/login/wx.login.html


        说明:在小程序中调用 `wx.login()`以获取code。


        示例代码:


          wx.login({
            success (res) {
          //发起网络请求
              wx.request({
                // 该url指向我们自己的服务端
                url: 'https://test.com/onLogin',
                data: {
                  code: res.code
                }
              })
          }
          })


          使用code交换用户openid


          文档:https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/login/auth.code2Session.html


          说明:服务端得到code后,需要向开放平台发送该code以获取用户openid。


          用法:

            GET https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code


            同样,在node.js中可以这样实现:


              const credencials = {
              appid: 'wxa0345xxxx',
              secret: 'fa01cbxxxx'
              };
              const params = {
              grant_type: 'authorization_code',
              js_code: '011OwfT41tlb1T10itT41PxeT41OwfTX',
              ...credencials
              }
              const url = 'https://api.weixin.qq.com/sns/jscode2session';
              const query = qs.stringify(params);


              https.get(`${url}?${query}`, async (res) => {


              let body = '';
              for await (const chunk of res) {
              body += chunk;
              }
              console.log(body);
              });


              运行上述代码,可以得到如下openid:


                {
                  "session_key""ASQH1lxxxx",
                "expires_in": 7200,
                "openid": "oRNLt0Oixxxx"
                }


                至此我们的两个目的:1. 获取用户openid; 2. 获取服务端access token 。都达到了。


                文章转载自背井,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                评论