从0开始构建一个Oauth2Server服务 11 Authorization

从0开始构建一个Oauth2Server服务 11

授权 Authorization

授权界面是用户在授予应用程序访问其帐户时看到的屏幕。以下部分介绍了如何构建授权屏幕、界面中包含哪些组件以及如何最好地向最终用户展示界面。

实施 OAuth 服务器时,您正在使开发人员社区能够构建利用您的平台的应用程序,允许应用程序访问并可能修改私人用户内容,或代表用户行事。因此,您需要确保为用户提供尽可能多的信息来保护他们的帐户,并确保他们了解应用程序正在使用他们的帐户做什么。

Authorization Request

客户端会将用户的浏览器定向到授权服务器以开始 OAuth 过程。客户端可以使用授权代码授权类型或隐式授权。除了由参数指定的授权类型外response_type,请求还将具有许多其他参数来指示请求的细节。

服务器端应用程序描述了客户端如何为您的服务构建授权 URL。授权服务器第一次看到用户将是这个授权请求,用户将被定向到具有客户端设置的查询参数的服务器。此时,授权服务器需要验证请求并呈现授权界面,允许用户批准或拒绝请求。

请求参数

以下参数用于开始授权请求。例如,如果授权服务器 URL 是https://authorization-server.com/auth,则客户端将创建如下所示的 URL 并将用户的浏览器定向到它:

https://authorization-server.com/auth?response_type=code
&client_id=29352735982374239857
&redirect_uri=https://example-app.com/callback
&scope=create+delete
&state=xcoivjuywkdkhvusuye3kch

响应类型

response_type将设置为code,表示应用程序希望在成功时收到授权码。

client_id

client_id应用程序的公共标识符。

redirect_uri(选修的)

redirect_uri规范不要求它,但您的服务应该需要它。此 URL 必须与开发者在创建应用程序时注册的 URL 之一匹配,如果不匹配,授权服务器应拒绝该请求。

scope(选修的)

该请求可能具有一个或多个范围值,指示应用程序请求的额外访问。授权服务器需要向用户显示请求的范围。

state(受到推崇的)

state应用程序使用该参数来存储特定于请求的数据和/或防止 CSRF 攻击。授权服务器必须将未修改的状态值返回给应用程序。

PKCE

如果授权服务器支持 PKCE 扩展(在PKCE中描述),那么code_challengecode_challenge_method参数也将存在。在发布授权代码和发布访问令牌之间,授权服务器必须记住这些。

验证授权请求

授权服务器必须首先验证client_id请求中的 是否对应于有效的应用程序。

如果您的服务器允许应用程序注册多个重定向 URL,则有两个步骤来验证重定向 URL。如果请求包含redirect_uri参数,服务器必须确认它是该应用程序的有效重定向 URL。redirect_uri如果请求中没有参数,并且只注册了一个 URL,则服务器使用之前注册的重定向 URL。否则,如果请求中没有重定向 URL,并且没有注册重定向 URL,则这是一个错误。

如果client_id无效,服务器应立即拒绝请求并向用户显示错误,而不是将用户重定向回应用程序。

无效的重定向 URL

如果授权服务器检测到重定向 URL 有问题,它需要将问题通知用户而不是重定向用户。重定向 URL 可能由于多种原因而无效,包括:

  • 缺少重定向 URL 参数
  • 重定向 URL 参数无效,例如它是一个不解析为 URL 的字符串
  • 重定向 URL 与应用程序的注册重定向 URL 之一不匹配

在这些情况下,授权服务器应该向用户显示一个错误,通知他们这个问题。服务器不得将用户重定向回应用程序。这避免了所谓的“开放重定向器攻击”。如果重定向 URL 已经注册,服务器应该只将用户重定向到重定向 URL。

其他错误

所有其他错误都应通过将用户重定向到查询字符串中包含错误代码的重定向 URL 来处理。有关如何响应错误的详细信息,请参阅授权响应部分。

如果请求缺少该response_type参数,或者该参数的值不是codetoken,则服务器会返回invalid_request错误。

由于授权服务器可能要求客户端指定它们是公开的还是机密的,因此它可以拒绝不允许的授权请求。例如,如果客户端指定他们是机密客户端,则服务器可以拒绝使用令牌授予类型的请求。当因为这个原因拒绝时,使用错误代码unauthorized_client

如果存在它无法识别的范围值,授权服务器应该拒绝该请求。在这种情况下,服务器可以重定向到带有invalid_scope错误代码的回调 URL。

授权服务器需要存储此请求的“状态”值(和 PKCE 值),以便将其包含在授权响应中。服务器不得修改或假设状态值包含的内容,因为这纯粹是为了客户端的利益。

posted @ 2023-08-30 08:15  demo007x  阅读(7)  评论(0编辑  收藏  举报