Oauth2的授权码模式《上》

本文探讨OAuth2授权码模式的高可用性。在密码模式下实现HA的方案不适用于授权码模式,因为授权码模式的重定向过程涉及到负载均衡后的地址问题。文章通过实例分析了授权码获取、携带token获取用户信息以及刷新token的过程,并提到了相关实战项目的开源代码。

点击上方蓝色字体,关注我们

1、 前言



 

在上一篇 Oauth2 的认证实战-HA 篇 中,我们说过 Oauth2 的高可用方案,但其实其场景仅仅在于密码模式下,如果是授权码模式下,将有点瑕疵,甚至需要配置其他的 hosts 来进行处理。



 

2、Oauth2 的授权码模式



 

2.1 回忆

我们先回忆下,上一篇中如何做到 HA 的:首先各个客户端配置中配置了的认证中心是用域名的,也就是说通过服务发现来实现多个认证中心可以同时存在,并且通过 redis 来存储 token,达到共享的目的。其次,在配置中注意:加了"loadBalanced: true",另外在调用各个客户端时,我们通过网关来进行负载均衡的:"http://localhost:5555/provider-service/api/user/**",这样才能达到高可用的目的。

 

2.2 授权码模式下的高可用

 
  1. 获取授权码

在授权码模式下,在 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
 
  1. 根据 code 获取 access_token

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"}
 
  1. 拿到 token 获取用户信息

有几种方式:一、头部携带,二、直接 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
 
  1. 刷新 token

通过上面的 "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
 
  1. 退出

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

 

个人网站:技术分享博客

往期回顾

微服务自动化部署CI/CD

ArrayList、LinkedList 你真的了解吗?

Oauth2的认证实战-HA篇

微服务架构设计之解耦合

面试被问 Spring cloud 上下文,可以这样回答

Spring Cloud 诸多形式组件,你都知道吗?

浅谈 Java 集合 | 底层源码解析

基于 Sentinel 作熔断 | 文末赠资料

基础设施服务k8s快速部署之HA篇

今天被问微服务,这几点,让面试官刮目相看

Spring cloud 之多种方式限流(实战)

Spring cloud 之熔断机制(实战)

面试被问finally 和 return,到底谁先执行?

Springcloud Oauth2 HA篇

Spring Cloud Kubernetes之实战一配置管理

Spring Cloud Kubernetes之实战二服务注册与发现

Spring Cloud Kubernetes之实战三网关Gateway

求关注

关注公众号,回复入群,获取更多惊喜!公众号(程序猿Damon)里回复 ES、Flink、Java、Kafka、MQ、ML、监控、大数据、k8s 等关键字可以查看更多关键字对应的文章。

如有收获,点个在看,谢谢

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值