前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >从0开始构建一个Oauth2Server服务 <17> 回调地址 Redirect URL

从0开始构建一个Oauth2Server服务 <17> 回调地址 Redirect URL

作者头像
用户1418987
发布于 2023-10-16 01:29:07
发布于 2023-10-16 01:29:07
8040
举报
文章被收录于专栏:codercoder

回调地址 Redirect URL

重定向 URL 是 OAuth 流程的关键部分。用户授权应用成功后,授权服务器会将用户重定向回应用。由于重定向 URL 将包含敏感信息,因此服务不会将用户重定向到任意位置至关重要。

确保用户只会被重定向到适当位置的最佳方法是要求开发人员在创建应用程序时注册一个或多个重定向 URL。在这些部分中,我们将介绍如何处理移动应用程序的重定向 URL、如何验证重定向 URL 以及如何处理错误。

注册RedirectURL

为了避免将用户暴露于开放式重定向器Attack,您必须要求开发人员为应用程序注册一个或多个重定向 URL。授权服务器绝不能重定向到任何其他位置。注册新应用程序包括创建注册表单以允许开发人员为其应用程序注册重定向 URL。

如果Attacker可以在用户到达授权服务器之前操纵重定向 URL,他们可能会导致服务器将用户重定向到恶意服务器,该服务器会将授权代码发送给Attacker。这是Attacker可以尝试拦截 OAuth 交换并窃取访问令牌的一种方式。如果授权端点不限制它将重定向到的 URL,那么它被认为是“开放重定向器”,并且可以与其他东西结合使用以发起与 OAuth 不一定相关的Attack。

有效的重定向 URL

当您构建表单以允许开发人员注册重定向 URL 时,您应该对他们输入的 URL 进行一些基本验证。

已注册的重定向 URL 可以包含查询字符串参数,但片段中不得包含任何内容。如果开发人员尝试注册包含片段的重定向 URL,注册服务器应拒绝该请求。

请注意,对于本机和移动应用程序,该平台可能允许开发人员注册一个 URL 方案,例如myapp://可以在重定向 URL 中使用的方案。这意味着授权服务器应允许注册任意 URL 方案,以支持为本机应用程序注册重定向 URL。有关详细信息,请参阅移动和本机应用程序。

按请求定制

通常,开发人员会认为他们需要能够在每个授权请求上使用不同的重定向 URL,并且会尝试更改每个请求的查询字符串参数。这不是重定向 URL 的预期用途,授权服务器不应允许。服务器应拒绝任何重定向 URL 与已注册 URL 不完全匹配的授权请求。

如果客户端希望在重定向 URL 中包含特定于请求的数据,它可以改为使用“state”参数来存储将在用户重定向后包含的数据。它既可以在状态参数本身中对数据进行编码,也可以使用状态参数作为会话 ID 将状态存储在服务器上。

Redirect URLs for Native Apps

Native Apps是安装在设备上的客户端,例如桌面应用程序或本机移动应用程序。在支持与安全性和用户体验相关的本机应用程序时,需要牢记一些事项。

授权端点通常会将用户重定向回客户端注册的重定向 URL。根据平台的不同,本机应用程序可以声明一个 URL 模式,或者注册一个将启动应用程序的自定义 URL 方案。例如,一个 iOS 应用程序可以注册一个自定义协议myapp://,然后使用一个 redirect_uri myapp://callback

应用声明的 https URL 重定向

某些平台(Android 和 iOS 9 之后的 iOS)允许应用程序覆盖特定的 URL 模式以启动本机应用程序而不是 Web 浏览器。例如,应用程序可以注册https://app.example.com/auth,并且每当 Web 浏览器尝试重定向到该 URL 时,操作系统都会启动本机应用程序。

如果操作系统不支持声明 URL,则应使用此方法。如果操作系统对开发人员可以控制此 Web URL 进行某种级别的验证,则这允许操作系统保证本机应用程序的身份。如果操作系统不支持此功能,则应用程序将不得不改用自定义 URL 架构。

