四大门户 (Sina, Sohu, 163, QQ) 微博 API 的 OAuth 认证测试

在开放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是非标准实现,所以说规范都是标准实现的日子才是好日子啊! 🙁

 

四大门户 (Sina, Sohu, 163, QQ) 微博 API 的 OAuth 认证测试》上有5条评论

  1. Tale

    楼主你好,我在测试api时到输入verifier就有点搞不懂了,不知道这个是什么东西,做啥用的,格式是如何,求解~~~

    1. Neal Mi 文章作者

      按照OAuth的规范,在用户授权之后,会返回类似如下的参数:
      oauth_token=8ldIZyxQeVrFZXFOZH5tAwj6vzJYuLQpl0WUEYtWc&oauth_verifier=pDNg57prOHapMbhv25RNf75lVRd6JDsni1AJJIDYoTY
      OAuth的客户端再通过oauth_token和oauth_verifier等参数去获得真正AccessToken

      一般OAuth都封装了该操作,直接调用即可。

      1. Tale

        上网搜啊搜,在雅虎api上也找到了相关的东西,verifier是用户授权后取得的,并与requestToken一起用于获取AccessToken,
        但是用Scribe-Java提供的example貌似少了用户授权的过程,verifer是手动输入的。
        最近在搭建OAuth服务器,OAuth源码看得快晕过去了,里面提供的示例比较简单,好像也没有涉及到verifer,云山雾罩的~~苦13啊~~

        1. Neal Mi 文章作者

          Scribe-Java示例使用得oob模式认证,也就是通常桌面模式使用得,当用户授权之后,会在网页上显示一个verifier,然后手动输入到示例运行的控制台里,之后程序再获得accesstoken。

          1. Tale

            原来如此,多谢楼主耐心的回复~ 好难得啊

评论已关闭。