基于OAuth2.0微信网页第三方授权原理

看了阮一峰的OAuth2.0 的文章,主要偏理论 http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html
和闪客sun 的,整体流程比较详细 https://www.cnblogs.com/flashsun/p/7424071.html#!comments.
和微信扫码登录OAuth2.0
https://cloud.tencent.com/developer/article/1447723

本人亲自拿gitee登录用微信来登录实验了下:

1.gitee界面找到微信按钮

在这里插入图片描述

2.点击微信按钮


浏览器发送Get请求:webchat
返回302 URL重定向。
(重定向的流程浏览器首先访问服务器A的URL,服务器A返回带着location为B的URL的 header 和3XX的状态码,浏览器读取响应的3XX状态码,获取到头部的 location,然后跳转到服务器B的URL。需要知道的,跳转是浏览器发起的。)
在这里插入图片描述


URL重定向到https://open.weixin.qq.com/connect/qrconnect?appid=wx63d402790645b7e6&redirect_uri=https%3A%2F%2Fgitee.com%2Fauth%2Fwechat%2Fcallback&response_type=code&scope=snsapi_login&state=493b424b8d3e54839c606a13862010c200917df6d41a5fe3
返回 200 ok。
在这里插入图片描述

参数说明

|参数 |是否必须 |说明|
|:---- |:—|:----- |----- |
|appid |是| 应用唯一标识
|redirect_uri |是| 请使用urlEncode对链接进行处理(与后台配置一致,否则会报redirect_uri参数错误。)
|response_type |是| 填code
|scope |是|应用授权作用域,拥有多个作用域用逗号(,)分隔,网页应用目前仅填写snsapi_login即可
|state |否|用于保持请求和回调的状态,授权请求后原样带回给第三方。该参数可用于防止csrf攻击(跨站请求伪造攻击),建议第三方带上该参数,可设置为简单的随机数加session进行校验
返回说明
用户允许授权后,将会重定向到redirect_uri的网址上,并且带上code和state参数。

3.扫描微信登录成功

扫描微信登录界面成功以后,微信登录界面的JS代码拉起如下Get请求,JS代码如下:
在这里插入图片描述

浏览器发送Get请求: https://gitee.com/auth/wechat/callback?code=031Z9gll2xPIx746tlll2NT4VE0Z9gle&state=493b424b8d3e54839c606a13862010c200917df6d41a5fe3
返回200 ok。

返回结果如下图界面所示:(授权成功界面,我这个是微信和gitee没有绑定,也是一种授权成功界面)

在这里插入图片描述

**上面是按照步骤来实验,**现在画个图来理解下。
在这里插入图片描述

至于很多人有个疑问:为什么要多个code 而不是直接返回token?
安全性:

1.返回code可能会被攻击者挟持。

2.code只能使用一次。换取token需要code,appid,app_secret三个参数。

3.必须确定gitee是在微信授权服务器这边注册过的(一般注册过会发放,appid,app_secret)

微信OAuth2.0授权登录目前支持authorization_code模式,适用于拥有server端的应用授权。该模式整体流程为:

1. 第三方发起微信授权登录请求,微信用户允许授权第三方应用后,微信会拉起应用或重定向到第三方网站,并且带上授权临时票据code参数;

2. 通过code参数加上AppID和AppSecret等,通过API换取access_token;

3. 通过access_token进行接口调用,获取用户基本数据资源或帮助用户实现基本操作。
微信OAuth2.0网页授权接口 微信OAuth2.0网页授权接口的thinkphp实现版本,主要实现了oauth网页受权,以及部分其他接口。 使用方法 为什么用OAuth2.0受权? 通过OAuth2.0受权的网页将会获取到打开者的微信信息,甚至包括微信昵称、头像等有用的数据,开发者们可以凭此设计出更多更丰富的页面应用,比如最近一直很火爆的红包类活动。除此之外还有个额外的好处,就是可以控制页面在非微信浏览器中无法打开,可以减少代码被人窥窃的风险。 那么红包类活动是如何使用OAuth2.0受权接口的呢? 1.首先用户打开页面连接(php页面),php接收到请求后将页面跳转到微信OAuth2.0受权页面,在获取到受权后再次将页面跳转回php服务器;此次跳转中带有用户的各种信息,php服务器记录后返回用户所看到的页面。 2.然后用户转发此页面,在转发的连接中带有自己的标识参数。当好友点击分享后的连接的时候也会重复第1步的步骤,当php服务器发现从微信OAuth2.0受权返回的数据中的用户数据与标识参数对应的分享者的用户数据不一致的时候,则可以判断出有好友打开了分享页面,给用户增加一个红包。 使用方法 AuthAction.class.php ---- 认证基类 IndexAction.class.php --- 测试类 index/Conf/config.php --- 设置 wx_appID 微信公众账号的appid wx_appsecret 微信公众账号的appsecret weixin_token 微信公众账号接口配置信息的Token wx_webauth_callback_url OAuth2.0授权后跳转到的默认页面 wx_webauth_expire OAuth2.0授权Token过期时间默认6500 配置好config.php后在微信公号后台设置index.php/Index/wechatInitAuth进行微信API认证,提示"配置成功"后方可使用。 测试公众号申请与具体的测试步骤见下方。 测试 IndexAction.class.php --- 测试类 申请微信测试公众帐号 微信提供测试用的公众账号,此帐号只能添加100个关注者且只有已关注的用户才可以进行OAuth2.0受权。 点此开通测试帐号 1.开通后将appID、appsecret、Token填入index/Conf/config.php中。然后将接口配置信息中的URL改至php服务器,将地址定位到index.php/Index/wechatInitAuth进行微信API认证,直到提示"配置成功"。 2.点击‘体验接口权限表--OAuth2.0网页授权(仅关注者才能授权)’中的修改,将授权回调页面域名改为php服务器地址。直到出现‘通过安全监测’。 配置完微信测试号后,在微信中打开http://项目目录/index.php(例:http://121.40.135.90/weixin_auth/index.php)将会在页面中打印出session中的受权数据,表示测试受权成功。 代码结构 在AuthAction中的初始化函数_initialize中进行了OAuth2.0受权,所有基于AuthAction的控制器都将进行受权过程(除了微信API认证过程wechatInitAuth)。 对于同一用户在受权过期时间内多次打开此控制器的页面,将不会进行多次受权,因为其受权信息记录在session中,以免重复受权,减慢访问速度。受权过期时间在index/Conf/config.php中wx_webauth_expire设置,建议不要大于微信的过期时间7200秒。 注意: 微信OAuth2.0受权分为snsapi_base (不弹出授权页面,直接跳转,只能获取用户openid),snsapi_userinfo (弹出授权页面,可通过openid拿到昵称、性别、所在地。并且,即使在未关注的情况下,只要用户授权,也能获取其信息),AuthAction.class.php默认为snsapi_base,而且session中只记录了snsapi_base中的基础数据,如需要snsapi_userinfo请自行修改。 具体的实现方法见代码注释。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值