民间,
跟踪访问部门内部RESTful API服务的消费者应用程序的最简单方法是什么。 我们不限制访问 - 没有身份验证/授权 - 为调用,可信环境打开。 没有像OAuth AuthZ服务器或API管理这样的工具......但可能会在某个时候前往那里。
目前我们曾想过要求消费者只包含一些自定义的HTTP标头,如X-Client-Id,并将其记录在服务器端以获取统计信息等。 但是知道将来我们可能希望转向更标准的做事方式......将来更换代码的最佳方法是什么?
任何想法都将不胜感激
答案 0 :(得分:0)
我们最近为我们的一个REST平台实现了这个,我们使用了你提到的两个点的组合,这意味着授权标题& JWT令牌。虽然,JWT仅用于身份验证和获取access_token(oauth令牌),后来用于调用实际资源apis。我将讨论如何处理这种情况,你可以决定如何实现它。
1)身份验证
客户端将JWT发送到您的身份验证服务(/ api / oauth2 / auth)。 (如果你想更多地阅读JWT,你可以阅读谷歌如何实现JWT的here和here以及如何使用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作为访问令牌是否有任何约束力?