官方网站:http://oauth.net/http://oauth.net/2/
权威定义:OAuth 是一种开放协议,允许通过简单且标准的方法从Web、移动和桌面应用程序进行安全授权。
OAuth是一种开放协议,允许用户让第三方应用程序以安全、标准的方式获取存储在网站、移动或桌面应用程序上的用户私人资源(例如用户个人信息、照片、视频、联系人列表)。无需向第三方应用程序提供您的用户名和密码。
OAuth 2.0 是OAuth 协议的下一版本,但不向后兼容OAuth 1.0。 OAuth 2.0 注重客户端开发人员的简单性,同时为Web 应用程序、桌面应用程序以及移动设备和客厅设备提供专门的身份验证流程。
OAuth 允许用户提供令牌而不是用户名和密码来访问存储在特定服务提供商处的数据。每个令牌授权特定网站(例如视频编辑网站)在特定时间段(例如接下来的2小时内)访问特定资源(例如仅某个专辑中的视频)。通过这种方式,OAuth 允许用户授权第三方网站访问其存储在其他服务提供商上的信息,而无需共享其访问权限或数据的全部内容。
新浪微博API目前也使用OAuth 2.0。
2.微信公众平台OAuth2.0授权
微信公众平台OAuth2.0授权详细步骤如下:
1、用户关注微信公众号。
2、微信公众号提供用户请求授权页面URL。
3、当用户点击授权页面URL时,会向服务器发出请求。
4、服务器询问用户是否同意授权微信公众号(作用域为snsapi_base时不需要此步骤)
5、用户同意(范围为snsapi_base时不需要此步骤)
6.服务器通过回调将CODE传给微信公众号
7.微信公众号获取CODE
8.微信公众号通过CODE向服务器请求Access Token
9、服务器返回Access Token和OpenID给微信公众号
10、微信公众号通过Access Token向服务器请求用户信息(作用域为snsapi_base时无需此步骤)
11、服务器返回用户信息到微信公众号(作用域为snsapi_base时不需要此步骤)
如果用户访问微信公众号(Web微信除外)的第三方网页,公众号开发者可以通过该接口获取当前用户的基本信息(包括昵称、性别、城市、国家)。利用用户信息,可以实现体验优化、用户来源统计、账号绑定、用户身份认证等功能。请注意,“获取用户基本信息接口”只能在用户与公众号有消息交互时根据用户的OpenID获取用户的基本信息。但通过网页授权即可获取用户的基本信息,无需消息交互。用户只需输入公众号即可。网页上会弹出请求用户授权的界面。用户授权后,就可以获取他们的基本信息(这个过程甚至不需要用户关注公众号。)
微信OAuth2.0授权登录允许微信用户使用微信身份安全登录第三方应用或网站。微信用户授权登录有权访问微信OAuth2.0的第三方应用后,第三方可以获取用户的接口调用凭证(access_token),可以通过access_token调用微信开放平台授权关系接口,从而获取微信用户的基本开放信息,帮助用户实现基本开放功能。
微信公众号请求用户网页授权前,开发者需要在平台官网我的服务页面配置授权回调域名。请注意,此处填写的域名请勿添加http://。
授权回调域名配置说明:
授权回调域名配置规范为完整域名。例如,需要网页授权的域名为:www.qq.com。配置完成后,该域名下的页面http://www.qq.com/music.html和http://www.qq.com/login.html均可以进行OAuth2.0认证。但http://pay.qq.com、http://music.qq.com、http://qq.com无法进行OAuth2.0认证。
具体来说,网页授权过程分为四个步骤:
引导用户进入授权页面同意授权并获取代码。
通过代码交换网页授权access_token(与基础支持的access_token不同)
如有需要,开发者可以刷新网页授权access_token,避免过期
通过网页授权access_token和openid获取用户基本信息
目录
[隐藏]
1第1步:用户同意授权并获取代码
2 第二步:兑换网页授权access_token的code
3 第3步:刷新access_token(如有必要)
4第4步:拉取用户信息(需要有snsapi_userinfo范围)
5 附录:检查授权证书(access_token)是否有效
第一步:用户同意授权并获取代码
在保证微信公众号有授权范围(scope参数)的前提下(服务号获取高级接口后,scope参数中默认会有snsapi_base和snsapi_userinfo),引导关注者打开以下页面:
https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPIDredirect_uri=REDIRECT_URIresponse_type=codescope=SCOPEstate=STATE#wechat_redirect
如果提示“链接无法访问”,请检查参数是否填写错误,以及您是否拥有scope参数对应的授权范围权限。
参考链接(请在微信客户端打开此链接体验)范围为snsapi_base
https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx520c15f417810387redirect_uri=http%3A%2F%2Fchong.qq.com%2Fphp%2Findex.php%3Fd%3D%26c%3DwxAdapter%26m%3DmobileDeal%26showwxpaytitle% 3D1%26vb2ctag%3D4_2030_5_1194_60response_type=codescope=snsapi_basestate=123#wechat_redirectScope为snsapi_userinfohttps://open.weixin.qq.com/connect/oauth2/authorize?appid=wxf0e81c3bee622d60redirect_uri=http%3A%2F% 2Fnba.bluewebgame.com%2Foauth_response.phpresponse_type=codescope=snsapi_userinfostate=STATE#wechat_redirect
参数说明
需要指定参数吗?
appid是公众号的唯一标识
redirect_uri为授权后重定向的回调链接地址。请使用urlencode来处理链接。
response_type为返回类型,请填写代码
scope为应用授权范围,snsapi_base(不弹出授权页面,直接跳转,只能获取用户的openid),snsapi_userinfo(弹出授权页面,可以通过而且,即使你不注意,只要用户授权,也可以获得他的信息)
如果状态被重定向,状态参数将被包含。开发者可以填写a-zA-Z0-9的参数值。
#wechat_redirect 无论是直接打开还是对页面进行302重定向时都必须携带该参数。
下图是scope等于snsapi_userinfo时的授权页面:
用户同意授权后
如果用户同意授权,页面会跳转到
redirect_uri/?code=CODEstate=STATE。
如果用户禁止授权,则重定向后不会包含code参数,只会包含state参数redirect_uri?state=STATE。
代码说明:code作为票据,换取access_token。每个用户授权时带的code都会不同。该代码只能使用一次,5分钟未使用将自动失效。
第二步:兑换网页授权access_token的code
首先请注意,这里通过代码交换的网页授权access_token与基础支持的access_token是不同的。公众号可以通过以下接口获取网页授权access_token。如果网页授权的范围为snsapi_base,则本步骤在获取网页授权access_token的同时,也获取了openid,snsapi_base风格的网页授权流程到此结束。
请求code获取code后,请求以下链接获取access_token:
https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPIDsecret=SECRETcode=CODEgrant_type=authorization_code
参数说明
需要指定参数吗?
appid是公众号的唯一标识
秘密是公众号的appsecret
code为第一步获取的code参数。
grant_type填写为authorization_code
退货说明
正确时返回的JSON数据包如下:
{"access_token":"ACCESS_TOKEN","expires_in":7200,"refresh_token":"REFRESH_TOKEN","openid":"OPENID","scope":"SCOPE"}
参数说明
access_token 网页授权接口调用证书,注意:此access_token与基本支持的access_token不同
expires_inaccess_token接口调用证书超时时间,单位(秒)
fresh_token 用户刷新access_token
openid 用户的唯一标识符。请注意,当用户没有关注公众号时,当用户访问公众号网页时,也会生成一个用户和公众号唯一的OpenID。
scope 用户授权的范围,以逗号(,)分隔
发生错误时,微信会返回JSON数据包如下(示例为无效Code错误):
{"errcode":40029,"errmsg":"无效代码"}
全局返回码说明
步骤3:刷新access_token(如果需要)
由于access_token有效期较短,当access_token超时时,可以使用refresh_token进行刷新。 fresh_token的有效期较长(7天、30天、60天、90天)。当refresh_token过期后,用户需要重新授权。
请求方式
第二步获取到refresh_token后,请求以下链接获取access_token:https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=APPIDgrant_type=refresh_tokenrefresh_token=REFRESH_TOKEN
需要指定参数吗?
appid是公众号的唯一标识
grant_type填写为refresh_token
fresh_token就是填写通过access_token获取到的refresh_token参数
退货说明
正确时返回的JSON数据包如下:
{"access_token":"ACCESS_TOKEN","expires_in":7200,"refresh_token":"REFRESH_TOKEN","openid":"OPENID","scope":"SCOPE"}
参数说明
access_token 网页授权接口调用证书,注意:此access_token与基本支持的access_token不同
expires_inaccess_token接口调用证书超时时间,单位(秒)
fresh_token 用户刷新access_token
openid 用户唯一标识符
scope 用户授权的范围,以逗号(,)分隔
发生错误时,微信会返回JSON数据包如下(示例为无效Code错误):
{"errcode":40029,"errmsg":"无效代码"}
全局返回码说明
步骤4:拉取用户信息(需要有snsapi_userinfo范围)
如果网页授权范围为snsapi_userinfo,开发者现在可以通过access_token和openid拉取用户信息。
请求方式
http:GET(请使用https协议)
https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKENopenid=OPENIDlang=zh_CN
参数说明
参数说明
access_token 网页授权接口调用证书,注意:此access_token与基本支持的access_token不同
openid用户的唯一标识符
lang 返回国家和地区语言版本,zh_CN 简体,zh_TW 繁体,en 英语
退货说明
正确时返回的JSON数据包如下:
{"openid":"OPENID","昵称":NICKNAME,"性别":"1","省":"PROVINCE""城市":"CITY","国家":"COUNTRY","headimgurl":" http://wx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/46","特权":["特权1""PRI VILEGE2"]}
参数说明
openid用户的唯一标识符
昵称用户昵称
性用户的性别。当值为1时,为男性,当值为2时,为女性,当值为0时,未知。
省份用户资料填写的省份
city普通用户个人数据填写的城市
国家,例如中国是CN
headimgurl 用户头像,最后一个值代表方形头像大小(可以有0,46,64,96,132值,0代表640*640方形头像),当用户没有头像时此项为空
privilege用户权限信息,json数组,例如微信沃卡用户是(chinaunicom)
发生错误时,微信会返回JSON数据包如下(示例为openid无效):
{"errcode":40003,"errmsg":"invalidopenid"}
全局返回码说明
附:验证授权证书(access_token)是否有效
请求方式
http:GET(请使用https协议)
https://api.weixin.qq.com/sns/auth?access_token=ACCESS_TOKENopenid=OPENID
参数说明
参数说明
access_token 网页授权接口调用证书,注意:此access_token与基本支持的access_token不同
openid用户的唯一标识符
退货说明
正确的Json返回结果:
{"errcode":0,"errmsg":"确定"}
错误时Json 返回示例:
{"errcode":40003,"errmsg":"invalidopenid"}
案例代码:
请求授权页面是如何构建的
URL在线编码工具:http://tool.oschina.net/encode?type=4
https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPIDredirect_uri=REDIRECT_URIresponse_type=codescope=SCOPEstate=STATE#wechat_redirect
前端代码
http://www.w3.org/TR/html4/strict.dtd";http-equiv="Content-Type" content="text/html; charset=UTF-8" /会员注册
函数回调(结果){
警报("成功");
警报(结果); //输出openid
}
函数getQueryString(名称) {
var reg=new RegExp("(^|)" + name + "=([^]*)(|$)", "i");
var r=window.location.search.substr(1).match(reg);
if (r !=null) return unescape(r[2]);返回空值;
}
var code=getQueryString("code");
$.ajax({
async: false, url: "http://atest.sinaapp.com/oauth2.php", //这是我的服务器端处理文件php
type: "GET", //以下几行是jsoup.如果去掉以下几行的注释,那么后端相应的返回结果也会被去掉。
//dataType: "jsonp",
//jsonp: "callback", //jsonp的值是自定义的。如果使用jsoncallback,服务端必须返回一个与jsoncallback的值对应的对象。
//jsonpCallback:"回调",
data: {code:code}, //将本页面获取到的code传给后台,以便后台获取openid
超时: 5000,
success: 函数(结果){
回调(结果);
},
error: 函数(jqXHR, textStatus, errorThrown) {
警报(文本状态); }
});
后端代码
$code=$_GET["code"];//前端传递过来的code值
$appid="wx468622291a1e99d6";
$appsecret="98566dc38863aa4395fabebb0de6ecc1";//获取openid
$url="https://api.weixin.qq.com/sns/oauth2/access_token?appid=$appidsecret=$appsecretcode=$codegrant_type=authorization_code";
$结果=https_request($url);
$jsoninfo=json_decode($结果, true);
$openid=$jsoninfo["openid"];//从返回的json结果中读取openid
$access_token=$jsoninfo["access_token"];//从返回的json结果中读取openid
$callback=$_GET["回调"]; //echo $callback."({result:"".$openid.""})";
$url1="https://api.weixin.qq.com/sns/userinfo?access_token=$access_tokenopenid=$openidlang=zh_CN";
$result1=https_request($url1);
$jsoninfo1=json_decode($result1, true);
$昵称=$jsoninfo1["昵称"];
echo $openid.":".$access_token.":".$nickname; //将openid发送回前端
函数https_request($url,$data=null){
$curl=curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
如果(!空($数据)){
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
}
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$输出=curl_exec($curl);
卷曲_关闭($卷曲);
返回$输出;
}
好了,关于优化后的文章标题和的问题到这里结束啦,希望可以解决您的问题哈!
【优化后的文章标题】相关文章:
2.米颠拜石
3.王羲之临池学书
8.郑板桥轶事十则
用户评论
终于有了关于微信公众号开发OAuth2.0的小教程了!
有17位网友表示赞同!
想自己搭建一个与公众号交互的网页应用,这就有用了。
有8位网友表示赞同!
这样用户就能直接使用微信账户登录我的APP了吗?
有15位网友表示赞同!
原来公众平台里还可以实现网页授权认证呀,挺有用的。
有14位网友表示赞同!
我平时也有在做一些公众号相关的项目,这篇文章刚好能用上。
有19位网友表示赞同!
文章讲解清晰易懂吗?我最近正好需要学习这个功能。
有19位网友表示赞同!
OAuth2.0认证看起来比较复杂啊,这种教程能帮助我理解吗?
有12位网友表示赞同!
期待看到更多关于网页授权认证的实际应用案例。
有8位网友表示赞同!
希望能详细讲解一下OAuth2.0的流程步骤,方便小白学习。
有14位网友表示赞同!
这样用户就能在网页端访问微信的数据了吗?
有16位网友表示赞同!
学习完这个教程,是不是就可以开发自己的自定义登录系统了呢?
有7位网友表示赞同!
如果想使用第三方平台提供的API来实现OAuth2.0认证,需要怎么做呀?
有17位网友表示赞同!
这篇文章会不会针对一些常用的编程语言或者框架进行讲解呢?
有12位网友表示赞同!
微信公众平台的发展真是让人赞赏,功能越来越丰富了。
有18位网友表示赞同!
这样的教程可以帮助我们更好地利用微信的资源开发应用。
有10位网友表示赞同!
希望未来还有更多专业的教程分享给我们学习。
有9位网友表示赞同!
这个OAuth2.0认证的功能对安全性有什么保障吗?
有14位网友表示赞同!