服务器间API通信时的身份验证

在企业级应用中,将服务拆分解耦是很常见的,所以也就有了服务器间调用API的场景。

一般会将提供基础能力的服务独立部署,然后前端业务应用通过API去调用这些基础能力。由于前端业务应用和基础服务一般是多对一的关系,故在调用API的时候,前端业务应用需要标识身份,以便基础服务能够针对性地提供服务。

设定个场景

先具象化的设定一个场景,后面比较容易说清楚:

服务S提供了一个短信发送的API,即调用此服务可以实现给指定号码发送短信。有A、B、C业务应用会使用这个服务,且服务S需要知道哪些业务调用了它。

这个服务的API调用方式是通过HTTP的GET方式:(不要吐槽这个,这是确实可行的)

http://service.domain.com/sms?
  number=17012345678&
  content=helloworld

简单的方式

如果A、B、C和S在同一个私网内,且API访问仅限此网内,A、B、C也均可信可控,那么根本不用麻烦,只要加上一个标识参数告知S即可。看起来就像这样:

http://service.domain.com/sms?
  number=17012345678&
  content=helloworld&
  appId=appNameA

使用Token

如果业务部门比较分散,导致A、B、C并不完全可信,不排除会出现B使用A的appId的这类冒名的情况。

那么S可以给A、B、C分别预先生成一个Token,要求在请求时一并发送,并会校验appId和token是否匹配。看起来就像这样:

http://service.domain.com/sms?
  number=17012345678&
  content=helloworld&
  appId=appNameA&
  token=0UW2m6Cpu9JdrM4muXHVBTOQMb4MG9nJ

这样,各业务就不能冒用标识了。

阅读全文→