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

7187ddb6014070c204c31c1371a226d0.png

Working with Proof Key for Code Exchange (PKCE) - DEV Community

写在前面

前几天看了园友的一篇文章被广泛使用的OAuth2.0的密码模式已经废了,放弃吧  被再次提起:Implicit Flow Password Grant,均已被标记为Legacy,且OAuth2.1里面已经删除了,目前OAuth2.1只剩三种flow:

  • Authorization Code+ PKCE

  • Client Credentials

  • Device Code

作为完美踩坑ImplicitPassword 两种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

bff52eb0625bfd1b752774c5f7524dc7.png

(图来自)

回顾流程和请求

我这里是web服务,用的是SPA的客户端,授权服务用的是IdentityServer4;

假设授权服务是:https://localhost:44356/ 客户端是:https://localhost:44357/

  • A、先判断登录、未登录先引导用户去授权服务器授权(一般是打开授权方登录页面);

判断登录

https://localhost:44356/connect/authorize?client_id=vuejs_code_client&redirect_uri=https%3A%2F%2Flocalhost%3A44357%2Fcallback.html&response_type=code&scope=openid%20profile%20dataEventRecords&state=10f308dbb5d54c01be3b97c495569e8c&code_challenge=gp1EWoH_KsIdL6sGyohEIR6815PcVmz05V_dYvPbafI&code_challenge_method=S256&response_mode=query

登录页面

https://localhost:44356/Account/Login?ReturnUrl=%2Fconnect%2Fauthorize%2Fcallback%3Fclient_id%3Dvuejs_code_client%26redirect_uri%3Dhttps%253A%252F%252Flocalhost%253A44357%252Fcallback.html%26response_type%3Dcode%26scope%3Dopenid%2520profile%2520dataEventRecords%26state%3D10f308dbb5d54c01be3b97c495569e8c%26code_challenge%3Dgp1EWoH_KsIdL6sGyohEIR6815PcVmz05V_dYvPbafI%26code_challenge_method%3DS256%26response_mode%3Dquery

  • C、登录成功返回Authorization code;

登录成功回调

https://localhost:44356/connect/authorize/callback?client_id=vuejs_code_client&redirect_uri=https%3A%2F%2Flocalhost%3A44357%2Fcallback.html&response_type=code&scope=openid%20profile%20dataEventRecords&state=10f308dbb5d54c01be3b97c495569e8c&code_challenge=gp1EWoH_KsIdL6sGyohEIR6815PcVmz05V_dYvPbafI&code_challenge_method=S256&response_mode=query

https://localhost:44357/callback.html?code=C0EF4B31E9F67481019DC51ED3F393264973027E0275644915314ED25F0F95B7&scope=openid%20profile%20dataEventRecords&state=10f308dbb5d54c01be3b97c495569e8c&session_state=j4dyIjlHucHYEHMrli0nBisCinR9Iq9gncp3khniF58.6A5CBF9592729E89570BE9FAC8A962DF

  • D、通过code去授权中心token endpoint换取token;

post 请求 https://localhost:44356/connect/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中使用

cd8492e7ccb8c374292c5fd5b51289a7.png
img

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_challengecode_challenge_method来发起授权请求,生成关联这两项值的code;

  • 4、用code和code_verifier去换取token;

  • 5、授权服务器返回token,和refresh token(app这个很重要);

我们可以看到,因为我们的code已经关联code_challengecode_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

99a04ba2aba8d5e300f828cb3839df5b.png

文章博客园地址请点击“阅读原文”

不给我点个赞再走吗~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/289947.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

详细类库排行榜网址

https://github.com/search?lObjective-C&qstars%3A%3E1&refsearchresults&typeRepositories 转载于:https://www.cnblogs.com/hsxblog/p/4953572.html

贪心算法之用优先队列(priority_queue)实现哈夫曼编码问题

1、问题 参考我的博客:贪心算法之哈夫曼编码问题 2、优先队列知识复习 参考我的博客: C++之STL之priority_queue 3、代码实现 #include <iostream> #include <queue>using namespace std;//最大字符编码数组长度 #define MAXCODELEN 100 //最大哈夫曼节点结…

