声明:本文参考了阮一峰老师以及这篇文章的思路和部分代码
入门前提
- 了解OAuth2.0的授权码方式:OAuth 2.0 的一个简单解释、OAuth 2.0 的四种方式
- 能搭建一个简单的Node.js的express框架
- 注册一个公众号
第三方登录原理
在GitHub OAuth 第三方登录示例教程里提到了第三方登录原理
所谓第三方登录,实质就是 OAuth 授权。用户想要登录 A 网站,A 网站让用户提供第三方网站的数据,证明自己的身份。获取第三方网站的身份数据,就需要 OAuth 授权。
拿微信授权登录功能举例
- 用户在微信浏览器里打开A网站(eg. http://127.0.0.1:3000/code)
- A网站让用户跳到微信
- 微信要求用户登录,然后询问“A 网站要求获得 xx 权限,你是否同意?”
- 用户点击同意,微信重定向回A网站,同时发回一个授权码code
- A网站使用授权码,向微信请求令牌access_token
- 微信返回令牌access_token
- A网站使用令牌,调用微信提供的某个API获取用户的昵称头像
具体步骤
一、准备测试号、配置接口
打开微信公众平台,登录自己的公众号,选择“开发——开发者工具”,选择“公众平台测试账号”
填写配置信息,并关注“测试公众号”
二、代码
本地运行的端口号要和上面写的配置信息一致。微信获取用户信息api来源:https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorization.html#3
初始化项目:npm init
安装express和request:npm install express request
新建一个index.js文件
// index.js
const express = require('express')
const request = require('request') //用于请求外部API(如https://api.weixin.qq.com/sns/oauth2/)的插件
const app = express()
const port = 3000
var AppID = '微信公众号APPID(测试、正式号都可以)'
var AppSecret = 'ad8b2464d96436e693c6cb1c47243055'
var code = ''
app.get('/getCode', (req, res) => {
var return_uri = 'http://127.0.0.1:3000/getAccessToken'
var scoped = 'snsapi_userinfo'
var state = '123'
res.redirect('https://open.weixin.qq.com/connect/oauth2/authorize?appid='+AppID+'&redirect_uri='+return_uri+'&response_type=code&scope='+scoped+'&state='+state+'#wechat_redirect')
})
app.get('/getAccessToken', function(req, res){
code = req.query.code
console.log('得到授权码code:', code);
request.get(
{
url:'https://api.weixin.qq.com/sns/oauth2/access_token?appid='+AppID+'&secret='+AppSecret+'&code='+code+'&grant_type=authorization_code'
}, // 请求获取令牌
function(error,response,body){
if(response.statusCode == 200){
let data = JSON.parse(body)
let access_token = data.access_token;
let openid = data.openid;
request.get(
{
url:'https://api.weixin.qq.com/sns/userinfo?access_token='+access_token+'&openid='+openid+'&lang=zh_CN'
}, // 调用获取用户信息的api
function(error,response,body){
var userinfo = JSON.parse(body);
console.log(userinfo)
res.send("\
<h1>"+userinfo.nickname+" 的个人信息</h1>\
<p><img src='"+userinfo.headimgurl+"' /></p>\
<p>"+userinfo.city+","+userinfo.province+","+userinfo.country+"</p>\
");
}
)
}
}
)
})
app.listen(port, () => {
console.log('可以启动啦'+'http://localhost:3000')
})
输入命令 node index.js 即可运行项目
三、原理
四、效果
在微信浏览器打开http://127.0.0.1:3000/getCode
先出现授权界面:微信要求用户登录,然后询问“A 网站要求获得 xx 权限,你是否同意?”
授权成功后,界面显示授权用户的昵称、头像和地区