Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >我们真的需要client_secret来获得PKCE流上的access_token吗?

我们真的需要client_secret来获得PKCE流上的access_token吗?
EN

Stack Overflow用户
提问于 2020-07-23 07:28:42
回答 3查看 4.5K关注 0票数 7

我正在构建两个应用程序:前端和后端。

后端将使用Rails API + Doorkeeper (oauth2提供程序)构建,而前端将使用React构建。

目前,我正在使用“客户凭据授权流”,该流程目前运行良好。但是经过一段时间的研究后,这个流程不应该被应用程序使用,因为如果有人对应用程序进行解压缩,它就会公开client_secret

我还读过“隐式格兰特流”,它只需要client_id。但现在这股潮流似乎已经过时了?

根据这个:https://auth0.com/docs/api-auth/which-oauth-flow-to-use#is-the-client-a-single-page-app-

它建议在“隐式授权流”上使用“带有PKCE的授权代码授予”。我可以让它工作,但问题是,它仍然需要client_secret才能得到一个access_token,这应该是什么样子?

下面是我正在做的示例流:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
curl -X POST 'http://localhost:3000/oauth/authorize?client_id=xxxx&redirect_uri=urn:ietf:wg:oauth:2.0:oob&response_type=code&scope=public&code_challenge=testchallenge&code_challenge_method=plain'

这将给我以下答复:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
    "status": "redirect",
    "redirect_uri": {
        "action": "show",
        "code": "8quZ-EAiKKG2EKnQiSYs3xeFRCgsIwcTbaWNdjnpyFg"
    }
}

然后,我将使用上面的代码来使用下面的请求获取访问令牌:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
curl -i http://localhost:3000/oauth/token \
  -F grant_type="authorization_code" \
  -F client_id="xxxx" \
  -F client_secret="xxxx" \
  -F code="8quZ-EAiKKG2EKnQiSYs3xeFRCgsIwcTbaWNdjnpyFg" \
  -F redirect_uri="urn:ietf:wg:oauth:2.0:oob" \
  -F code_verifier="testchallenge"

现在是问题所在,为了将code转换为access_token,我仍然需要client_secret。如果两者只公开我的client_secret,这与“客户凭据授予流”有什么区别?

上述命令将返回以下命令:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
    "access_token": "nQoorBqLxQH4qFpmlx3mGG6Cd_TfX4d3L3gAGOTwrFs",
    "token_type": "Bearer",
    "expires_in": 7200,
    "scope": "public",
    "created_at": 1595517643
}

如果我没有在请求中包含client_secret,下面是响应:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
    "error": "invalid_client",
    "error_description": "Client authentication failed due to unknown client, no client authentication included, or unsupported authentication method."
}

以下是我的问题:

  1. 我们真的需要client_secret来获得PKCE流上的access_token吗?
  2. 如果它只公开client_secret,为什么建议使用"PKCE流“?
  3. 它与同时公开client_secret的“客户凭据授予流”有何不同?

门卫PKCE文档:https://github.com/doorkeeper-gem/doorkeeper/wiki/Using-PKCE-flow

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-07-23 09:12:09

  1. 我们真的需要client_secret来获得PKCE流上的access_token吗?

那得看情况。最初,PKCE是为了保护公共客户端(不能保护秘密的客户端)而引入的。但是最近,在实践中,PKCE成为了授权代码授予(来源)的推荐。

2.1.1.授权代码授予 客户必须防止将授权代码注入(重放)到 攻击者的授权响应。PKCE RFC7636的使用 为此目的而推荐。也可以使用OpenID连接"nonce“参数和ID令牌声明OpenID。PKCE的挑战 OpenID连接“当前”必须是事务特定的,并且必须是安全的。 绑定到事务所在的客户端和用户代理。 开始了。 注意:尽管到目前为止,PKCE是作为保护 本机应用程序,此建议适用于所有类型的OAuth客户端, 包括网络应用。

  1. 如果它只公开client_secret,为什么建议使用"PKCE流“?

总之,为了避免授权代码重播攻击(规格-游戏攻略)。这种情况发生在终端用户的设备中,而不是在数据传输中。对于TLS 2.0令牌请求,TLS是必需的。

  1. 它与同时公开client_secret的“客户凭据授予流”有何不同?

任何授权都不会公开凭据,因为令牌请求是通过TLS完成的。

我认为在您的情况下,客户端是一个机密客户端(规范-客户端类型)。因此,我建议在授权服务器中检查这个方面。

