上次说道,我目前在做的一个项目,用的是基于一个叫open-cloud的微服务框架。(微服务框架open-cloud应用及部署)
该框架基于SpringCloud,认证使用oAuth2。见官方网站。虽然这个框架是几年前出来的,目前已经没有维护了,但对于我来说,仍然是学习的对象。
我目前在做的项目,包含几个子系统,很自然的,需要用到单点登录。前面说到,open-cloud使用的是oAuth2的认证方式,但又可以细分为几种模式:
1)密码模式
输入账号口令,提交到 /oauth/token,返回token
2)授权码模式
打开子应用系统页面,发现未登录,则子应用系统会引导到uaa(open-cloud中负责认证的子系统),如:
http://localhost:8211/oauth/authorize?response_type=code&client_id=1553588629729&redirect_uri=http://www.baidu.com
然后uaa响应,输出一个login页面。uaa是一个前后端不分,自带页面的子系统。

输入账号,口令后,提交到uaa后,uaa返回到应用子系统。
3)客户端模式(client_credentials)
没用到,略过不提。
在我们项目中,前2种方式都用了,大部分子系统用第一种,另外一个子系统属于拿现成系统修改集成,它用的是第二种。那么,如何进行单点登录呢?
很简单,只要大家使用相同的appId,apiKey,secretKey就可以了。框架自然就实现了单点登录。比如用第一种模式页面进行了登录,那么打开那个集成子系统,会发现它也已经登录。

第一种模式的配置
exports.auth = {
appId: "1666247793941",
appKey: "b9y6VrLFeBcRRr1rWfZnP7x4",
appSecret: "pWB0wbsndaQVH61Q15bZ8mJ6RLJcRolK",
};
第二种模式的配置
#oauth2客户端配置
security:
oauth2:
client:
client-id: b9y6VrLFeBcRRr1rWfZnP7x4
client-secret: pWB0wbsndaQVH61Q15bZ8mJ6RLJcRolK
access-token-uri: http://192.168.10.8:8212/oauth/token
user-authorization-uri: http://192.168.10.8:8212/oauth/authorize
resource:
token-info-uri: http://192.168.10.8:8212/oauth/check_token
而且,并不需要大家指向同一个uaa。uaa是open-cloud的认证中心,我在测试的时候,部署了2个uaa,分处于不同的服务器,IP完全不一样,但这并不影响各子系统使用单点登录。可以推测系统产生的token,不是存在数据库,就是存在redis。事实证明,服务器端产生的token保存于redis,登录以后,将redis的数据清掉,子系统将会登出。
由此也可知,open-cloud提供的后台,有一个菜单项叫“应用管理”,那像我这种情况,应该是整个项目,不管有多少个子系统,都应该是同一个应用系统,而不是每个子系统定义一个应用。
