关于OAuth2.0 Authorization Code + PKCE flow在原生客户端(Native App)下集成的一点思考

写在前面
前几天看了园友的一篇文章被广泛使用的OAuth2.0的密码模式已经废了,放弃吧 被再次提起: Implicit Flow Password Grant,均已被标记为Legacy,且OAuth2.1里面已经删除了,目前OAuth2.1只剩三种flow:
- Authorization Code+ PKCE
- Client Credentials
- Device Code
作为完美踩坑Implicit 和 Password 两种flow的人,有点感慨,特来发表下自己的愚见;
并带着以下问题:
- 在SPA(单页面应用程序Vue等)中不再用Implicit flow,还能用什么?
- 在Native App和小程序等Public Client中不再用Password flow,还能用什么?
Implicit 和 Password 的问题
以下均为个人理解,不保证全对
Implicit的问题
- 1、比较容易泄露access_token(下文简称token), 比如有的开发者条件不允许,web 服务用http的协议直接上生产(正确是一定要用https);
- 2、token直接暴露在请求里,如果token权限不控制好的话用户能轻而易举调用不该有权限的接口;
解决方案:
改为用 :Authorization Code + PKCE
Password的问题
园友已经说的很清楚了我总结下;
- 1、最大的问题就是违背了委托授权的原则,比如我的Web服务用微信登录用的Password flow的话,那意思是需要在我的登录页面里面填写微信的账号和密码,这眼见的不可思议和不合理吧;
我个人看法:
虽然目前OAuth2最佳实践中已经明确要求不能使用这种模式,但是 原有已经使用是这种模式的自有App还是可以接着使用的 没有问题;因为自有App和自有授权中心没有需要授权,是一起的;
如果是新开发App呢,还是优先考虑:Authorization Code + PKCE,毕竟Password已经是过时的流程了;
思考Authorization Code+ PKCE在Native App使用的问题
先回顾Authorization code Flow
(图来自)
回顾流程和请求
我这里是web服务,用的是SPA的客户端,授权服务用的是IdentityServer4;
假设授权服务是:https://localhost:44356/ 客户端是:https://localhost:44357/
- A、先判断登录、未登录先引导用户去授权服务器授权(一般是打开授权方登录页面);
判断登录
登录页面
- C、登录成功返回Authorization code;
登录成功回调
- D、通过code去授权中心token endpoint换取token;
ok,以上流程后拿到token后面的请求Resource Owner就没问题了。
Authorization code Flow在Native App中使用有何问题
首先是Authorization code流程里面的,code参数传递通过重定向的方式,在原生App里一般这样重定向一般有两种方式:
- 1、是绑定URL Scheme通过类似app-name://?code=的方法把code传递给原生客户端;
- 2、在本地起个HTTP服务器通过http://localhost:port/?code=的方法监听code
这两种方式都有被第三方恶意应用占用URL Scheme或者localhost端口截取code的风险。
另一个问题是,Authorization code code换取token的时候需要app_secret这些;
所以引出我们的PKCE流程;
Authorization Code**+ **PKCE在Native App中使用

