验证与授权
在进行人人网开放平台API调用前,应用必须获得到人人网开放平台和人人网用户的授权,从技术的角度来看获得授权就是获取一个Session Key。
- 人人网开放平台的授权代表在人人网 注册一个应用,获取应用唯一标识API Key和应用私钥Secret Key。
- 人人网用户的授权代表用户授予应用对其资料读写的权限。
获取这两个授权后,应用就可用使用人人网开放平台的验证与授权,来获取一个调用人人网开放平台API的令牌——Session Key。
[编辑] 接口调用
[编辑] 计算签名
为了确保应用与人人网开放平台API服务器之间的安全通信,防止Secret Key盗用、数据篡改等恶意攻击行为,人人API 服务器使用了签名机制。应用在调用人人API之前,需要计算出签名,并追加到请求参数中,参数名为“sig”。签名是由请求参数和应用的私钥Secret Key经过MD5加密后生成的字符串。
签名算法如下所示:
- 将请求参数格式化为“key=value”格式,即“k1=v1”、“k2=v2”、“k3=v3”;
- 将上诉格式化好的参数键值对,以字典序升序排列后,拼接在一起,即“k1=v1k2=v2k3=v3”;
- 在上拼接好的字符串末尾追加上应用的Secret Key;
- 上述字符串的MD5值即为签名的值。
获取签名的java代码demo如下所示:
public String getSignature(List<String> paramList,String secret){ Collections.sort(paramList);//对list进行排序 StringBuffer buffer = new StringBuffer();//类似于string,但是是在内存中操作,对于经常修改的string会更好一些 for (String param : paramList) {//遍历list buffer.append(param); //将参数键值对,以字典序升序排列后,拼接在一起 } buffer.append(secret); //符串末尾追加上应用的Secret Key try { //下面是将拼好的字符串转成MD5值,然后返回 java.security.MessageDigest md = java.security.MessageDigest.getInstance("MD5"); StringBuffer result = new StringBuffer(); try { for (byte b : md.digest(buffer.toString().getBytes("UTF-8"))) { result.append(Integer.toHexString((b & 0xf0) >>> 4)); result.append(Integer.toHexString(b & 0x0f)); } } catch (UnsupportedEncodingException e) { for (byte b : md.digest(buffer.toString().getBytes())) { result.append(Integer.toHexString((b & 0xf0) >>> 4)); result.append(Integer.toHexString(b & 0x0f)); } } return result.toString(); } catch (java.security.NoSuchAlgorithmException ex) { ...... } }发送请求
人人网开放平台API是采用REST基础的接口规范。所有的人人网(http://renren.com) 开放平台API都是通过HTTP POST向人人网开放平台REST API服务器(http://api.renren.com/restserver.do) 发送请求来实现的。几乎所有的计算机语言都可以通过HTTP协议同REST服务器通信。REST服务端支持gzip,这样能降低网络的开销,建议大家加入gzip。
发送请求的java代码demo如下所示:
public static void main(String[] args) throws Exception { long time = System.currentTimeMillis(); String strTime = URLEncoder.encode(String.valueOf(time)); //系统的当前时间,作为call_id的值 String secret = "49617buiyd00404239240f88c8cb3e02"; //应用的Secret Key String apiKey = "eabd87cf9087486e8f7861b57d91a4ee"; //应用的API Key String requestMethod = "users.getEvent"; //接口名称 String v = "1.0"; //API的版本号,请设置成1.0 String sessionKey = "7c8dc0bf83a148bc97bfa804b07a1a10-227967782"; //通过上述验证授权过程得到的Session Key,注意需要URL编码 String fields = "notification_count,tag_request_count"; //请求接口所要求的参数,因接口不同而不同,下面接口列表中点击接口名进入的页面会详细介绍 String url = "http://api.renren.com/restserver.do"; //请求人人网开放平台API服务器的地址 String signature = “wierydkf22334324234”; //上述的签名 PostMethod method = new PostMethod(url); //将以上准备好的参数添加到method对象中 method.addParameter("api_key", apiKey); method.addParameter("method", requestMethod); method.addParameter("call_id", strTime); method.addParameter("v", v); method.addParameter("session_key", sessionKey); method.addParameter("fields", fields); method.addParameter("fangle_types", "all"); method.addParameter("sig", signature); method.addParameter("format", "JSON"); //返回结果的形式,支持XML或者JSON两种形式,默认为XML HttpClient client = new HttpClient(); client.executeMethod(method); String result = method.getResponseBodyAsString(); //返回请求的结果 }
特别注意:在向人人网开放平台Api服务器发送POST请求时,会传入很多参数(参数说明,在下面接口列表中点击接口名进入的页面会详细介绍),格式为key=value,必须对value进行URL编码(UTF-8)才能正确调用,尤其是session_key,如果不编码,服务器无法正确读取,可能会返回session_key无效的错误提示。 url编码如下所示:
1.URL编码的示例代码(java): value = java.net.URLEncoder.encode(value,"UTF-8") 2.Content-Type: header of application/x-www-form-urlencoded