SIDEBAR
»
S
I
D
E
B
A
R
«
四大门户 (Sina, Sohu, 163, QQ) 微博 API 的 OAuth 认证测试
三 12th, 2011 by Neal Mi

在开放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,我就不提了,无奈~ :cry:

所有的微博都模仿的 Twitter ,所有的API都是使用OAuth标准,由此可见,模仿是一会儿事儿,模仿成啥样是另一会儿事儿;标准是一回事儿,实现又是另一会事儿。

标准什么时候都要规范实现,不规范不行,你想想,你写了段完美的代码实现了标准,下了班约了朋友,吃着火锅还唱着歌,突然你就想起来TMD某某平台的API是非标准实现,所以说规范都是标准实现的日子才是好日子啊! :-(

 

开放的API,不负责任的接口实现
三 9th, 2011 by Neal Mi

最近看看了几个微博的 API 接口,一看全都是 OAuth 标准,很开心,本以为标准么,按照规范实现就可以适用于各个微博的接口。

可是后来发现我太天真了,我完全高估了他们。

举一个简单的例子,OAuth认证标准流程:

我使用很著名的 Scribe( https://github.com/fernandezpablo85/scribe-java),因为他的架构很好,用起来很方便,当我写完Sina的 API 之后,测试很好,正常运行。接下来我就同样的写了网易微博和腾讯微博的 API,测试时发现都有问题,仔细查了下官方的文档后,我不明白了,既然都决定使用 OAuth 规范了,为什么总要搞点小特殊,和标准不兼容,是故意的,还是根本没能力实现?既然开放,麻烦做一个负责任的接口。

网易的Web认证和桌面认证居然用了两个接口(我很无语…)

腾讯的桌面认证callback居然用了一个字符串 null (继续无奈…)

以下摘自 OAuth 1.0 (http://tools.ietf.org/html/rfc5849)规范:

oauth_callback:  An absolute URI back to which the server will
                    redirect the resource owner when the Resource Owner
                    Authorization step (Section 2.2) is completed.  If
                    the client is unable to receive callbacks or a
                    callback URI has been established via other means,
                    the parameter value MUST be set to "oob" (case
                    sensitive), to indicate an out-of-band
                    configuration.

 

SIDEBAR
»
S
I
D
E
B
A
R
«
»  Substance:WordPress   »  Style:Ahren Ahimsa
© 沉默前行