票数 3
EN

Stack Overflow用户

发布于 2020-07-27 14:43:22

更新

与此同时,建议发生了变化(也见Kavindu的答复,以供参考),我希望确保这一点在这个答复中也得到强调。将PKCE作为补充客户端秘密的额外安全层,对于机密客户端也是有意义的。客户端秘密允许授权服务器(标识提供程序)确定客户端的身份。

使用PKCE可以确保试图将授权代码交换给令牌的一方首先是实际请求授权代码的方。因此,为了避免拦截场景,在顶部添加PKCE也是有意义的,即使是对机密客户端也是如此。

但是请记住,并不是所有的身份提供者都可能同时支持使用PKCE和客户端机密。

至于向守门人提出的问题,这种行为在此期间也可能发生变化。

原始答案

使用PKCE的授权代码流是为客户端无法安全地保护秘密的设置而发明的。因此,当您在PKCE中使用授权代码流时,不需要一个秘密,或者更准确地说,客户端秘密没有任何意义。

您所体验的似乎是一个Doorkeeper (参见https://github.com/doorkeeper-gem/doorkeeper/issues/1089)。所以我担心在他们修好之前你得用一些假的客户秘密。

但是,只要正确地实现了PKCE流的其余部分,这就不应该是一个问题,因为这个流不依赖于任何静态客户端秘密,而是使用您已经指出的动态创建的代码验证器。

我不确定我是否正确地理解了您所使用的处理登录的客户端类型。如果是SPA或移动应用程序,您应该在PKCE中使用授权代码流,但是如果您正在实现一个“经典”web应用程序,在某些后端服务中对登录进行处理,则应该使用使用客户端秘密的正常授权代码流,因为可以信任后端来保护机密。

顺便说一句,我刚刚在我的一个项目中检查了代码,我在其中构建了一些通过Auth0作为身份提供者进行身份验证的角SPA。我在那里使用PKCE的授权代码流,而且我肯定不会向Auth0发送任何静态客户端秘密(就像原始授权代码流中的那样),因为显然该流程是按预期实现的。所以这一定是门卫的问题。

另一件事:我不知道您提供的请求是否只是示例,但与其使用简单的方法将代码验证器转换为代码挑战,我更愿意使用安全的方法,如S256,而不是您在问题中引用的RFC中的建议。

票数 8
EN

Stack Overflow用户

发布于 2020-07-24 01:36:05

我在Rails控制台中创建了这样一个Doorkeeper::Application

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Doorkeeper::Application.create :name => 'Test App', :uid => 'xxxx', :secret => 'xxxx', :redirect_uri => 'urn:ietf:wg:oauth:2.0:oob'

似乎我需要将Doorkeeper::Application机密字段设置为false,这样才能获得没有client_secretaccess_token

因此,上述代码将成为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Doorkeeper::Application.create :name => 'Test App', :uid => 'xxxx', :secret => 'xxxx', :redirect_uri => 'urn:ietf:wg:oauth:2.0:oob', :confidential => false

我在以下网站找到了解决方案:spec.rb#L348

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63057801

复制
相关文章
Java中解析XML文件
树结构,有助于更好地理解、掌握,代码易于编写,在解析过程中树结构是保存在内存中,方便修改
头发还在
2023/10/16
2610
xml的解析
   XmlDocument doc=new XmlDocument();    StringReader sr=new StringReader(textBox1.Text);    XmlTextReader rd=new XmlTextReader(sr);    while(rd.Read())    {     //textBox2.Text +=rd.NodeType.ToString()+"\r\n";     if(rd.NodeType.ToString()=="Element")    
用户1075292
2018/01/23
3.6K0
XML的解析
昨天说了JSON解析,今天来看一下XML解析。在开发中需要对xml解析也是很常见的,跟JSON一样,大同小异。
一头小山猪
2020/04/10
3.1K0
xml解析---Java解析xml文件
dom4j解析xml文件、之前用下面的方法,90M的xml,500万行,解析完插入数据库,单线程,不到1小时搞定,而只是解析数据,只用了7秒。
IT云清
2019/01/22
7.1K0
如何在PHP中解析XML
XML解析器是一个程序,它可以将XML文档或代码转换为XML文档对象模型(DOM)对象。
Lemon黄
2020/07/07
3.6K0
xml解析---Java解析xml文件 /江格式解析
本文源于:http://www.cnblogs.com/Qian123/p/5231303.html点击这里
IT云清
2019/01/22
4K0
XML解析
XML解析 什么是DOM 使用DOM的解析步骤 什么是dom4j 使用dom4的解析步骤 什么是DOM DOM全称Document Object Model文档对象模型,将文档中的元素或者其他节点转换成一个一个的对象使用java代码操作XML或者js代码操作HTML DOM解析的特点 在加载的时候一次性把整个的XML文档载入内存,在内存中形成一颗树(Document对象) 之后使用代码去操作Document对象,其实是操作的是内存当中的DOM树,和本地磁盘中的XML文件没有直接关系 由于操作的是内存
木瓜煲鸡脚
2019/07/22
3.1K0
XML解析
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010105969/article/details/47010227
用户1451823
2018/09/13
2.5K0
XML解析
XML解析方式分为两种:DOM方式和SAX方式 DOM:Document Object Model,文档对象模型。这种方式是W3C推荐的处理XML的一种方式。 SAX:Simple API for XML。这种方式不是官方标准,属于开源社区XML-DEV,几乎所有的XML解析器都支持它。
星哥玩云
2022/09/14
5.6K0
XML解析
xml 解析技术介绍和解析xml文件
xml 可扩展的标记语言。不管是 html 文件还是 xml 文件它们都是标记型文档,都可以使用 w3c 组织制定的 dom 技术来解析。
一个风轻云淡
2022/11/15
3.7K0
xml 解析技术介绍和解析xml文件
【Python学习】保姆级教学python中的解析和解析XML
我们经常需要解析用不同语言编写的数据。Python 提供了许多库来解析或拆分用其他语言编写的数据。在此 Python XML 解析器教程中,您将学习如何使用 Python 解析 XML。
玖柒的小窝
2021/12/10
4K0
【Python学习】保姆级教学python中的解析和解析XML
【Groovy】Xml 反序列化 ( 使用 XmlParser 解析 Xml 文件 | 获取 Xml 文件中的节点和属性 | 获取 Xml 文件中的节点属性 )
创建 XmlParser 解析器 , 传入 Xml 文件对应的 File 对象 ;
韩曙亮
2023/03/30
7.2K0
【Groovy】Xml 反序列化 ( 使用 XmlParser 解析 Xml 文件 | 获取 Xml 文件中的节点和属性 | 获取 Xml 文件中的节点属性 )
java xml解析框架_JAVA解析xml的五种方式对比
本篇文章主要对比Java即系xml的五种方式,这五种方式各有利弊,大家可以看情况采用哪一种。
全栈程序员站长
2022/09/05
1.7K0
python 解析XML
a.name #就是上面的 "id"   a.value #属性的值   访问元素属性
艳艳代码杂货店
2021/11/01
3.5K0
golang的xml、json解析
xml golang的xml处理主要应用Unmarshal、Marshal方法实现,解析一个xml到struct如下,首先是xml文件: <?xml version="1.0" encoding="u
用户1141560
2017/12/26
3K0
golang的xml、json解析
Java解析XML的实践
通过这段代码,重点是需要理解他的解析过程,就可以根据实际用到的XML格式,写出对应的解析逻辑。
bisal
2023/02/16
1K0
Python中XML数据结构详细解析
物联网应用过程中,设备采集数据后,一般通过终端采集器网关转发或web server服务打包成xml或json数据格式传输到数据中心或云平台,最后经数据解析、数据分析及数据可视化。开发环节涉及末端设备数据采集、数据转发、数据解析等流程。
用户8949263
2022/04/08
2.2K0
Python中XML数据结构详细解析
Java中四种XML解析技术
在平时工作中,难免会遇到把 XML 作为数据存储格式。面对目前种类繁多的解决方案,哪个最适合我们呢?在这篇文章中,我对这四种主流方案做一个不完全评测,仅仅针对遍历 XML 这块来测试,因为遍历 XML 是工作中使用最多的(至少我认为)。 
Hongten
2018/09/13
7190
DrugBank XML解析
官方网站: https://www.drugbank.ca 最近好像很多人在关注这个网站,就暂时开一个 官网就是这个样子
DrugScience
2021/02/04
9K6
DrugBank XML解析
python 解析xml
from urllib.request import urlopen from xml.etree.ElementTree import parse
用户5760343
2019/10/21
3.4K0

相似问题

表单提交时Django写入数据库

20

Django不从表单(不是admin)写入数据库

10

将表单数据写入SQL数据库

216

将表单数据写入SQLLite数据库

121

将表单API值写入数据库

13
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文