自定义 URL 方案

大多数移动和桌面操作系统都允许应用程序注册自定义 URL 方案,当从系统浏览器访问具有该方案的 URL 时,该方案将启动应用程序。

使用此方法,本机应用程序通过使用标准授权代码参数启动系统浏览器来正常启动 OAuth 流程。唯一的区别是重定向 URL 将是带有应用程序自定义方案的 URL。

当授权服务器发送Location要将用户重定向到的标头myapp://callback#token=....时,手机将启动应用程序,应用程序将能够恢复授权过程,从 URL 解析访问令牌并将其存储在内部。

自定义 URL 方案命名空间

由于没有集中注册 URL schemes 的方法,应用程序必须尽力选择不会相互冲突的 URL schemes。

您的服务可以通过要求 URL 方案遵循特定模式来提供帮助,并且只允许开发人员注册与该模式匹配的自定义方案。

例如,Facebook 会根据应用程序的客户端 ID 为每个应用程序生成一个 URL 方案。例如,fb00000000://数字对应于应用程序的客户端 ID。这提供了一种生成全局唯一 URL 方案的相当可靠的方法,因为其他应用不太可能使用具有此模式的 URL 方案。

应用程序的另一种选择是将反向域名模式与受应用程序发布者控制的域一起使用,从而生成例如 URL 方案com.example.myapp。如果您愿意,这也是服务可以强制执行的内容。

验证 RedirectURL

在三种情况下您需要验证重定向 URL。

  • 当开发人员将重定向 URL 注册为创建应用程序的一部分时
  • 在授权请求中(授权代码和隐式授权类型)
  • 当应用程序为访问令牌交换授权代码时
重定向 URL 注册

正如创建应用程序中所讨论的那样,该服务应该允许开发人员在创建应用程序时注册一个或多个重定向 URL。重定向 URL 的唯一限制是它不能包含片段组件。该服务必须允许开发人员使用自定义 URL 方案注册重定向 URL,以支持某些平台上的本机应用程序

授权请求

当应用程序启动 OAuth 流程时,它将把用户定向到您服务的授权端点。该请求将在 URL 中包含多个参数,包括重定向 URL。

此时,授权服务器必须验证重定向 URL 以确保请求中的 URL 与应用程序的注册 URL 之一相匹配。该请求还将有一个client_id参数,因此服务应根据该参数查找重定向 URL。Attacker完全有可能使用一个应用程序的客户端 ID 和Attacker的重定向 URL 来制作授权请求,这就是需要注册的原因。

该服务应查找 URL 的精确匹配,并避免仅匹配特定 URL 的一部分。(如果客户端需要自定义每个请求,可以使用 state 参数。)简单的字符串匹配就足够了,因为不能为每个请求自定义重定向 URL。服务器需要做的就是检查请求中的重定向 URL 是否与开发人员在注册其应用程序时输入的重定向 URL 之一相匹配。

如果重定向 URL 不是已注册的重定向 URL 之一,则服务器必须立即显示错误指示,并且不会重定向用户。这避免了将您的授权服务器用作开放重定向器

授予访问令牌

