在企业级应用中,将服务拆分解耦是很常见的,所以也就有了服务器间调用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
这样,各业务就不能冒用标识了。