Node.js实现微信授权登陆功能(快速入门)

声明:本文参考了阮一峰老师以及这篇文章的思路和部分代码

入门前提

  1. 了解OAuth2.0的授权码方式OAuth 2.0 的一个简单解释OAuth 2.0 的四种方式
  2. 能搭建一个简单的Node.js的express框架
  3. 注册一个公众号

第三方登录原理

GitHub OAuth 第三方登录示例教程里提到了第三方登录原理

所谓第三方登录,实质就是 OAuth 授权。用户想要登录 A 网站,A 网站让用户提供第三方网站的数据,证明自己的身份。获取第三方网站的身份数据,就需要 OAuth 授权。

拿微信授权登录功能举例

  1. 用户在微信浏览器里打开A网站(eg. http://127.0.0.1:3000/code
  2. A网站让用户跳到微信
  3. 微信要求用户登录,然后询问“A 网站要求获得 xx 权限,你是否同意?”
  4. 用户点击同意,微信重定向回A网站,同时发回一个授权码code
  5. A网站使用授权码,向微信请求令牌access_token
  6. 微信返回令牌access_token
  7. 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 权限,你是否同意?”

授权成功后,界面显示授权用户的昵称、头像和地区

  • 5
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值