月挂夜中央

懒惰程序员

常用链接

统计

最新评论

网易微博的OAUTH认证开发(java版)

    网易微博最近也开放了它的开发平台http://open.t.163.com,其中java版的oauth认证和新浪微博的很类似(貌似都是从twitter那边copy过来的)。但说句实话,网易java版的sdk和新浪微博的比起来,的确上手比较麻烦,里面提供的example都是把access token写死,作为参数,具体的代码如下:
public static void main(String[] args){
        
        System.setProperty(
"tblog4j.oauth.consumerKey""EJ0GpH9mtU584qtY");
        System.setProperty(
"tblog4j.oauth.consumerSecret""EgIdvwgF6UXc6WMZs6jTv5ivZcNVDvnT");
        
        TBlog tblog 
= new TBlog();
        
        tblog.setToken(
"46f29fb418bdb14044bf39d2cad49f81""f0c81ad9783f1s427da38312c0cc910c");
        
        
try {
            
            tblog.updateStatus(
"update status from Java SDK");
            
        }
 catch (TBlogException e) {
            e.printStackTrace();
        }

    }
完全没有体现出oauth的完整认证过程,access token(就是46f29fb418bdb14044bf39d2cad49f81,f0c81ad9783f1s427da38312c0cc910c"两段字符串)是怎么来的,完全没有演示的过程,搞得我做这个开发的时候只能摸黑,其实oauth的完整过程是这样的:
OAuth流程图

OAuth流程图

  • A:消费方请求Request Token
  • B:服务提供者授权Request Token
  • C:消费方定向用户到服务提供者
  • D:获得用户授权后,服务提供者定向用户到消费方
  • E:消费方请求Access Token
  • F:服务提供者授权Access Token
  • G:消费方访问受保护的资源

具体的请去围观这篇文章http://huoding.com/2010/10/10/8.

由于开发受阻,只好求助它的兄弟sdk,那就是新浪微博的sdk,但两者虽然相似度很高,但到底在细节处还是有所不同,下面就是我仿造新浪微博网页oauth认证的网易版。
这个过程首先是要在网易开发平台申请消费者开发的key和secret字符串,谁都可以去上面的网易开发平台申请:申请到的画面如下:


然后就可以构造一个jsp的页面,这个页面就是调用oauth认证的,我这个jsp叫call.jsp,具体的jsp代码如下:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding
="ISO-8859-1"%>
<%@ page language="java" import="t4j.*" %>
<%@ page language="java" import="t4j.http.*" %>    
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<%
System.setProperty(
"tblog4j.oauth.consumerKey""EJ0GpH9mtU123xxx");
System.setProperty(
"tblog4j.oauth.consumerSecret""EgIdvwgF6UXc6WMZs6jTv5ivZcxxxxxx");

TBlog tblog 
= new TBlog();
try {
    RequestToken requestToken 
= tblog.getOAuthRequestToken();
    session.setAttribute(
"requestToken",requestToken);
    String url 
= "http://api.t.163.com/oauth/authenticate?oauth_token="+requestToken.getToken()+"&oauth_token_secret="+requestToken.getTokenSecret()+"&oauth_callback=http%3A%2F%2Flocalhost%3A8080%2F163%2Fcallback.jsp";
    
    response.sendRedirect(url);
}
 catch (TBlogException e1) {
    
// TODO Auto-generated catch block
    e1.printStackTrace();
}

%>
</body>
</html>
这个页面就是把申请来的consumerKey和consumerSecret传到一个TBlog对象,这个对象就是网易微博的接口对象了,所有oauth认证以及网易微博的操作api都在这个类中。传递过去后就能够得到request token,同时把requestToken存到session里面,方便后面的页面使用。接下来就是oauth的认证了,需要把requestToken和requestTokenSecret(两个字符串,在requestToken对象中)传递到网易的授权页面,记得带上oauth_callback参数,这个参数是通过认证后网易回调的页面,说明白一点,就是通过认证了,网易就会自己跳回到你oauth_callback里面传递的这个页面。然后就跳到网易的认证页面了。

需要输入网易通行证的用户名和密码,登录后就到了认证的页面了

点击允许后,就会跳回到oauth_callback参数传递的页面,我这个页面就是callback.jsp,代码如下:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding
="ISO-8859-1"%>
<%@ page language="java" import="t4j.*" %>
<%@ page language="java" import="t4j.http.*" %>    
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<%
RequestToken requestToken 
= (RequestToken)session.getAttribute("requestToken");
TBlog tblog 
= new TBlog();
AccessToken token 
= tblog.getOAuthAccessToken(requestToken);
tblog.setToken(token.getToken(),token.getTokenSecret());

try {
    
    out.println(tblog.updateStatus(
"update status from Java SDK").getId());
    
}
 catch (TBlogException e) {
    e.printStackTrace();
}


%>

</body>
</html>
在这个页面就可以去到通过了认证的AccessToken,有了这个,就算是通过了oauth认证,可以操作网易微博的各种资源了。requestToken存在session的意义就是为了在这个页面可以去到,并根据这个requestToken得到AccessToken,如果不经过网易的那个认证页面,直接用requestToken是得不到AccessToken(是的,我试过了直接取,没用的)。上面updateStaus就是发一条微博到网易去。
本来到这边就算完成了,但是如果我们需要通过接口搜索网易微博的内容时,比如这样:
List<Status> list = tblog.searchStatus("情人节");
那么你遇到的就是像一个人的情人节那样可耻的失败,当然上面如果是英语,是不会有问题的,但中文(中国程序员满脸都是泪,心里都是苦),错误代码是这样的:
[Wed Feb 16 21:15:25 CST 2011]Request: 
[Wed Feb 
16 21:15:25 CST 2011]GET http://api.t.163.com/search.json?q=情人节
[Wed Feb 16 21:15:25 CST 2011]OAuth base string:GET&http%3A%2F%2Fapi.t.163.com%2Fsearch.json&oauth_consumer_key%3DEJ0GpH9mtU584qtY%26oauth_nonce%3D1981498615%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1297862125%26oauth_token%3D3d5ec3c98e57d20c40c458bfe6999d66%26oauth_version%3D1.0%26q%3D%25E6%2583%2585%25E4%25BA%25BA%25E8%258A%2582
[Wed Feb 
16 21:15:25 CST 2011]OAuth signature:XMJW2PnNi1TuL1kSkiwCmBbSejA=
[Wed Feb 
16 21:15:25 CST 2011]Authorization: OAuth oauth_consumer_key="EJ0GpH9mtU584qtY",oauth_signature_method="HMAC-SHA1",oauth_timestamp="1297862125",oauth_nonce="1981498615",oauth_version="1.0",oauth_token="3d5ec3c98e57d20c40c458bfe6999d66",oauth_signature="XMJW2PnNi1TuL1kSkiwCmBbSejA%3D"
[Wed Feb 
16 21:15:25 CST 2011]TBlog-Client-URL: http://open.t.163.com
[Wed Feb 16 21:15:25 CST 2011]Accept-Encoding: gzip
[Wed Feb 
16 21:15:25 CST 2011]User-Agent: tblog4j http://open.t.163.com
[Wed Feb 16 21:15:25 CST 2011]TBlog-Client-Version: 1.0
t4j.TBlogException: 
401:Authentication credentials were missing or incorrect.
{"request":"/search.json?q=?é????","error":"oauth_signature=XMJW2PnNi1TuL1kSkiwCmBbSejA= oauth_signature_base_string=GET&http%3A%2F%2Fapi.t.163.com%2Fsearch.json&oauth_consumer_key%3DEJ0GpH9mtU584qtY%26oauth_nonce%3D1981498615%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1297862125%26oauth_token%3D3d5ec3c98e57d20c40c458bfe6999d66%26oauth_version%3D1.0 oauth_problem=signature_invalid oauth_signature_method=HMAC-SHA1","error_code":"401"}

    at t4j.http.HttpClient.httpRequest(HttpClient.java:
572)
[Wed Feb 
16 21:15:25 CST 2011]Response: 
[Wed Feb 
16 21:15:25 CST 2011]HTTP/1.1 401 Unauthorized
[Wed Feb 
16 21:15:25 CST 2011]Content-Language: 
[Wed Feb 
16 21:15:25 CST 2011]Date: Wed, 16 Feb 2011 13:15:33 GMT
[Wed Feb 
16 21:15:25 CST 2011]Transfer-Encoding: chunked
[Wed Feb 
16 21:15:25 CST 2011]Expires: Thu, 01 Jan 1970 00:00:00 GMT
[Wed Feb 
16 21:15:25 CST 2011]Content-Type: application/json;charset=utf-8
[Wed Feb 
16 21:15:25 CST 2011]Connection: keep-alive
[Wed Feb 
16 21:15:25 CST 2011]Server: nginx
[Wed Feb 
16 21:15:25 CST 2011]Pragma: no-cache
[Wed Feb 
16 21:15:25 CST 2011]Cache-Control: no-cache, no-store, max-age=0
[Wed Feb 
16 21:15:25 CST 2011]{"request":"/search.json?q=?é????","error":"oauth_signature=XMJW2PnNi1TuL1kSkiwCmBbSejA= oauth_signature_base_string=GET&http%3A%2F%2Fapi.t.163.com%2Fsearch.json&oauth_consumer_key%3DEJ0GpH9mtU584qtY%26oauth_nonce%3D1981498615%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1297862125%26oauth_token%3D3d5ec3c98e57d20c40c458bfe6999d66%26oauth_version%3D1.0 oauth_problem=signature_invalid oauth_signature_method=HMAC-SHA1","error_code":"401"}

    at t4j.http.HttpClient.httpRequest(HttpClient.java:
514)
    at t4j.http.HttpClient.get(HttpClient.java:
497)
    at t4j.TBlog.get(TBlog.java:
949)
    at t4j.TBlog.searchStatus(TBlog.java:
773)
    at _jsp._callback__jsp._jspService(_callback__jsp.java:
46)
    at com.caucho.jsp.JavaPage.service(JavaPage.java:
61)
    at com.caucho.jsp.Page.pageservice(Page.java:
578)
    at com.caucho.server.dispatch.PageFilterChain.doFilter(PageFilterChain.java:
195)
    at com.caucho.server.webapp.WebAppFilterChain.doFilter(WebAppFilterChain.java:
187)
    at com.caucho.server.dispatch.ServletInvocation.service(ServletInvocation.java:
265)
    at com.caucho.server.http.HttpRequest.handleRequest(HttpRequest.java:
273)
    at com.caucho.server.port.TcpConnection.run(TcpConnection.java:
682)
    at com.caucho.util.ThreadPool$Item.runTasks(ThreadPool.java:
743)
    at com.caucho.util.ThreadPool$Item.run(ThreadPool.java:
662)
    at java.lang.Thread.run(Thread.java:
662)
上面的提示是你的认证没通过,其实完全不是这么回事,你只要把那个搜索语句改一下就得了:
List<Status> list = tblog.searchStatus(java.net.URLEncoder.encode("情人节","UTF-8"));
到此,真的就都OK了,真的希望网易做事能彻底些,这些事其实如果有个好的例子,我也不用摸黑搞了两天。
完整的开发程序的地址在这里:http://dl.dbank.com/c035vpc4d4


我的微博 http://t.sina.com.cn/1401900445

posted on 2011-02-16 21:31 月挂夜中央 阅读(6291) 评论(6)  编辑  收藏 所属分类: java咖啡杯

评论

# re: 网易微博的OAUTH认证开发(java版) 2011-02-17 01:22 http://www.zjsx0575.com

http://www.zjsx0575.com  回复  更多评论   

# re: 网易微博的OAUTH认证开发(java版) 2011-02-17 22:34 玄幻小说吧

上面的提示是你的认证没通过,其实完全不是这么回事,你只要把那个搜索语句改一下就得了  回复  更多评论   

# re: 网易微博的OAUTH认证开发(java版) 2011-02-20 17:02 淘宝商城

网易的微博做得是挺不错,但是娱乐性上不如新浪,上不如腾讯。。。很为其担忧。  回复  更多评论   

# re: 网易微博的OAUTH认证开发(java版) 2011-02-20 19:30 XU

参数最好都使用java.net.URLEncoder.encode转码一下,因为有些特殊字符也需要转。
新浪微博、腾讯微博、网易微博这几家的java客户端程序代码都是抄过来抄过去的。就API稳定性来说,还是网易微博较为给力,可能是用的人少吧。  回复  更多评论   

# re: 网易微博的OAUTH认证开发(java版) 2011-07-28 17:30 zsz

在回调地址那里跟新浪有点不一样,看了你的文章才通过的,顶一个  回复  更多评论   

# re: 网易微博的OAUTH认证开发(java版) 2011-09-22 10:49 weilong_5211314@163.com

System.setProperty("tblog4j.oauth.consumerKey", "EJ0GpH9mtU584qtY");
System.setProperty("tblog4j.oauth.consumerSecret", "EgIdvwgF6UXc6WMZs6jTv5ivZcNVDvnT");


这里的key 、Secret 要怎么申请?  回复  更多评论   


只有注册用户登录后才能发表评论。


网站导航: