<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>润物无声 &#187; OAuth</title>
	<atom:link href="http://blog.zhourunsheng.com/tag/oauth/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.zhourunsheng.com</link>
	<description>天空一朵雨做的云</description>
	<lastBuildDate>Sat, 08 May 2021 05:17:21 +0000</lastBuildDate>
	<language>zh-CN</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.1.41</generator>
	<item>
		<title>人人网的 OAuth2.0 认证实现</title>
		<link>http://blog.zhourunsheng.com/2011/07/%e4%ba%ba%e4%ba%ba%e7%bd%91%e7%9a%84-oauth2-0-%e8%ae%a4%e8%af%81%e5%ae%9e%e7%8e%b0/</link>
		<comments>http://blog.zhourunsheng.com/2011/07/%e4%ba%ba%e4%ba%ba%e7%bd%91%e7%9a%84-oauth2-0-%e8%ae%a4%e8%af%81%e5%ae%9e%e7%8e%b0/#comments</comments>
		<pubDate>Sat, 02 Jul 2011 10:58:59 +0000</pubDate>
		<dc:creator><![CDATA[润物无声]]></dc:creator>
				<category><![CDATA[程序设计]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[OAuth]]></category>

		<guid isPermaLink="false">http://blog.zhourunsheng.com/?p=288</guid>
		<description><![CDATA[<p>现在貌似只有人人网最开始使用了OAuth2.0的认证，估计后续这些SNS站点都开始实现了，相比较OAuth1. [&#8230;]</p>
<p><a rel="nofollow" href="http://blog.zhourunsheng.com/2011/07/%e4%ba%ba%e4%ba%ba%e7%bd%91%e7%9a%84-oauth2-0-%e8%ae%a4%e8%af%81%e5%ae%9e%e7%8e%b0/">人人网的 OAuth2.0 认证实现</a>，首发于<a rel="nofollow" href="http://blog.zhourunsheng.com">润物无声</a>。</p>
]]></description>
				<content:encoded><![CDATA[<p>现在貌似只有人人网最开始使用了OAuth2.0的认证，估计后续这些SNS站点都开始实现了，相比较OAuth1.0来看，2.0的认证过程确实方便了很多。</p>
<p>OAuth2.0 认证流程：</p>
<p><a href="http://blog.zhourunsheng.com/wp-content/uploads/2011/07/renren-oauth20.jpg"><img class="alignnone size-full wp-image-289" title="renren-oauth20" src="http://blog.zhourunsheng.com/wp-content/uploads/2011/07/renren-oauth20.jpg" alt="" width="500" height="278" /></a></p>
<p><span id="more-288"></span></p>
<p>Java代码实现：</p>
<pre>package com.carey.renren.example;  
import java.io.UnsupportedEncodingException;
import java.net.URI;
import java.net.URLEncoder;
import java.util.Scanner;
import java.util.TreeMap;  
import com.carey.renren.RenRenHttpClient;
import com.carey.renren.RenRenOAuth;
import com.carey.renren.utils.RenRenHttpUtil;  

public class RenRenMain {      
 public static void main(String[] args) {        
    renrenRequest();    
 }      

 private static void renrenRequest() {        
  if (!java.awt.Desktop.isDesktopSupported()) {            
     System.err.println("Desktop is not supported (fatal)");            
     System.exit(1);        
  }          

  java.awt.Desktop desktop = java.awt.Desktop.getDesktop();          
  if (desktop == null || !desktop.isSupported(java.awt.Desktop.Action.BROWSE)) {            
      System.err.println("Desktop doesn't support the browse action");            
      System.exit(1);        
  }                  

  getAuthorizationCode(desktop);        
  //  界面返回：        
  //  &lt;a href="http://graph.renren.com/oauth/login_success.html?code=ki2wk30AHg18KLWvriLA1rlf9tAUd1Um"&gt;http://graph.renren.com/oauth/login_success.html?code=ki2wk30AHg18KLWvriLA1rlf9tAUd1Um&lt;/a&gt;                 

  getAccessToken(desktop);        
  // 界面返回：        
  //  {         //  "access_token": "143511|5.57d2ad88cdd22398c03a2fcbb3bbd229.86400.1306422000-1167553647",        
  // "expires_in": 88680,        
  // "scope": "email status_update publish_feed"        
  // }                  

  getSessionToken(desktop);        
  // 界面返回：        
  //{"renren_token":{"session_secret":"ca076de790d8fc2470cb7b9da2c936f9","expires_in":88667,        
  // "session_key":"5.57d2ad88cdd22398c03a2fcbb3bbd229.86400.1306422000-1167553647"},        
  // "oauth_token":"143511|5.57d2ad88cdd22398c03a2fcbb3bbd229.86400.1306422000-1167553647","user":{"id":1167553647}}

  testAPI();        
  //  获取用户基本信息，输出结果为：        
  // [{"uid":1167553647,"tinyurl":"&lt;a href="http://hd34.xiaonei.com/photos/hd34/20080322/13/30/tiny_22p107.jpg","vip":1,"sex":1"&gt;http://hd34.xiaonei.com/photos/hd34/20080322/13/30/tiny_22p107.jpg","vip":1,"sex":1&lt;/a&gt;,  
  //  "name":"周润生","star":1,"headurl":"&lt;a href="http://hd34.xiaonei.com/photos/hd34/20080322/13/30/head_22p107.jpg","zidou":0"&gt;http://hd34.xiaonei.com/photos/hd34/20080322/13/30/head_22p107.jpg","zidou":0&lt;/a&gt;}]
 }          

 private static void getAuthorizationCode(java.awt.Desktop desktop) {        
  System.out.println("get Authorization Code......");                  
  try {            
   String urlStr = RenRenOAuth.AuthorizationURL + "?" + "client_id="  + RenRenOAuth.APIKey + "&amp;" + "response_type=code"
    + "&amp;redirect_uri=" + RenRenOAuth.RedirectURL;            
   System.out.println("authorization url: n" + urlStr);              
   desktop.browse(new URI(urlStr));        
  } catch (Exception e) {            
   e.printStackTrace();        
  }    
 }  

 private static void getAccessToken(java.awt.Desktop desktop) {        
  System.out.println("get Access Token......");          
        System.out.println("Input your Authorization code：");       
  Scanner in = new Scanner(System.in);        
  String input = in.nextLine();          

  try {           
   String urlStr = RenRenOAuth.OAuthURL + "?" + "client_id=" + RenRenOAuth.APIKey + "&amp;client_secret=" + RenRenOAuth.SecretKey + "&amp;redirect_uri="    
    + RenRenOAuth.RedirectURL  + "&amp;grant_type=authorization_code" + "&amp;code=" + input;            
   System.out.println("access url: n" + urlStr);              
   desktop.browse(new URI(urlStr));        
  } catch (Exception e) {
   e.printStackTrace();
  }   
 }     

 private static void getSessionToken(java.awt.Desktop desktop) {
  System.out.println("get Session Token......");
  System.out.println("Input your Access token："); 
  Scanner in = new Scanner(System.in);       
  String input = in.nextLine();                 

  try {            
   input = URLEncoder.encode(input, "UTF-8");       
  } catch (UnsupportedEncodingException e1) {            
   e1.printStackTrace();        
  }          

  try {            
   String urlStr = RenRenOAuth.SessionURL + "?" + "oauth_token=" + input;            
   System.out.println("session url: n" + urlStr);              
   desktop.browse(new URI(urlStr));        
  } catch (Exception e) {            
   e.printStackTrace();        
  }    
 }          

 private static void testAPI() {        
  System.out.println("Input your Session Token：");        
  //Scanner in = new Scanner(System.in);        
  //String input = in.nextLine();                  
  String input = "5.57d2ad88cdd22398c03a2fcbb3bbd229.86400.1306422000-1167553647";                  
  TreeMap params = new TreeMap();        
  params.put("session_key", input);        

  //params.put("method", "friends.get");                  
  params.put("method", "users.getInfo");        
  params.put("uids", "1167553647");                  
  String content = sendPostRestRequest(params, "JSON", RenRenOAuth.ApiUrl);        
  if (content.indexOf("error_code") &gt;= 0) {            
   //error        
  }        

  System.out.println(content);    
 }          

 public static String sendPostRestRequest(TreeMap params, String format, String url) {       
  RenRenHttpUtil.prepareParams(params, format);        
  String content = RenRenHttpClient.doPost(url, params);        
  return content;    
 }
}</pre>
<p>上面代码的实现过程和OAuth2.0的认证流程相互一致，其他主要功能函数实现如下：</p>
<pre>//初始化公共的Http请求参数
public static TreeMap prepareParams(TreeMap params, String format) {    
 params.put("api_key", RenRenOAuth.APIKey);    
 params.put("v", RenRenOAuth.ApiVersion);    
 params.put("call_id", String.valueOf(System.currentTimeMillis()));    
 params.put("format", format);     
 return sigParams(params);
}</pre>
<pre> //进行参数的签名
public static TreeMap sigParams(TreeMap params) {    
 StringBuffer sb = new StringBuffer();    
 for (Iterator&gt; iterator = params.entrySet().iterator(); iterator.hasNext();) {
  Map.Entry entry = (Map.Entry) iterator.next();        
  sb.append(entry.getKey());        
  sb.append("=");        
  sb.append(entry.getValue());    
 }    

 sb.append(RenRenOAuth.SecretKey);    
 params.put("sig", RenRenHttpUtil.md5(sb.toString()));    
 return params;
}</pre>
<p>程序的源代码：<a href="http://lovertest.googlecode.com/svn/trunk/RenRen4j">http://lovertest.googlecode.com/svn/trunk/RenRen4j</a></p>
<p><a rel="nofollow" href="http://blog.zhourunsheng.com/2011/07/%e4%ba%ba%e4%ba%ba%e7%bd%91%e7%9a%84-oauth2-0-%e8%ae%a4%e8%af%81%e5%ae%9e%e7%8e%b0/">人人网的 OAuth2.0 认证实现</a>，首发于<a rel="nofollow" href="http://blog.zhourunsheng.com">润物无声</a>。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.zhourunsheng.com/2011/07/%e4%ba%ba%e4%ba%ba%e7%bd%91%e7%9a%84-oauth2-0-%e8%ae%a4%e8%af%81%e5%ae%9e%e7%8e%b0/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
