验证与授权

在进行人人网开放平台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