JavaEye api的用户认证

现在的网站越来越流行开放api了,看到java eye的api感觉挺简单的决定用apache的HttpClient试一下,没想到在认证就麻烦不断,经过摸索终于搞定了。后来搜索后发现两种方法论坛都有人做过了,在这就当是总结吧。

方法一:直接添加header验证,这中方式比较简单,代码如下

package apiTest;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.protocol.BasicHttpContext;
import org.apache.http.protocol.HttpContext;

public class Test {

public static void main(String[] args) throws Exception {
DefaultHttpClient httpClient = new DefaultHttpClient();
//get请求
HttpGet httpGet = new HttpGet("http://api.iteye.com/api/auth/verify");
httpGet.addHeader("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Chrome/6.0.472.63 Safari/534.3 JavaEye API Client");
httpGet.addHeader("Authorization", "name:password");
//请求内容
HttpContext httpContext = new BasicHttpContext();

HttpResponse response = httpClient.execute(httpGet,httpContext);
HttpEntity httpEntity = response.getEntity();
StringBuffer sb = new StringBuffer();
InputStream is = httpEntity.getContent();
BufferedReader br = new BufferedReader(new InputStreamReader(is, "utf-8"));
String str = "";
while((str=br.readLine()) != null){
sb.append(str);
}
System.out.println("Code:"+response.getStatusLine().getStatusCode());
System.out.println("Content:"+sb.toString());
httpClient.getConnectionManager().shutdown();
}
}

其中name:password是base64encode加密后内容;User-Agent使用模拟的Chrome的,加上了 JavaEye API Client,不模拟一个浏览器会被认为是网络爬虫抓取;

方法二:使用HttpClient的验证方式

package apiTest;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

import org.apache.http.HttpEntity;
import org.apache.http.HttpException;
import org.apache.http.HttpHost;
import org.apache.http.HttpRequest;
import org.apache.http.HttpRequestInterceptor;
import org.apache.http.HttpResponse;
import org.apache.http.auth.AuthScheme;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.AuthState;
import org.apache.http.auth.Credentials;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.protocol.ClientContext;
import org.apache.http.impl.auth.BasicScheme;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.protocol.BasicHttpContext;
import org.apache.http.protocol.ExecutionContext;
import org.apache.http.protocol.HttpContext;

public class Test {

public static void main(String[] args) throws Exception {
DefaultHttpClient httpClient = new DefaultHttpClient();
//认证
httpClient.getCredentialsProvider().setCredentials(new AuthScope(AuthScope.ANY_HOST,AuthScope.ANY_PORT), new UsernamePasswordCredentials("username", "password"));
//get请求
HttpGet httpGet = new HttpGet("http://api.iteye.com/api/auth/verify");
httpGet.addHeader("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Chrome/6.0.472.63 Safari/534.3 JavaEye API Client");
//请求内容
HttpContext httpContext = new BasicHttpContext();

BasicScheme basicAuth = new BasicScheme();
httpContext.setAttribute("preemptive-auth", basicAuth);
httpClient.addRequestInterceptor(new HttpRequestInterceptor(){

@Override
public void process(HttpRequest request, HttpContext context)throws HttpException, IOException {
AuthState authState = (AuthState) context.getAttribute(ClientContext.TARGET_AUTH_STATE);

// If no auth scheme avaialble yet, try to initialize it preemptively
if (authState.getAuthScheme() == null) {
AuthScheme authScheme = (AuthScheme) context.getAttribute("preemptive-auth");
CredentialsProvider credsProvider = (CredentialsProvider) context.getAttribute(ClientContext.CREDS_PROVIDER);
HttpHost targetHost = (HttpHost) context.getAttribute(ExecutionContext.HTTP_TARGET_HOST);
if (authScheme != null) {
Credentials creds = credsProvider.getCredentials(new AuthScope(targetHost.getHostName(),targetHost.getPort()));
if (creds == null) {
throw new HttpException("No credentials for preemptive authentication");
}
authState.setAuthScheme(authScheme);
authState.setCredentials(creds);
}
}
}

},0);

HttpResponse response = httpClient.execute(httpGet,httpContext);
HttpEntity httpEntity = response.getEntity();
StringBuffer sb = new StringBuffer();
InputStream is = httpEntity.getContent();
BufferedReader br = new BufferedReader(new InputStreamReader(is, "utf-8"));
String str = "";
while((str=br.readLine()) != null){
sb.append(str);
}
System.out.println("Code:"+response.getStatusLine().getStatusCode());
System.out.println("Content:"+sb.toString());
httpClient.getConnectionManager().shutdown();
}
}


其中的HttpRequestInterceptor直接使用的HttpClient中的例子

用到的jar在apache上都有下载,版本看截图:

[img]http://dl.iteye.com/upload/attachment/324892/8e0e917f-6c5a-3025-9cf3-520797312d57.png[/img]


经过抓包发现两种方法都是在请求中添加了Authorization: username:password
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值