【问题标题】:Authentication and authorization for RESTfull API (java jersery)RESTful API 的认证和授权(java jersey)
【发布时间】:2010-05-10 02:34:57
【问题描述】:

实现与 tinyurl 或 bit.ly 类似的服务,我想将服务公开为 API,我使用 java 和 jersey 作为 RESTfull 服务实现。

我正在寻找最简单的方法来验证使用 API 的用户,首先想到的是 OAuth,但问题是我不需要使用请求令牌查询的这 3 次迭代调用,而不是使用回调的访问令牌查询网址传递。我只需要让用户能够调用 api 而无需对我的服务器进行额外的安全调用。

【问题讨论】:

  • 如果你用谷歌搜索两条腿的 oauth,我想你会发现你可以将它用于你所描述的情况。如果不涉及第三方(对您的服务进行 API 调用的人将拥有他们正在修改的数据),则不需要重定向。在 OAuth 2.0 草案中,通过 SSL 建立的连接也不再需要请求签名。
  • 是的,认为这是最好的方法,它比 http 身份验证更安全,因为您不需要在请求中发送密码。

标签: java security rest oauth jersey


【解决方案1】:

感谢 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);

【讨论】:

    【解决方案2】:

    如果您在传输层使用 http,则始终可以使用 basic http authentication

    【讨论】:

    • 感谢您的回答,但似乎 patrickmcgraw 对两条腿 oauth 的看法是正确的
    猜你喜欢
    • 2013-08-08
    • 2013-07-25
    • 2023-03-23
    • 2012-04-17
    • 1970-01-01
    • 2020-01-12
    • 1970-01-01
    • 2013-09-22
    • 1970-01-01
    相关资源
    最近更新 更多