当前位置: 首页 > 知识库问答 >
问题:

oAuth2.0:为什么需要“授权代码”,并且只需要令牌?

陈项禹
2023-03-14

使用oAuth 2.0,在“授权代码”授权授予中,我首先调用“/授权”,获取代码,然后在对“/令牌”的调用中使用该代码来获取访问令牌。

我的问题:为什么这是流?我想这是出于安全原因,但我想不出来。为什么实现是这样的,而不是在第一次调用(“/authorize”)后立即获取访问令牌?

为什么我们需要这个代码?

共有3个答案

朱宇航
2023-03-14

客户端的数据通常被认为是不安全的。在隐式调用的情况下,令牌在初始步骤中被授予,任何有access_token的人都可以请求数据,应用编程接口不知道谁在调用该应用编程接口。

但是,在应用程序想要标识自己的Web服务器应用程序的情况下,client_secretclient_id与authorization_code一起发送以获得access_token,将来可以独立发送。

假设,如果access_token最初被授予,那么client_id和access_token仍然会被认为是公开的,所以应用程序将不得不发送client_secret除了access_token每次以确保请求真的来自它。

而在当前场景中,在获得访问\u令牌后,可以独立地发出进一步的请求,而不需要客户端\u密钥。

范金鑫
2023-03-14

授权代码流适用于涉及3方的场景。

这些缔约方是:

>

  • 客户

    用户使用其web浏览器。他想使用你的应用程序。

    供应商

    包含有关用户的信息。如果有人想访问这些数据,用户必须首先同意。

    您的(web)应用程序

    希望从提供者访问关于用户的信息。

    现在,你的应用程序对用户说(将他的浏览器重定向到/authorizeendpoint):

    嘿,用户,这是我的客户id。请与提供商联系,并允许他直接与我联系。

    因此,用户与提供商交谈(请求授权码并通过在其浏览器中打开您的回调URL将其返回到您的应用程序):

    嘿,提供商,我想使用这个应用程序,所以他们需要访问我的数据。给我一些代码,我给应用程序这个代码。

    现在,您的应用程序具有客户端和提供商已知的授权代码。通过将其交给提供商,您的应用程序现在可以证明,客户端允许其访问其数据。提供商现在向您的(web)应用程序颁发访问令牌,这样您的(web)应用程序就不必每次都重复这些步骤(至少在一段时间内)。

    如果其他应用程序类型的应用程序直接在客户端运行(如iPhone/Android应用程序或Javascript客户端),则中间步骤是多余的。

  • 欧阳勇军
    2023-03-14

    也有可能通过这个中间步骤阻止客户端看到访问令牌吗?

    摘自O'Reilly的书:

    授权代码此授权类型最适合服务器端web应用程序。在资源所有者获得对其数据的授权访问后,他们将被重定向回web应用程序,并在URL中使用授权代码作为查询参数。客户端应用程序必须将此代码交换为访问令牌。此交换是服务器对服务器进行的,需要客户端\u id和客户端\u机密,甚至资源所有者也无法获得访问令牌。这种授权类型还允许通过使用刷新令牌对API进行长期访问。

    用于基于浏览器的客户端应用程序的隐式授予隐式授予是所有流中最简单的,并且针对在浏览器中运行的客户端Web应用程序进行了优化。资源所有者授予对应用程序的访问权限,并立即创建一个新的访问令牌,并使用URL中的#哈希片段传回应用程序。应用程序可以立即从哈希片段中提取访问令牌(使用JavaScript)并发出API请求。此授予类型不需要中介“授权代码”,但它也不提供可用于长期访问的刷新令牌。

    更新-确实是:

    什么时候应该使用授权代码流?授权代码流应在以下情况下使用

    >

  • 需要长期访问。

    OAuth客户端是一个web应用程序服务器。

    API调用的责任是非常重要的,OAuth令牌不应该泄露给浏览器,用户可以在浏览器中访问它。

    更多:

    也许最重要的是,因为访问令牌从未通过浏览器发送-通过浏览器历史记录、引用器头、JavaScript等将访问令牌泄漏给恶意代码的风险较小。

  •  类似资料:
    • 我的问题是:为什么这是流动?我想是出于安全原因,但我想不通。为什么实现是这样的,而不是在第一次调用(“/authorize”)之后立即获得访问令牌? 我们为什么需要这个代码?

    • 本文向大家介绍HTML5 为什么只需要写 ?相关面试题,主要包含被问及HTML5 为什么只需要写 ?时的应答技巧和注意事项,需要的朋友参考一下 1) HTML5不基于SGML,因此不需要对DTD进行引用,但是需要DOCTYPE来规范浏览器的行为(让浏览器按照他们应该的方式来运行); 2) HTML4.01基于SGML,所以需要对DTD进行引用,才能告知浏览器文档所使用的文档类型;

    • 我正在学习谷歌云存储,JSON api,简单上传: https://cloud.google.com/storage/docs/json_api/v1/how-tos/simple-upload 示例显示发送一篇如下所示的帖子: 然后我创建了一个“服务帐户”应用编程接口。 但是我如何从我新创建的服务帐户中找到要使用的?

    • 我目前正在处理一组应用程序,这些应用程序运行在两个独立但等效的环境中(称为和)。我一直在使用OAuth 2.0进行授权,当我从OAuth服务请求访问令牌后收到响应时(我正在通过Postman进行请求),我会从和得到如下响应: 据我所知,我相信这个< code >“token _ type”:“Bearer”意味着当我向我的应用程序发送< code>access_token时,我需要这样做: 通过前

    • 互联网是超文本标记语言(HTML)页面的集合,它们彼此链接以形成概念性信息网络。随着时间的推移,静态资源数量增加,图像等更丰富的项目开始成为Web结构的一部分。 高级服务器技术允许动态服务器页面 - 其内容基于查询生成的页面。 很快,需要拥有更多动态网页才能获得动态超文本标记语言(DHTML)。一切都归功于JavaScript。在接下来的几年中,我们看到了跨帧通信,试图避免页面重新加载,然后在帧内

    • 当前信息时代,哪里都是应用程序。这些应用程序们不仅仅是运行人们工作场所的工具 - 它们现在正在经营人们的生活。 对即时响应的需求,完美的行为和更多的功能是前所未有的。 而且,当然,人们期望应用程序在不同类型的设备上运行平稳,特别是在移动设备上。 应用程序执行的速度与它所做的一样重要。 NGINX的核心功能,例如其具有高性能HTTP和反向代理服务器的大规模可扩展事件驱动架构,访问和带宽控制以及与各种