令牌端点将收到一个请求,用授权代码交换访问令牌。此请求将包含重定向 URL 以及授权代码。作为一项额外的安全措施,服务器应验证此请求中的重定向 URL 是否与包含在此授权代码的初始授权请求中的重定向 URL 完全匹配。如果重定向 URL 不匹配,服务器将拒绝请求并报错。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-05-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
从0开始构建一个Oauth2Server服务 <15> 安全问题
针对 OAuth 服务器的一种潜在Attack是网络钓鱼Attack。这是Attack者创建一个看起来与服务授权页面相同的网页的地方,该页面通常包含用户名和密码字段。然后,Accacker可以通过各种手段诱骗用户访问该页面。除非用户可以检查浏览器的地址栏,否则该页面可能看起来与真正的授权页面完全相同,并且用户可以输入他们的用户名和密码。
用户1418987
2023/10/16
2870
从0开始构建一个Oauth2Server服务 <15> 安全问题
从0开始构建一个Oauth2Server服务 <25> Native App 使用OAuth
为本机应用程序支持 OAuth 时要牢记的一些特殊注意事项。与基于浏览器的应用程序一样,本机应用程序不能使用客户端机密,因为这将要求开发人员在应用程序的二进制分发中传送机密。事实证明,反编译和提取秘密相对容易。因此,本机应用程序必须使用不需要预注册客户端密码的 OAuth 流程。
用户1418987
2023/10/16
2890
从0开始构建一个Oauth2Server服务 <25> Native App 使用OAuth
从0开始构建一个Oauth2Server服务1-创建应用程序
我们将介绍在构建与现有 OAuth 2.0 API 对话的应用程序时需要了解的事项。无论您是构建 Web 应用程序还是移动应用程序,在我们开始时都需要牢记一些事项。
用户1418987
2023/10/16
2340
从0开始构建一个Oauth2Server服务1-创建应用程序
从0开始构建一个Oauth2Server服务 <6> 移动和本机应用程序
与单页应用程序一样,移动应用程序也无法维护客户机密。因此,移动应用程序还必须使用不需要客户端密码的 OAuth 流程。当前的最佳做法是将授权流程与 PKCE 一起使用,同时启动外部浏览器,以确保本机应用程序无法修改浏览器窗口或检查内容。
用户1418987
2023/10/16
3880
从0开始构建一个Oauth2Server服务 <6> 移动和本机应用程序
从0开始构建一个Oauth2Server服务 <18> AccessToken
访问令牌是应用程序用来代表用户发出 API 请求的东西。访问令牌代表特定应用程序访问用户数据的特定部分的授权。
用户1418987
2023/10/16
6160
从0开始构建一个Oauth2Server服务 <18> AccessToken
从0开始构建一个Oauth2Server服务 <5> 单页应用
单页应用程序(也称为基于浏览器的应用程序)在从网页加载 JavaScript 和 HTML 源代码后完全在浏览器中运行。由于浏览器可以使用整个源代码,因此它们无法维护客户端机密的机密性,因此这些应用程序不使用机密。因为他们不能使用客户端密码,所以最好的选择是使用 PKCE 扩展来保护重定向中的授权代码。这类似于也不能使用客户端密码的移动应用程序的解决方案。
用户1418987
2023/10/16
4880
从0开始构建一个Oauth2Server服务 <5> 单页应用
从0开始构建一个Oauth2Server服务 <14> 授权响应
如果请求有效且用户同意授权请求,授权服务器将生成授权代码并将用户重定向回应用程序,将授权代码和应用程序的“状态”值添加到重定向 URL。
用户1418987
2023/10/16
3520
从0开始构建一个Oauth2Server服务 <14> 授权响应
从0开始构建一个Oauth2Server服务 <4> 构建服务器端应用程序
该应用程序通过制作包含客户端 ID、范围、状态和 PKCE 代码验证程序的 URL 来启动流程。该应用程序可以将其放入<a href="">标签中。
用户1418987
2023/10/16
3760
从0开始构建一个Oauth2Server服务 <4> 构建服务器端应用程序
从0开始构建一个Oauth2 Server服务 <3> 构建服务器端应用程序
服务器端应用程序是处理 OAuth 服务器时遇到的最常见的应用程序类型。这些应用程序在 Web 服务器上运行,其中应用程序的源代码不向公众开放,因此它们可以维护其客户端机密的机密性。
用户1418987
2023/10/16
4590
从0开始构建一个Oauth2 Server服务 <3> 构建服务器端应用程序
从0开始构建一个Oauth2Server服务 <12> 用户登录及授权
单击应用程序的“登录”或“连接”按钮后,用户首先会看到的是您的授权服务器 UI。由授权服务器决定是要求用户在每次访问授权屏幕时都登录,还是让用户在一段时间内保持登录状态。如果授权服务器在请求之间记住了用户,那么它可能仍需要请求用户的许可才能在以后的访问中授权应用程序。
用户1418987
2023/10/16
4210
从0开始构建一个Oauth2Server服务 <12> 用户登录及授权
从0开始构建一个Oauth2Server服务 <8> 注册应用
当开发人员访问您的网站时,他们将需要一种方法来创建新的应用程序并获取凭据。通常,在他们可以创建应用程序之前,您会让他们创建一个开发者帐户,或代表他们的组织创建一个帐户。
用户1418987
2023/10/16
2190
从0开始构建一个Oauth2Server服务 <8> 注册应用
Go语言中的OAuth2认证
在网络应用程序开发中,安全性和用户身份验证是至关重要的方面。OAuth2(开放授权2.0)是一种广泛应用于网络身份验证和授权的标准协议。它允许客户端应用程序以安全且受控的方式访问受保护资源,而无需用户提供其凭据。
繁依Fanyi
2024/04/15
1.1K0
从0开始构建一个Oauth2Server服务 <20> Access Token 访问令牌
当您的服务发出访问令牌时,您需要就您希望令牌持续多长时间做出一些决定。不幸的是,没有针对每项服务的一揽子解决方案。不同的选项会带来各种权衡,因此您应该选择最适合您的应用程序需求的选项(或选项组合)
用户1418987
2023/10/16
3830
从0开始构建一个Oauth2Server服务 <20> Access Token 访问令牌
「应用安全」OAuth和OpenID Connect的全面比较
在这篇文章中,从头开始实施OAuth 2.0和OpenID Connect服务器的开发人员(我)讨论了调查结果。基本上,实施的考虑点是在讨论中写出来的。因此,对于那些正在寻找“如何及时设置OAuth 2.0和OpenID Connect服务器”等信息的人来说,这不是一个文档。如果您正在寻找此类信息,请访问GitHub上的java-oauth-server和java-resource-server。使用这些,您可以在10分钟内启动授权服务器和资源服务器,发出访问令牌并使用访问令牌调用Web API,而无需设置数据库服务器。
架构师研究会
2019/09/03
2.8K0
「应用安全」OAuth和OpenID Connect的全面比较
Golang 如何实现一个 Oauth2 客户端程序
欢迎star demo007x/oauth2-client: Oauth2 Client package for Golang (github.com)
用户1418987
2023/10/16
6740
Golang 如何实现一个 Oauth2  客户端程序
OAuth 详解<2> 什么是 OAuth 2.0 授权码授权类型?
demo007x/oauth2-client: Oauth2 Client package for Golang (github.com) 欢迎star
用户1418987
2023/04/11
2.3K0
OAuth 详解<2> 什么是 OAuth 2.0 授权码授权类型?
OAuth 详解<4> 什么是 OAuth 2.0 隐式授权类型?
隐式授权类型是单页 JavaScript 应用程序无需中间代码交换步骤即可获取访问令牌的一种方式。它最初是为 JavaScript 应用程序(无法安全存储机密)而创建的,但仅在特定情况下才推荐使用。
用户1418987
2023/10/16
5430
OAuth 详解<4> 什么是 OAuth 2.0 隐式授权类型?
OAuth 2.0初学者指南
本文概述了OAuth 2.0协议。它讨论了OAuth 2.0实现过程中涉及的不同参与者和步骤。
银河1号
2019/05/16
2.7K0
OAuth 2.0初学者指南
从协议入手,剖析OAuth2.0(译 RFC 6749)
      传统的client-server授权模型,客户端通过使用凭证(通常的用户名和明文密码)访问服务端受保护的资源,为了能够让第三方应用程序访问受保护的资源,需要将凭证共享给第三方。
justmine
2022/05/10
5.3K0
OAuth 详解<1> 什么是 OAuth?
从高层次开始,OAuth 不是API或服务:它是授权的开放标准,任何人都可以实施它。
用户1418987
2023/04/10
5.2K0
OAuth 详解<1> 什么是 OAuth?
推荐阅读
相关推荐
从0开始构建一个Oauth2Server服务 <15> 安全问题
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档