什么是 OAuth 2.0 授权码授权类型?

demo007x/oauth2-client: Oauth2 Client package for Golang (github.com) 欢迎star

授权代码授权类型可能是您将遇到的最常见的 OAuth 2.0 授权类型。Web 应用程序和本机应用程序都运用它在用户授权应用程序后获取拜访令牌。

这篇文章是咱们探究常用的 OAuth 2.0 授权类型系列文章的榜首部分。假如您想在深入了解 OAuth 2.0 之前稍微回忆一下并了解更多信息,请查看OAuth 到底是什么?

什么是 OAuth 2.0 授权类型?

在 OAuth 2.0 中,术语“授权类型”是指应用程序获取拜访令牌的方式。OAuth 2.0 界说了几种授权类型,包括授权代码流。OAuth 2.0 扩展还能够界说新的授权类型。

每种授权类型都针对特定用例进行了优化,无论是网络应用程序、本机应用程序、无法发动网络浏览器的设备,还是服务器到服务器的应用程序。

授权码流程

Web 和移动应用程序运用授权码授权类型。它与大多数其他授权类型不同,首要要求应用程序发动浏览器以开端流程。在高层次上,该流程具有以下步骤:

  • 应用程序翻开浏览器将用户发送到 OAuth 服务器
  • 用户看到授权提示并批准应用程序的恳求
  • 运用查询字符串中的授权代码将用户重定向回应用程序
  • 应用程序交流拜访令牌的授权代码

取得用户的答应

OAuth 就是让用户能够颁发对应用程序的有限拜访权限。应用程序首要需要决议它恳求的权限,然后将用户发送到浏览器以取得他们的权限。为开端授权流程,应用程序构建如下所示的 URL 并翻开浏览器拜访该 URL。

https://authorization-server.com/auth
 ?response_type=code
 &client_id=29352915982374239857
 &redirect_uri=https%3A%2F%2Fexample-app.com%2Fcallback
 &scope=create+delete
 &state=xcoiv98y2kd22vusuye3kch

以下是对每个查询参数的解说:

  • response_type=code 这告知授权服务器应用程序正在发动授权代码流。
  • client_id 应用程序的公共标识符,在开发人员初次注册应用程序时取得。
  • redirect_uri 告知授权服务器在用户批准恳求后将用户发送回何处。
  • scope 一个或多个空格分隔的字符串,指示应用程序恳求的权限。您运用的特定 OAuth API 将界说它支撑的规模。
  • state 应用程序生成一个随机字符串并将其包括在恳求中。然后它应该查看在用户授权应用程序后是否回来相同的值。这用于避免CSRF 进犯。

当用户拜访此 URL 时,授权服务器将向他们显示一个提示,询问他们是否愿意授权此应用程序的恳求。

【OAuth 详解2】  什么是 OAuth 2.0 授权码授权类型?

重定向回应用程序

假如用户批准恳求,授权服务器会将浏览器重定向回redirect_uri应用程序指定的浏览器,并在查询字符串中添加codeand 。state

例如,用户将被重定向回一个 URL,例如

https://example-app.com/redirect
 ?code=g0ZGZmNjVmOWIjNTk2NTk4ZTYyZGI3
 &state=xcoiv98y2kd22vusuye3kch

state值将与应用程序最初在恳求中设置的值相同。应用程序应查看重定向中的状况是否与它最初设置的状况相匹配。这能够避免 CSRF 和其他相关进犯。

code授权服务器生成的授权码。此代码的生命周期相对较短,通常会继续 1 到 10 分钟,具体取决于 OAuth 服务。

将授权码交流为拜访令牌

咱们即将结束流程。现在应用程序有了授权代码,它能够运用它来获取拜访令牌。

应用程序运用以下参数向服务的令牌端点宣布 POST 恳求:

  • grant_type=authorization_code– 这告知令牌端点应用程序正在运用授权代码授权类型。
  • code– 应用程序包括在重定向中供给的授权代码。
  • redirect_uri– 恳求代码时运用的相同重定向 URI。某些 API 不需要此参数,因此您需要细心查看您正在拜访的特定 API 的文档。
  • client_id– 应用程序的客户端 ID。
  • client_secret– 应用程序的客户端秘要。这保证获取拜访令牌的恳求仅来自应用程序,而不是来自可能阻拦授权代码的潜在进犯者。

令牌端点将验证恳求中的所有参数,保证代码没有过期而且客户端 ID 和密码匹配。假如一切正常,它将生成一个拜访令牌并在呼应中回来它!

HTTP/1.1 200 OK
Content-Type: application/json
Cache-Control: no-store
Pragma: no-cache
​
{
  "access_token":"MTQ0NjJkZmQ5OTM2NDE1ZTZjNGZmZjI3",
  "token_type":"bearer",
  "expires_in":3600,
  "refresh_token":"IwOGYzYTlmM2YxOTQ5MGE3YmNmMDFkNTVk",
  "scope":"create delete"
}

授权码流程完成!该应用程序现在有一个拜访令牌,它能够在宣布 API 恳求时运用。

何时运用授权代码流

授权代码流程最适用于 Web 和移动应用程序。由于授权代码颁发具有为拜访令牌交流授权代码的额定步骤,因此它供给了隐式授权类型中不存在的附加安全层。

假如您在移动应用程序或无法存储客户端秘要的任何其他类型的应用程序中运用授权代码流,那么您还应该运用 PKCE 扩展,它能够避免授权代码可能被进犯的其他进犯阻拦。

代码交流步骤保证进犯者无法阻拦拜访令牌,因为拜访令牌始终经过应用程序和 OAuth 服务器之间的安全反向通道发送。

Golang Oauth2.0 Client

demo007x/oauth2-client: Oauth2 Client package for Golang (github.com) 欢迎star