共识
首先我们应该达成一定的共识
- 作为对外提供服务的开放平台,首先需要的是被服务方在开放平台进行注册,只有注册过的调用方才能调用我开放平台的服务
- 开放平台提供多种服务,开发平台内部系统包罗万象,所以通常情况下,内部服务器不直接对外,都是通过网关系统或者前置机
- 本文主要介绍的是spring cloud oauth、security相关知识,apache oltu等其他oauth框架本文不涉及
必备知识
- OAUTH 2.0 协议 参考文档 理解OAuth 2.0
业务流程(举例:调用微信创建菜单接口)
下面我们举例的业务流程是其实是介绍的OAUTH2.0协议中客户端授权模式来介绍的,这点应该首先有个概念
首先需要去微信公众号注册一个帐号,开发者模式会为我们提供一个clientId和clientSecert,我们拿这个clientId和clientSecert去获取access_token,调用具体创建菜单接口的时候把获取到的access_token带上,否则无权调用接口会被拒绝
项目结构
- microservice-common 模块是存放公共组建,比如工具类、共用接口、domain等
- microservice-eureka-server 模块是服务注册中心
- microservice-oauth 是授权中心
- microservice-order-service 是订单中心(具体的服务)
- microservice-sleuth-server 是代码追踪服务
- microservice-zuul-server 模块是网关,所有的服务通过网管对外提供服务
microservice-oauth 和 microservice-zuul-server 是本次介绍的重点。microservice-zuul-server 我们可以理解为开放平台
microservice-oauth 授权、鉴权
调用方在开放平台进行注册,以及获取access_token 对于授权中心来说一定要进行存储吧,很多网上的例子都是把这些数据存储在内存里面,我觉得这种例子就没必要介绍了,一是网上有很多,二是没有实际意义,这里我们把数据存储在MYSQL数据库中。其实如果可以存储在redis里面更好,原因有二,一是读取效率更高,二是redis可以和网关模块共享。
-
建表语句 MYSQL OAUTH SCHEMA
上述建表语句中有一些字段类型是LONGVARBINARY,这里我们把他调整为BLOB,因为MYSQL没有LONGVARBINARY这种类型 -
授权中心会对外提供两个接口,一个是/oauth/token 获取access_token接口,一个是/oauth/check_token接口,用于检查检查token是否是授权过的。代码分别在TokenEndpoint.java 和 CheckTokenEndpoint.java中
microservice-zuul-server
这个是一个网关模块,网关要做的事情很多,通常情况下可以做这些事
- 服务鉴权 当然是通过调用microservice-oauth模块进行验证的,怎么做?spring-security-oauth的jar包里面有个Filter叫OAuth2AuthenticationProcessingFilter已经帮我们做好了,我们所要做的就是告诉它,调用我们microservice-oauth提供服务的地址是什么就可以
- 流量控制 微信公众号还有一些其他类似的社交开放平台翻了下文档,它没有做并发控制,只是对具体接口做了限额
- 接口限额
- 其他
microservice-sleuth-server
这个是做代码调用追踪的,可以看到具体的调用链路,调用次数等信息,这里spring cloud是集成了zipkin来做的,大概可以看到如下的效果
但是呢,这里有一点点的小问题,问题是什么呢?
上面我说zuul会有一个拦截器,他会取我们调用接口里面是否包含access_token,并通过http调用我们的鉴权服务器进行验证,但是对于zipkin来说,通过网关去访问我们具体的业务,而其中的filter不属于这个调用链
权限验证业务流程
总结
以上就是我个人认为一个对外接口或者说是开放平台的基本流程和功能,如果是我的话,我会以上面介绍的这种方式来进行扩展,不当之处还请兄弟姐妹们指正,轻点拍砖