跟踪消费者的RESTful API(无身份验证)

时间:2013-12-29 20:43:34

标签: rest oauth consumer

民间,

跟踪访问部门内部RESTful API服务的消费者应用程序的最简单方法是什么。 我们不限制访问 - 没有身份验证/授权 - 为调用,可信环境打开。 没有像OAuth AuthZ服务器或API管理这样的工具......但可能会在某个时候前往那里。

目前我们曾想过要求消费者只包含一些自定义的HTTP标头,如X-Client-Id,并将其记录在服务器端以获取统计信息等。 但是知道将来我们可能希望转向更标准的做事方式......将来更换代码的最佳方法是什么?

  • 在授权中使用“clientId”:OAuth令牌(如访问令牌)
  • 在Authorization标题中有JWT令牌(看起来太多了 - 签名,基础64等用于简单的客户端ID跟踪...)

任何想法都将不胜感激

2 个答案:

答案 0 :(得分:0)

我们最近为我们的一个REST平台实现了这个,我们使用了你提到的两个点的组合,这意味着授权标题& JWT令牌。虽然,JWT仅用于身份验证和获取access_token(oauth令牌),后来用于调用实际资源apis。我将讨论如何处理这种情况,你可以决定如何实现它。

1)身份验证

客户端将JWT发送到您的身份验证服务(/ api / oauth2 / auth)。 (如果你想更多地阅读JWT,你可以阅读谷歌如何实现JWT的herehere以及如何使用spring-security-jwt libary来处理所有的签名和加密/解密)。在解密和验证签名后,您从JWT获得“clientId”,并且在服务器执行所有身份验证之后,您将使用“refresh_token”和“access_token”进行回复。服务器也将保存access_token并将其映射到clientId,以便当客户端使用access_token发出请求时,您可以知道哪个客户端正在发出请求。 access_token在一段时间内到期(理想情况下是一小时),当它到期时,客户端使用'refresh_token'通过将refresh_token发布到某个刷新令牌url(/ api / oauth2 / auth / token)来获取新的访问令牌

2)授权

客户端接受'access_token'并使用访问令牌在所有其他api(/ api / *)上发出所有后续请求。理想情况下,access_token作为“授权”标头的一部分发送。服务器使用请求过滤器(如果您使用的是JAX-RS,则可以使用类似ContainerFilterRequest的方法将过滤器添加到特定的URL模式并拦截它们)来过滤EACH请求并解析出Authorization标头值。您将从头部获取access_token,并从access_token获取您在步骤1中映射的clientId。您可以在安全过滤器中执行其他授权逻辑,如果一切都通过,您可以使用此信息来记录clientId和客户端发出的请求。

这样你就可以一石二鸟:实施一个安全层&记录有关客户的信息(他们正在拨打什么电话,多少时间等等)。如果您还不想实现安全过滤器(正如您在将来提到的那样),那么现在,客户端可以直接传递“clientId”(base64encoded与否,由您决定)作为“授权”标题。如果所有呼叫都来自“可信”网络,那么它应该没问题,尽管不是那么安全。这样,当您实际实现基于JWT和Oauth的安全层时,您所要做的就是更改ContainerFilterRequest逻辑以解析access_token而不是客户端ID(如步骤2中所述)。

我希望这有帮助!有关安全过滤器的更多信息,您可以查看以下答案:Basic Authentication of a resource in Dropwizard。它说dropwizard,但它主要谈论JAX-RS。

答案 1 :(得分:0)

为消费者跟踪实施完整的AuthN / AuthZ层现在是一种过度杀伤力。 我们考虑使用Authorzation标头来传递自定义client_id标记:

  Authorization: Custom  <Client_Id>

或使用某些有限版本的JWT(没有签名,因为没有意图验证它们) 作为访问令牌

  Authorization: JWT <JWT>

JWT可能是:

{"alg":"none","typ":"JWT"}
{
   "iss":"Client_ID",
   "aud": REST Service URI,
   "iat":1328550785
}

我没有在规范http://tools.ietf.org/search/draft-ietf-oauth-v2-23#section-1.4

中看到access_token格式的描述

使用JWT作为访问令牌是否有任何约束力?