【经典回放】多种语言系列数据结构算法:希尔排序(C/C#版)

原理&#xff1a;每隔sp&#xff08;整数&#xff09;个数即取数并判断大小&#xff0c;交换&#xff0c;先构造局部有序序列&#xff0c;直到sp为1&#xff0c;构造完整的有序序列。 给出一组数据&#xff0c;如下&#xff1a; 0 1 2 3 4 5 6 7 8 9 49 38 65 97 …

extjs 文件加载、解析流程

extjs版本&#xff1a;4.2.1在html中添加应用的启动脚本&#xff0c;如下&#xff1a;<script src"app.js"></script>2. 用户访问html的时候&#xff0c;会去加载app.js文件&#xff0c;app中定义了应用的名字&#xff0c;根路径等信息&#xff0c;并且调…

【131天】尚学堂高淇Java300集视频精华笔记(65-66)

第65集&#xff1a;常用类Date类的使用JDk源码分析 Date时间类&#xff08;java.util.Date&#xff09; 在标准Java类库中包含一个Date类。它的对象表示一个特定的瞬间&#xff0c;精确到毫秒。 Date()分配一个Date对象&#xff0c;并初始化此对象为当前的日期和时间精确到毫秒…

ArcGIS 10.2加载在线影像底图

两种方法&#xff1a; 一、File→ArcGIS Online→影像图→Open。 二、 效果&#xff1a;

分治算法之二分搜索

1、问题 一天晚上,我们在家里看电视,某大型娱乐节目在玩猜数游戏。主持人在女嘉宾的手心上写一个 10 以内的整数,让女嘉宾的老公猜是多少,而女嘉宾只能提示大了,还是小了,并且只有 3 次机会。主持人悄悄地在美女手心写了一个 8。老公:“2。”老婆:“小了。”老公:“3…

都说不要装箱,那装箱到底带来了什么开销?

相信很有朋友在面试时大多会被问到 装箱 的问题&#xff0c;也是一个经典的问题&#xff0c;可深可浅&#xff0c;那今天我们就从 汇编 和 内存 角度进行统一解读下。为了方便演示&#xff0c;先上一段装箱的代码。class Program{static void Main(string[] args){var i 10;va…

Java中方法的继承以及父类未被子类覆盖的方法调用的问题

在看java继承这一块的时候发现了一个问题&#xff0c;即父类未被子类覆盖的方法是如何调用的&#xff1f; 是子类拥有了父类的该方法只是没有显示表示&#xff0c;还是子类调用了父类的该方法。 为此做了一下验证 代码如下&#xff1a; public class One {protected void print…

数据结构实验之栈四:括号匹配

数据结构实验之栈四&#xff1a;括号匹配 Description 给你一串字符&#xff0c;不超过50个字符&#xff0c;可能包括括号、数字、字母、标点符号、空格&#xff0c;你的任务是检查这一串字符中的( ) ,[ ],{ }是否匹配。Input 输入数据有多组&#xff0c;处理到文件结束。Outpu…

10.29 工作笔记 ndk编译C++,提示找不到头文件(ndk-build error: string: No such file or directory)...

ndk编译C。提示找不到头文件&#xff08;ndk-build error: string: No such file or directory&#xff09; 被这个问题弄得愁眉苦脸啊。心想为啥一个string都找不到呢。。于是百度到了。。。遇到这个问题&#xff0c;就在所在的文件夹 Application.mk 文件里。加入&…

Excel VBA编程基础

一、程序基本调试方法 1、VB程序的三种状态:设计时、运行时和中断模式。 2、但不执行代码,快捷键为F8。 3、中断程序的方法: (1)使用断点 (2)使用Debug.Assert (3)使用监视条件 二、Excel Shape对象

分治算法之合并排序

1、问题 合并排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列 2、思路 1、分解:将待排序元素分成大小大致相同的两个子序列 2、治理:对两个子序列进行合并排序 3、…

WPF 实现截屏控件之移动(二)(仿微信)

WPF开发者QQ群此群已满340500857 &#xff0c;请加新群458041663由于微信群人数太多入群请添加小编微信号yanjinhuawechat 或 W_Feng_aiQ 邀请入群需备注WPF开发者 接着上一篇&#xff0c;兼容屏幕缩放问题。01—代码如下一、创建ScreenCut.xaml代码如下。<ResourceDictiona…

构造不可变类及其优点

不可变类的优点 易于构造&#xff0c;测试和使用天然线程安全&#xff0c;没有同步问题不需要实现clone方法引用不可变类的实例时&#xff0c;不需要考虑实例的值发生变化的情况如何构造不可变类 不声明“setter”方法。所有属性设为private final。class声明为final&#xff0…

深入剖析阿里云推荐引擎——新架构,新体验

摘要&#xff1a;本文的整理自2017云栖大会-上海峰会上阿里云算法专家郑重&#xff08;卢梭&#xff09;的分享讲义&#xff0c;从2016年2月V2.0公开使用到现在&#xff0c;阿里云推荐引擎有了更大的进步。有着获取排序的在线计算&#xff0c;修正匹配的近线计算及匹配排序的离…

分治算法之快速排序

1、快速排序 通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序 2、思路 ( 1 )分解:先从数列中取出一个元素作为基准元素。以基准元素为标准,将问题分解为两个子序列,使小于…

java程序结构_java程序结构

java是一门面向对象的语言&#xff0c;在编程过程中当然离不开对象的声明&#xff0c;而对象又是通过类定义的&#xff0c;所以java中最重要的就是各式各样的类&#xff0c;在java中&#xff0c;类也是一个程序的基本单位0x01&#xff1a;默认生成类在eclipse中创建好一个java类…

C#金额小写转大写

public string ConvertMoney(decimal Money){//金额转换程序string MoneyNum = "";//记录小写金额字符串[输入参数]string MoneyStr = "";//记录大写金额字符串[输出参数]string BNumStr = "零壹贰叁肆伍陆柒捌玖";//模string UnitStr = "万…

SQL Server 2008空间数据应用系列三:SQL Server 2008空间数据类型

SQL Server 2008空间数据应用系列三&#xff1a;SQL Server 2008空间数据类型 原文:SQL Server 2008空间数据应用系列三&#xff1a;SQL Server 2008空间数据类型友情提示&#xff0c;您阅读本篇博文的先决条件如下&#xff1a; 1、本文示例基于Microsoft SQL Server 2008 R2调…