本文是有关身份验证的第三篇(算是实践篇)。前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和secretconst 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 。都达到了。




