OAuth2(open Auth)开放授权协议

授权码模式流程:

1、浏览器(客户端)点击一个比如使用微信登陆按钮

2、会跳到认证服务器页面,让用户选择是否授权

3、如果用户点击授权,那么会跳转到开始在链接上填写的回调地址 (redirect_uri),同时会产生一个授权码code

4、客户端又拿这个code去认证服务器请求access_token

5、有了access_token就可以去调用授权的接口,access_token有效期比较短,当access_token过期后可以refresh_token刷新access_token

微信登陆流程:

为了便于调试,可以在微信开发平台的回调上写本地服务比如egg启动的地址localhost:7001,只要和本地设置的回调地址同域名就可以生成二维码

1、引用http://res.wx.qq.com/connect/zh_CN/htmledition/js/wxLogin.js

2、 实例化以下对象可以生成一个二维码

 var obj = new WxLogin({
self_redirect:false, //是在iframe里跳转还是顶层窗口跳转
id:"login_container", //DOM容器放置二维码的区域
appid: "", //在应用开发平台申请
scope: "snsapi_login", //如果是网页应用填写这个
redirect_uri: "localhost:7001/reqAccessToken",//回调地址
state: "xxx",//附带传递的数据
style: "", //二维码行内样式
href: "" //外链样式
});

3、扫描这个二维码,会弹出授权页,点击授权会重定向到刚才的回调地址redirect_uri,并会自动附上code值,如果开始填了state值,这个时候也会返回刚才的state,可以用这个state的自定义值进行区分做登陆还是绑定

redirect_uri?code=CODE&state=STATE  //点击授权的返回
redirect_uri?state=STATE //不授权的返回

4、然后在比如nodejs服务路由里拦截刚才的redirect_uri地址,然后获取这个code值,去调用获取access_token的接口

https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
//appid和secret //开放平台提供的值,填上即可
//CODE 即上一步返回的code值

5、这个获取access_token的接口返回的数据

{
"access_token":"ACCESS_TOKEN", //调用进一步接口令牌
"expires_in":7200, //这个接口的过期时间
"refresh_token":"REFRESH_TOKEN",//刷新上面令牌的参数
"openid":"OPENID", //用户唯一标识
"scope":"SCOPE"
}

6、用openid和access_token获取用户基本信息

https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID
//上一步返回的openid和access_token
{
"openid":"OPENID",
"nickname":"NICKNAME",
"sex":1,
"province":"PROVINCE",
"city":"CITY",
"country":"COUNTRY",
"headimgurl": "http://wx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/0",
"privilege":[
"PRIVILEGE1",
"PRIVILEGE2"
],
"unionid": " o6_bmasdasdsad6_2sgVt7hMZOPfL" //用这个unionid进行绑定其他信息
}

7、拿unionid和用户填写的其他信息进行关联绑定,比如手机号,当用户下次绑定的时候,发现数据库里有了该手机号,则直接给用户跳转到扫码界面进行扫码登陆,如果当用户下次是直接扫码登陆,但是数据库里没有这个unionid,则给用户跳转到绑定界面让用户进行绑定

调试或多环境共用一个开发平台回调设置:

如果微信开发平台只注册了一个网站应用,只能填写一个回调地址,为了不影响本地开发调试,可以在服务端做一个转发:

比如回调地址是111.111.111.111:7001则给开发环境和生产环境加一个标识,当回调请求111.111.111.111:7001/env/dev/reqAccessToken 则重定向到 localhost:7001/reqAccessToken,如果111.111.111.111:7001/production/reqAccessToken则重定向到111.111.111.111:7001/reqAccessToken即可,本地生成二维码的redirect_uri就写111.111.111.111:7001/env/${env}即可,然后服务端路由拦截/env/:env,根据env做重定向判断。

//生成二维码的实例化对象redirect_uri填写
//跟微信开发平台填写的回调地址同域名
var redirectPrefix = "https://www.xxx.com";
var CURENV = '<%=env%>';
new WxLogin({
self_redirect: false,
id: "J_wechatCodeBind",
appid: "xxx",
scope: "snsapi_login",
redirect_uri: encodeURI(`${redirectPrefix}/env/${CURENV}`),
state:"",
style: "white",
href: ""
}); //路由拦截上面的回调GET请求
async redirectUrl() {
const ctx = this.ctx;
const curEnv = ctx.params.curEnv;
const code = ctx.query.code;
const state = ctx.query.state;
if (curEnv == 'dev') {
ctx.redirect(`http://localhost:7001/xxx/xxx/requestAccessToken?code=${code}&state=${state}`);
} else if (curEnv == 'test') {
ctx.redirect(`http://192.168.0.xxx:7006/xxx/xxx/requestAccessToken?code=${code}&state=${state}`);
} else {
ctx.redirect(`https://www.xxx.com/xxx/xxx/requestAccessToken?code=${code}&state=${state}`);
}
}

