开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第14天,点击查看活动详情
前期背景
因业务需求,现需要将服务A接口和第三方的接口整合封装,对外开放仅限授权使用。此方式可以称为代理服务接口,用户无需在意对接服务A内部对接何种接口,仅需关心需要什么数据并通过代理服务接口获取。合并封装最终目的主要实现。将提供对外开放接口统一一个入口,且用户仅可接入访问授权后的接口。技术上通过NodeJs实现。
用途
****将第三方接口合并,并统一提供对外的接口地址。
目标
- 接口安全,如token安全机制
- 实现绝对的兼容
- 可配置授权
接口对比
| 服务A 提供接口 | 服务A 对接接口 | |
|---|---|---|
| 请求Header | Authorization 字段生成规则:JWT通过调用接口获取token | Token 字段生成规则:JWT生成一个token[1] |
| 请求方式 | GET | GET |
| 请求参数 | 支持分页:pageNo=1&pageSize=10过滤条件Filter自定义排序扩展属性 | Id:支持分页:p=1&s=10search="" |
| 返回结果 |
将部分接口进行对比,然后抽象出一层新的接口参数,但是需要主要由标识让后端服务识别服务的目标。这样后端服务才能更好的将服务进行转发。
接口认证使用 JWT 认证。由同一接口提供者签发认证凭证给用户,然后用户通过唯一的凭证生成 token 。后续所有的接口都需要携带 token 进行请求否则将不进行访问。
使用凭证是为了后续扩展将接口设计成可以授权的方式,即授权用户可访问的接口。
使用 Node 生成 token的方式:
let secret = Buffer.from(JWT_SECRET_, 'base64');
let token = jwt.sign({}, secret, { algorithm: 'HS512', jwtid: apiConfig.JWT_ID_YJ });
let args = {
headers: {
'Content-Type': 'application/json',
'Token': token
},
data: datas
};
认证时序图设计
整体就是由接口系统完成用户请求的认证,然后再将其转发到具体的目标服务。其实真正还是无法抽象所有的接口,最终就是相当于称为一层网关设计一样,完成网关该有的工作。