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 等关键字可以查看更多关键字对应的文章。

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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值