在上一篇 Oauth2 的认证实战-HA 篇 中,我们说过 Oauth2 的高可用方案,但其实其场景仅仅在于密码模式下,如果是授权码模式下,将有点瑕疵,甚至需要配置其他的 hosts 来进行处理。
我们先回忆下,上一篇中如何做到 HA 的:首先各个客户端配置中配置了的认证中心是用域名的,也就是说通过服务发现来实现多个认证中心可以同时存在,并且通过 redis 来存储 token,达到共享的目的。其次,在配置中注意:加了"loadBalanced: true",另外在调用各个客户端时,我们通过网关来进行负载均衡的:"http://localhost:5555/provider-service/api/user/**",这样才能达到高可用的目的。
在授权码模式下,在 postman 或其他工具输入:
localhost:5555/oauth-cas/oauth/authorize?response_type=code&client_id=provider-service&redirect_uri=http://provider-service/login&scope=all
发现会被拦截到登陆页:
大家注意看,其地址是经过负载均衡后解析的地址。在输入用户名、密码后,发现:
重定向到地址的前缀跟上面的登陆页一样,而且未带有 code 参数属性,这一点让我百思不得其解,需要后面的解析,谢谢。
但通过单机版的测试:
http://localhost:2000/oauth/authorize?response_type=code&client_id=provider-service&redirect_uri=http://provider-service/login&scope=all
输入地址后,发现出现了鉴权的确认页:
在点击 Approve、Authorize 后,输入用户名、密码,跳转到上面的重定向地址,并带有 code 属性参数:
http://provider-service/login?code=UW0OJ2
curl -i -X POST -d "grant_type=authorization_code&code=UW0OJ2&client_id=provider-service&client_secret=provider-service-123&redirect_uri=http://localhost:2001/login" http://localhost:2000/oauth/token
返回信息:
{"access_token":"a2af3f0b-27da-41b8-90c0-3bd2a1ed0421","token_type":"bearer","refresh_token":"91c22287-aa24-4305-95cf-38f7903865f3","expires_in":3283,"scope":"all"}
有几种方式:一、头部携带,二、直接 get 方式传 token
方法一:
curl -i -H "Accept: application/json" -H "Authorization:bearer a2af3f0b-27da-41b8-90c0-3bd2a1ed0421" -X GET http://localhost:2001/api/user/getCurrentUser
方法二:
http://localhost:2001/api/user/getCurrentUser?access_token=a2af3f0b-27da-41b8-90c0-3bd2a1ed0421
通过上面的 "refresh_token" 来刷新获取新 token:
curl -i -X POST -d "grant_type=refresh_token&refresh_token=91c22287-aa24-4305-95cf-38f7903865f3&client_id=provider-service&client_secret=provider-service-123" http://localhost:2000/oauth/token
curl -i -H "Accept: application/json" -H "Authorization:bearer fafcc3c8-28f5-4ce6-87df-e7f929fa6a34" -X DELETE http://localhost:5555/oauth-cas/api/logout
或者
curl -i -H "Accept: application/json" -H "Authorization:bearer 1297adc1-962f-4014-a63a-02d3c3683be6" -X DELETE http://localhost:2000/api/logout
开源实战利用 k8s 作微服务的架构设计代码:https://gitee.com/damon_one/spring-cloud-oauth2
,欢迎大家 star,多多指教。
笔名:Damon,技术爱好者,长期从事 Java 开发、Spring Cloud 的微服务架构设计,以及结合 docker、k8s 做微服务容器化,自动化部署等一站式项目部署、落地。Go 语言学习,k8s 研究,边缘计算框架 KubeEdge 等。公众号 程序猿Damon
发起人。个人微信 MrNull008
,欢迎來撩。
欢迎关注 InfoQ: https://www.infoq.cn/profile/1905020/following/user