2011-02-10 134 views
2

我想通过api(http://zootool.com/api/docs/add)用java将页面添加到我的zootool页面。为此,我需要使用摘要式身份验证。zootool api授权

一个PHP的例子给出了获得页面的授权:

<?php 

$username = 'username'; 
$password = 'password'; 
$api_url = 'http://zootool.com/api/users/items/?username=' 
        . $username . '&apikey=###'; 

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, $api_url); 

// HTTP Digest Authentication 
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_DIGEST); 
curl_setopt($ch, CURLOPT_USERPWD, strtolower($username) . ':' . sha1($password)); 

curl_setopt($ch, CURLOPT_USERAGENT, 'My PHP Script'); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 

$result = curl_exec($ch); 
curl_close($ch); 

$data = json_decode($result, true); 

print_r($data); 

?> 

但是这是怎么用Java语言写在网页中加入?搜索后,我发现Apache公用程序HttpClient可能是有用的,但我似乎无法绕过它。

我想:

String url = "http://zootool.com/api/add/?url=http://www.google.com 
         &title=Google&apikey=###"; 
    DigestScheme authscheme = new DigestScheme(); 

    HttpClient httpclient = new DefaultHttpClient(); 
    HttpGet httpget = new HttpGet(url); 
    HttpResponse authResponse = httpclient.execute(httpget); 

    Header challenge = authResponse.getHeaders("WWW-Authenticate")[0]; 

    authscheme.processChallenge(challenge); 

    Header solution = authscheme.authenticate(
      new UsernamePasswordCredentials("username", "password"), 
      new BasicHttpRequest(HttpPost.METHOD_NAME, 
      new URL(url).getPath())); 


    HttpResponse goodResponse = httpclient.execute(httpget); 

我试图SH1哈希密码,但没有运气(如API-手册上规定)。看来我的代码无法找到任何响应的挑战。

Api-key,用户名和密码都是正确的。

UPDATE 我现在比较确定我需要使用抢先式摘要授权,但是在尝试使用由apache给出的解决方法时,我仍然得到401和“身份验证错误:摘要授权挑战预期,但未找到” - 来自java的警告。我使用的代码是:

HttpHost targetHost = new HttpHost("www.zootool.com", 80, "http"); 

DefaultHttpClient httpclient = new DefaultHttpClient(); 
try { 
    httpclient.getCredentialsProvider().setCredentials(
       new AuthScope(AuthScope.ANY_HOST, AuthScope.ANY_PORT), 
       new UsernamePasswordCredentials("username", "sha1-password")); 

    // Create AuthCache instance 
    AuthCache authCache = new BasicAuthCache(); 
    // Generate DIGEST scheme object, initialize it and add it to the local 
    // auth cache 
    DigestScheme digestAuth = new DigestScheme(); 
    // Suppose we already know the realm name 
    digestAuth.overrideParamter("realm", "www.zootool.com"); 
    // Suppose we already know the expected nonce value 
    digestAuth.overrideParamter("nonce", "something"); 
    authCache.put(targetHost, digestAuth); 

    // Add AuthCache to the execution context 
    BasicHttpContext localcontext = new BasicHttpContext(); 
    localcontext.setAttribute(ClientContext.AUTH_CACHE, authCache); 


    HttpGet httpget = new HttpGet("/api/add/?url=http://www.google.com&title=Google&apikey=###"); 

    System.out.println("executing request: " + httpget.getRequestLine()); 
    System.out.println("to target: " + targetHost); 

    for (int i = 0; i < 3; i++) { 
     HttpResponse response = httpclient.execute(targetHost, httpget, localcontext); 
     HttpEntity entity = response.getEntity(); 

     System.out.println("----------------------------------------"); 
     System.out.println(response.getStatusLine()); 
     if (entity != null) { 
      System.out.println("Response content length: " + entity.getContentLength()); 
      } 
     EntityUtils.consume(entity); 
    } 

} finally { 
    // When HttpClient instance is no longer needed, 
    // shut down the connection manager to ensure 
    // immediate deallocation of all system resources 
    httpclient.getConnectionManager().shutdown(); 
    } 
} 

我是否必须为DigestScheme参数提供有意义的值? 我是否在正确的轨道上?

/André

回答

0

抢先授权码有效!错误是,必须将login = true添加到api url中,如下所示:

HttpGet httpget = new HttpGet("/api/add/?url=http://www.google.com&title=Google&apikey=####&login=true"); 

此信息在api手册中不可用。