首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Oauth2的授权码模式《上》

Oauth2的授权码模式《上》

作者头像
程序猿Damon
发布2020-05-25 16:29:22
8970
发布2020-05-25 16:29:22
举报
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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-04-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 交个朋友之猿天地 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 2、Oauth2 的授权码模式
    • 2.1 回忆
      • 2.2 授权码模式下的高可用
        • 结束福利
        • 关于作者
    相关产品与服务
    访问管理
    访问管理(Cloud Access Management,CAM)可以帮助您安全、便捷地管理对腾讯云服务和资源的访问。您可以使用CAM创建子用户、用户组和角色,并通过策略控制其访问范围。CAM支持用户和角色SSO能力,您可以根据具体管理场景针对性设置企业内用户和腾讯云的互通能力。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档