首页 > PHP资讯 > 工具库 > Force.com微信开发系列OAuth2.0网页授权

Force.com微信开发系列OAuth2.0网页授权

工具库
OAuth是一个开放协议,允许用户让第三方应用以安全且标准的方式获取该用户在某一网站上存储的私密资源(如用户个人信息、照片、视频、联系人列表),而无须将用户名和密码提供给第三方应用。本文将详细介绍OAuth协议以及在微信里的具体实现。

OAuth2.0协议介绍

OAuth2.0是OAuth协议的下一版本,但不向后兼容OAuth 1.0。 OAuth 2.0关注客户端开发者的简易性,同时为Web应用,桌面应用和手机,和起居室设备提供专门的认证流程。 OAuth2.0允许用户提供一个令牌,而不是用户名和密码来访问他们存放在特定服务提供者的数据。每一个令牌授权一个特定的网站(例如,视频编辑网站)在特定的时段(例如,接下来的2小时内)内访问特定的资源(例如仅仅是某一相册中的视频)。这样,OAuth允许用户授权第三方网站访问他们存储在另外的服务提供者上的信息,而不需要分享他们的访问许可或他们数据的所有内容。

OAuth2.0认证和授权的具体过程:

在Oauth2.0认证和授权的过程中涉及的三方包括:

1. 服务提供方,用户使用服务提供方来存储受保护的资源,如照片,视频,联系人列表。

2. 用户,存放在服务提供方的受保护的资源的拥有者。

3. 客户端,要访问服务提供方资源的第三方应用,通常是网站,如提供照片打印服务的网站。在认证过程之前,客户端要向服务提供者申请客户端标识。

使用OAuth进行认证和授权的过程如下所示:

1. 用户访问客户端的网站,想操作用户存放在服务提供方的资源;

2. 客户端向服务提供方请求一个临时令牌;

3. 服务提供方验证客户端的身份后,授予一个临时令牌;

4. 客户端获得临时令牌后,将用户引导至服务提供方的授权页面请求用户授权。在这个过程中将临时令牌和客户端的回调连接发送给服务提供方;

5. 用户在服务提供方的网页上输入用户名和密码,然后授权该客户端访问所请求的资源;

6. 授权成功后,服务提供方引导用户返回客户端的网页;

7. 客户端根据临时令牌从服务提供方那里获取访问令牌;

8. 服务提供方根据临时令牌和用户的授权情况授予客户端访问令牌;

9. 客户端使用获取的访问令牌访问存放在服务提供方上的受保护的资源。


微信网页OAuth2.0授权:

如果用户在微信中(Web微信除外)访问公众号的第三方网页,公众号开发者可以通过此接口获取当前用户基本信息(包括昵称、性别、城市、国家)。利用用户信息,可以实现体验优化、用户来源统计、帐号绑定、用户身份鉴权等功能。

需要注意的是,获取用户基本信息接口(稍后博文会介绍到)是在用户和公众号产生消息交互时,才能根据用户OpenID获取用户基本信息,而网页授权的方式获取用户基本信息,则无需消息交互,只是用户进入到公众号的网页,就可弹出请求用户授权的界面,用户授权后,就可获得其基本信息(此过程甚至不需要用户已经关注公众号。)

下面我们将通过一个具体的例子来展示开发的详细过程。

配置授权回调域名:

在微信公众号请求用户网页授权之前,开发者需要先到公众平台网站的我的服务页中配置授权回调名,需要注意的是这里的域名不要加http://或者https://。另外,授权回调域名配置规范为全域名,比如需要网页授权的域名为:www.qq.com,配置以后此域名下的所有页面例如 无法进行OAuth2.0鉴权。

为此进入到服务页(使用正式的服务号或认证后的订阅号后通过我的服务找到,如果是测试账号直接在首页即可找到)后找到OAuth2.0网页授权,点击右侧的修改链接:

在该类中添加代码如下:

public class oauth2testcontroller {     public String code {get; set;}     public oauth2testcontroller(){         code = ApexPages.currentPage().getParameters().get('code');         if(String.isBlank(code)){             code = 'No Code';         }     } }


这段代码中第2行定义了一个公开属性code,第4行通过ApexPages对象获得URL中的code参数,并接着判断是否code值是否为空,如果为空则提示No Code。下面我们会看到微信授权成功回调此URL时会将code参数添加到URL中。

接下来略微修改前台页面,在页面中显示得到的code值:

       {!code}  

{!对象名}是Force.com Visualforce page里用来显示对象值的语法,接下来我们需要配置该页面能够通过公网进行访问,为此登陆Force.com后,进入Setup –> Develop –> Sites,点击站点对应的Site Label标签如下图:

将URL直接输入到浏览器地址栏即可得到返回数据,当然真实场景里更多通过后台代码来请求,正确返回时的JSON数据包如下:

{   "access_token":"ACCESS_TOKEN",   "expires_in":7200,   "refresh_token":"REFRESH_TOKEN",   "openid":"OPENID",   "scope":"SCOPE"}

参数的具体说明如下:

正确时返回的JSON数据包如下:

{   "access_token":"ACCESS_TOKEN",   "expires_in":7200,   "refresh_token":"REFRESH_TOKEN",   "openid":"OPENID",   "scope":"SCOPE"}

数据包的具体定义如下:

错误时微信会返回JSON数据包如下(示例为Code无效错误):

{"errcode":40029,"errmsg":"invalid code"}

更多Force.com微信开发系列OAuth2.0网页授权相关文章请关注PHP中文网!

工具库

本文由欣才IT学院整理发布,未经许可,禁止转载。
支持25不支持0