PKCE在这篇文章里面已经讲得很清楚了,我简单总结下:
上文我们已经清楚,Authorization code(简称code)流程里面的,code传递给原生App的两种方式都不安全,那么引出PKCE的概念:
PKCE
全称Proof Key for Code Exchange,直译:用一个Proof key来做Code交换;
解决的问题是,既然你可以拦截我的Authorization code,那我再加一个我有,你没有的参数(等于是票据、验证凭据)做code交换条件就行;
PKCE步骤为:
- 1、先随机生成一串字符串叫
code_verifier; - 2、用
code_challenge_method方法(sha256等)把code_verifier加密成code_challenge; - 3、把
code_challenge和code_challenge_method来发起授权请求,生成关联这两项值的code; - 4、用code和
code_verifier去换取token; - 5、授权服务器返回token,和refresh token(app这个很重要);
我们可以看到,因为我们的code已经关联code_challenge和code_challenge_method,即时攻击者拦截了也没用了,因为你没有code_verifier,你同样换不到token;;
最后,可以看到整个PKCE流程设计精妙,已经解决了Code传参问题;
总结
有了PKCE, 在Native App中使用Code传参的话直接用原先的方式:
- 1、是绑定URL Scheme通过类似app-name://?code=的方法把code传递给原生客户端;
- 2、在本地起个HTTP服务器通过http://localhost:port/?code=的方法监听code
传递code就行;
另外还有一种方式,直接在Native App里面嵌入Webview来传递,在携带code重定向这个步骤,拦截重定向url,获取code,换取token;
现在我看到很多App都是这样做的;
水完,over.
参考
https://www.cnblogs.com/felordcn/p/16011138.html
https://www.cnblogs.com/myshowtime/p/15555538.html
https://medium.com/oauth-2/why-you-should-stop-using-the-oauth-implicit-grant-2436ced1c926
关于OAuth2.0 Authorization Code + PKCE flow在原生客户端(Native App)下集成的一点思考的更多相关文章
- [转]OAuth 2.0 - Authorization Code授权方式详解
本文转自:http://www.cnblogs.com/highend/archive/2012/07/06/oautn2_authorization_code.html I:OAuth 2.0 开发 ...
- OAuth 2.0 - Authorization Code授权方式详解
I:OAuth 2.0 开发前期准备 天上不会自然掉馅饼让你轻松地去访问到人家资源服务器里面的用户数据资源,所以你需要做的前期开发准备工作就是把AppKey, AppSecret取到手 新浪获取传送门 ...
- OAuth2.0和企业内部统一登录,token验证方式,OAuth2.0的 Authorization code grant 和 Implicit grant区别
统一登录是个很多应用系统都要考虑的问题,多个项目的话最好前期进行统一设计,否则后面改造兼容很麻烦: cas认证的方式:新公司都是老项目,用的是cas认证的方式,比较重而且依赖较多,winform的项目 ...
- 被广泛使用的OAuth2.0的密码模式已经废了,放弃吧
最近一直有同学在问,OAuth2密码模式为啥Spring Security还没有实现,就连新的Spring Authorization Server也没有这个玩意儿. 其实这里可以告诉大家,OAuth ...
- OAuth2.0学习(1-3)OAuth2.0的参与者和流程
OAuth(开放授权)是一个开放标准.允许第三方网站在用户授权的前提下访问在用户在服务商那里存储的各种信息.而这种授权无需将用户提供用户名和密码提供给该第三方网站. OAuth允许用户提供一个令牌给第 ...
- 使用微服务架构思想,设计部署OAuth2.0授权认证框架
1,授权认证与微服务架构 1.1,由不同团队合作引发的授权认证问题 去年的时候,公司开发一款新产品,但人手不够,将B/S系统的Web开发外包,外包团队使用Vue.js框架,调用我们的WebAPI,但是 ...
- OAuth2.0标准类库汇总
转载官网: https://oauth.net/code/ https://www.w3cschool.cn/oauth2/5ghz1jab.html 服务端类库 .NET .NET DotNetOp ...
- API代理网关和OAuth2.0授权认证框架
API代理网关和OAuth2.0授权认证框架 https://www.cnblogs.com/bluedoctor/p/8967951.html 1,授权认证与微服务架构 1.1,由不同团队合作引发的 ...
- 基于OAuth2.0的统一身份认证中心设计
1. 引言 公司经历多年发展后,在内部存在多套信息系统,每套信息系统的作用各不相同,每套系统也都拥有自己独立的账号密码权限体系,这时,每个人员都需要记住不同系统的账号密码,人员入职和离职时,人事部门都 ...
随机推荐
- 微服务技术栈简单介绍,Eureka和Ribbon的引入和使用
一.了解微服务架构 1.微服务技术栈 整体框架 整体学习规划路线2.微服务与单体架构的区别 单体架构:将业务的所有功能集中在一个项目中开发,打成一个包部署 优势 结构简单 部署成本低 缺点 耦合度高, ...
- 类中的__getattr__ 与 __setattr__ 魔法方法
1.__getattr__ 当我们访问一个不存在的属性的时候,会抛出异常,提示我们不存在这个属性.而这个异常就是__getattr__方法抛出的,其原因在于他是访问一个不存在的属性的最后落脚点,作为异 ...
- 正则表达式以及re模块的使用
内容概要 正则表达式简介 字符组 特殊符号 量词 贪婪匹配与非贪婪匹配 取消转义 正则表达式简介 '''正则表达式是一门语言,如果想在python中使用,需要导入re模块''' # 什么是正则表达式? ...
- Solution -「UR #2」「UOJ #32」跳蚤公路
\(\mathcal{Description}\) Link. 给定一个 \(n\) 个点 \(m\) 条边的带权有向图,每条边还有属性 \(s\in\{-1,0,1\}\).对于每个 \(u ...
- Solution -「CF 1361E」James and the Chase
\(\mathcal{Description}\) Link. 给定 \(n\) 个点 \(m\) 条边的有向弱连通图.称一个点是"好点"当且仅当从该点出发,不存在到同一点 ...
- 替代Tableau,思迈特软件Smartbi让Excel成为企业级自助分析平台
谈到企业级自助分析平台,大家自然会想到Tableau,在Garnter最新的BI平台魔力象限中,是这么描述Tableau的. "Tableau is a Leader in this ...
- 什么是闭包?(python)
闭包,又称闭包函数或闭合函数,和嵌套函数类似.不同之处在于,闭包函数的外部函数返回的不是一个具体的值,而是一个函数.一般情况下,返回的函数会赋值给一个变量,便于反复调用. def outer(out) ...
- linux 下面启动nginx 和关闭nginx
linux 下面启动nginx 和关闭nginx, 查看linux 开放的所有端口netstat -ntpl,重启服务命令 :service network restart 1 进入到安装的目录里面 ...
- 微信小程序里实现跑马灯效果
在微信小程序 里实现跑马灯效果,类似滚动字幕或者滚动广告之类的,使用简单的CSS样式控制,没用到JS wxml: <!-- 复制的跑马灯效果 --> <view class=&quo ...
- Pandas:各种错误
1.输出为CSV文件时,Permission denied 原因可能是: (1).构建DataFrame时没有写index参数 (2).用Dict构建最开始的数据时,value没有写成List的形式, ...
