在开放API如此火热的时代,我经过一段时间研究,测试了很多的API,发现真是良莠不齐啊,以四大门户微博的 OAuth 认证部分来测试这些 API 的现状。
我使用 Scribe-Java 类库来测试,因为这个类库是最接近我理想中的类库,简单,易用,架构良好。下面贴出 Sina 的 API 实现和测试(使用Scribe-Java)的代码
新浪微博:
符合OAuth规范,使用 Scribe-Java 类库5分钟内可以完成测试。
API实现:
package org.scribe.builder.api;
import org.scribe.model.Token;
public class SinaMicroBlogApi extends DefaultApi10a {
private static final String AUTHORIZATION_URL = "http://api.t.sina.com.cn/oauth/authorize?oauth_token=%s";
@Override
public String getRequestTokenEndpoint() {
return "http://api.t.sina.com.cn/oauth/request_token";
}
@Override
public String getAccessTokenEndpoint() {
return "http://api.t.sina.com.cn/oauth/access_token";
}
@Override
public String getAuthorizationUrl(Token requestToken) {
return String.format(AUTHORIZATION_URL, requestToken.getToken());
}
}
API测试
package org.scribe.examples;
import java.util.Scanner;
import org.scribe.builder.*;
import org.scribe.builder.api.*;
import org.scribe.model.*;
import org.scribe.oauth.*;
public class SinaMicroBlogExample {
private static final String PROTECTED_RESOURCE_URL = "http://api.t.sina.com.cn/statuses/friends_timeline.xml";
public static void main(String[] args) {
OAuthService service = new ServiceBuilder()
.provider(SinaMicroBlogApi.class).apiKey("")
.apiSecret("").build();
Scanner in = new Scanner(System.in);
System.out.println("=== Sina's OAuth Workflow ===");
System.out.println();
// Obtain the Request Token
System.out.println("Fetching the Request Token...");
Token requestToken = service.getRequestToken();
System.out.println("Got the Request Token!");
System.out.println();
System.out.println("Now go and authorize Scribe here:");
System.out.println(service.getAuthorizationUrl(requestToken));
System.out.println("And paste the verifier here");
System.out.print(">>");
Verifier verifier = new Verifier(in.nextLine());
System.out.println();
// Trade the Request Token and Verfier for the Access Token
System.out.println("Trading the Request Token for an Access Token...");
Token accessToken = service.getAccessToken(requestToken, verifier);
System.out.println("Got the Access Token!");
System.out.println("(if your curious it looks like this: "
+ accessToken + " )");
System.out.println();
// Now let's go and ask for a protected resource!
System.out.println("Now we're going to access a protected resource...");
OAuthRequest request = new OAuthRequest(Verb.GET,
PROTECTED_RESOURCE_URL);
service.signRequest(accessToken, request);
Response response = request.send();
System.out.println("Got it! Lets see what we found...");
System.out.println();
System.out.println(response.getBody());
System.out.println();
System.out
.println("Thats it man! Go and build something awesome with Scribe!
");
}
}
搜狐微博:
符合OAuth规范,使用 Scribe-Java 类库5分钟内可以完成测试。
网易微博:
让我很纠结,就是把桌面认证和WEB认证使用了两个地址,Scribe-Java 类库只能支持一个地址。所以…
UPDATE:
网易的认证过程,在第二步用户授权之后没有callback的支持,而在第三步获取 AccessToken 的时候不需要 Veryfier。
没有单独发送带图片的微博的接口,而是首先通过接口上传图片,然后将获得图片链接附在消息后发出。
腾讯微博:
到目前为止,我没能测试通过,首先他是不支持Header认证,也就是说,只能使用GET的查询字符串或者POST的formparam来传递认证参数,其次它是把OAuth标准的 oob 改成 null字符串,在我修改了Scribe-Java之后,遇到了签名错误,目前没有找到原因,暂时我不打算研究他的API了。
UPDATE:我这边签名错误的原因是:Scribe-Java每次请求默认会加入callback参数参与签名,而腾讯大概是有什么特殊处理吧。不得而知。
腾讯官方的说法是:某些开源类库与其API不兼容,却不反省下自己为什么连个简单OAuth标准的都实现成这样,难道是故意的?
其实还有其他的API,我就不提了,无奈~ 
所有的微博都模仿的 Twitter ,所有的API都是使用OAuth标准,由此可见,模仿是一会儿事儿,模仿成啥样是另一会儿事儿;标准是一回事儿,实现又是另一会事儿。
标准什么时候都要规范实现,不规范不行,你想想,你写了段完美的代码实现了标准,下了班约了朋友,吃着火锅还唱着歌,突然你就想起来TMD某某平台的API是非标准实现,所以说规范都是标准实现的日子才是好日子啊!