在技术讨论中,有人问我如何编写应用程序在公司内部使用,并将其作为API公开给第三方客户?
我假设这是在Web服务的上下文中。我在想,第三方不会简单地调用终点并消耗响应吗?
很明显,这个答案很粗糙,我没有抓住要点。
- 是否有已知的方法或任何框架可以做到这一点
- 这里的考虑因素是什么?我们如何解决这些问题
您可以以相同的方式为内部和外部用户编写和公开RESTful服务,但当您为外部客户端编写和公开时,您必须注意以下几点
安全性-如果您的API是安全的,那么我们将如何实现这一点?我们可以利用外部身份提供商来保护我们的API,如(Azure AD、Auth0(https://auth0.com))
限制呼叫率-是否要限制来自外部用户的呼叫次数?例如,自由层将仅允许100 req/min等。
注册过程-对于外部用户,您需要注意他们必须如何注册您的服务(获取令牌)才能访问您的服务。
可扩展-您的API应该是可扩展的。
HATEOAS-这是非常重要的REST主体。如果你遵循这种模式,你的外部用户可以通过以下链接以更好的方式探索你的API(https://en.wikipedia.org/wiki/HATEOAS)。
开放式API您的API应该有很好的文档,开放式API(swagger)现在已经成为一种标准(https://swagger.io/specification/)
您可以自己完成所有这些任务,也可以使用任何API管理器来完成这些任务。
实现这一点的一种具体方法是使用使用Json Web令牌(JWT)保护的REST API。在每个REST端点上,可以指定允许调用该端点的角色。
对于您的用例,您可以通过内部调用方的"系统"角色和外部调用方的未授权(即没有角色)来实现这一点。
可以用来实现这一点的框架是MicroProfile JWT,它可能看起来像这样:
@Path("/rank")
@ApplicationScoped
public class RankingService {
@GET
@Path("/{playerId}")
public long getRank(@PathParam("playerId") String id) {
// get the ranking info for a player
// anyone is allowed to do this
}
@POST
@RolesAllowed({ "system" })
@Path("/{playerId}")
public void recordGame(@PathParam("playerId") String id,
@QueryParam("place") int place,
@HeaderParam("Authorization") String token) {
// update player ranking information
// only internal users are allowed to update ranks!
}
}
这是我在会议上发表的一篇演讲的链接,该演讲介绍了使用MicroProfileJWT保护REST端点的过程。