6

tinyurl や bit.ly と同様のサービスを実装しています。サービスを API として公開したいと考えています。Java と jersey を RESTfull サービスの実装として使用しています。

API を使用するユーザーを認証するための最も簡単な方法を探しています。OAuth が最初に頭に浮かびますが、問題は、コールバック URL を渡すアクセス トークン クエリよりも、リクエスト トークン クエリを使用したこの 3 回の反復呼び出しが必要ないことです。サーバーへの追加のセキュリティ呼び出しなしで、ユーザーが API を呼び出すことができるようにする必要があるだけです。

4

2 に答える 2

11

patrickmcgraw のコメントのおかげで、私は 2-legged oauth authentificaton を使用しました。ここにいくつかのJavaコードがあります。

クライアント側の場合 (Jersey API を使用):

OAuthParameters params = new OAuthParameters().signatureMethod("HMAC-SHA1").
    consumerKey("consumerKey").version("1.1");

OAuthSecrets secrets = new OAuthSecrets().consumerSecret("secretKey");
OAuthClientFilter filter = new OAuthClientFilter(client().getProviders(), params, secrets);


WebResource webResource = resource();
webResource.addFilter(filter);

String responseMsg = webResource.path("oauth").get(String.class);

プロバイダー側​​:

@Path("oauth")
public class OAuthService {
    @GET
    @Produces("text/html")
    public String secretService(@Context HttpContext httpContext) {
        OAuthServerRequest request = new OAuthServerRequest(httpContext.getRequest());

        OAuthParameters params = new OAuthParameters();
        params.readRequest(request);
        OAuthSecrets secrets = new OAuthSecrets().consumerSecret("secretKey");

        try {
            if(!OAuthSignature.verify(request, params, secrets)) 
                return "false";
        } catch (OAuthSignatureException ose) {
            return "false";
        }

        return "OK";
    }
}

PHP クライアントのコードは次のとおりです。

<?php 

require_once 'oauth.php';

$key = 'consumerKey';
$secret = 'secretKey';
$consumer = new OAuthConsumer($key, $secret);

$api_endpoint = 'http://localhost:9998/oauth';
$sig_method = new OAuthSignatureMethod_HMAC_SHA1;

$parameters = null;
$req = OAuthRequest::from_consumer_and_token($consumer, null, "GET", $api_endpoint, $parameters);
$sig_method = new OAuthSignatureMethod_HMAC_SHA1();
$req->sign_request($sig_method, $consumer, null);//note: double entry of token

//get data using signed url
$ch = curl_init($req->to_url());
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$res = curl_exec($ch);

echo $res;
curl_close($ch);
于 2010-05-09T18:34:57.327 に答える
0

トランスポート層で http を使用している場合は、常に基本的な http 認証を使用できます

于 2010-05-08T22:33:08.143 に答える