oAuth2授权协议 & 微信授权登陆和绑定 & 多环境共用一个微信开发平台回调设置的更多相关文章

  1. 理解OAuth2.0协议和授权机制

    无论是自然资源还是互联网上的资源,需要控制使用权与被使用权,以保护资源的安全.合理的使用和有效的管控. 项目中,我们需要控制的是用户资源,既要保证有效用户的合理使用,又要防范非法用户的攻击.如此,如何 ...

  2. OAuth2.0 用户验证授权标准 理解

    OAuth2.0是一套标准. 一.问题 这个标准解决了这样的一个问题. 允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用.  ...

  3. 深入理解OAuth2.0协议

    1. 引言 如果你开车去酒店赴宴,你经常会苦于找不到停车位而耽误很多时间.是否有好办法可以避免这个问题呢?有的,听说有一些豪车的车主就不担心这个问题.豪车一般配备两种钥匙:主钥匙和泊车钥匙.当你到酒店 ...

  4. 帮你深入理解OAuth2.0协议

    1. 引言 如果你开车去酒店赴宴,你经常会苦于找不到停车位而耽误很多时间.是否有好办法可以避免这个问题呢?有的,听说有一些豪车的车主就不担心这个问题.豪车一般配备两种钥匙:主钥匙和泊车钥匙.当你到酒店 ...

  5. (转)帮你深入理解OAuth2.0协议

    1. 引言 如果你开车去酒店赴宴,你经常会苦于找不到停车位而耽误很多时间.是否有好办法可以避免这个问题呢?有的,听说有一些豪车的车主就不担心这个问题.豪车一般配备两种钥匙:主钥匙和泊车钥匙.当你到酒店 ...

  6. 问题:OAuth2.0;结果:帮你深入理解OAuth2.0协议

    1. 引言 如果你开车去酒店赴宴,你经常会苦于找不到停车位而耽误很多时间.是否有好办法可以避免这个问题呢?有的,听说有一些豪车的车主就不担心这个问题. 豪车一般配备两种钥匙:主钥匙和泊车钥匙.当你到酒 ...

  7. Asp.netCore 3.0 Web 实现Oauth2.0微信授权登陆的测试

    1:Oauth2.0授权的流程截图 官方流程如下: 1 第一步:用户同意授权,获取code 2 第二步:通过code换取网页授权access_token 3 第三步:刷新access_token(如果 ...

  8. PHP实现微信网页登陆授权开发

    这篇文章主要介绍了关于PHP实现微信网页登陆授权开发,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下 更多PHP相关知识请关注我的专栏PHP​zhuanlan.zhihu.com 微信开 ...

  9. 微信公众平台开发——微信授权登录(OAuth2.0)

    1.OAuth2.0简介 OAuth(开放授权)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用. 允许用户 ...

随机推荐

  1. OC调用c++函数

    1.调用的时候我明明改成了 .mm  , 也添加了libstdc++.dylib  调用自己(xcode )写的(cocoa static lib )c++  ,编译总是报找不到库里的函数, 最后我在 ...

  2. vue-cli的跨域配置(自己总结)

  3. idea在Terminal中使用maven指令

    如果无法直接使用mvn指令,那么这里需要配置你idea中的maven的环境变量, 先说maven在idea中的位置,在你idea安装目录下的\plugins\maven 接下来配置环境变量:在你的用户 ...

  4. ASP.NET MVC系列:web.config中ConnectionString aspnet_iis加密与AppSettings独立文件

    1. web.config中ConnectionString aspnet_iis加密 web.config路径:E:\Projects\Libing.Web\web.config <conne ...

  5. sgu438-The_Glorious_Karlutka_River

    Description SGU似乎死了... 题目搬到了Codeforces... Problem - 99999438 - Codeforces Solution 动态最大流. 考虑如果不求时间, ...

  6. Android 入门(2)修改EditText下划线颜色 / 隐藏标题栏

    1 添加颜色 colors.xml中增加 <color name="colorRed">#FF3300</color> 2 添加style styles.x ...

  7. 【XSY3139】预言家 数位DP NFA

    题目描述 有一个定义在 \(\{0,1,2,3,4,5,6,7,8,9\}\) 上的合规表达式,包含三种基本的操作: 结合:\(E_1E_2\) 分配:\((E_1|E_2|\ldots|E_n),n ...

  8. Django 视图系统

    Django 视图系统 概念 一个视图函数,简称视图,是一个简单的Python函数,用于接受Web请求并返回Web响应. 通常将视图函数写在project或app目录中的名为views.py文件中 简 ...

  9. 【BZOJ5496】[十二省联考2019]字符串问题(后缀树)

    [BZOJ5496][十二省联考2019]字符串问题(后缀树) 题面 BZOJ 洛谷 题解 首先显然可以把具有支配关系的串从\(A\)到\(B\)连一条有向边,如果\(B_i\)是\(A_j\)的前缀 ...

  10. 【CF1132G】Greedy Subsequences(线段树)

    [CF1132G]Greedy Subsequences(线段树) 题面 CF 题解 首先发现选完一个数之后选择下一个数一定是确定的. 对于每个数预处理出左侧第一个比他大的数\(L\),那么这个数加入 ...