使用 Postman 进行 OAuth 2.0 授权码授予(第一部分)
概述
在本系列博客文章中,我们将向您展示在使用Keycloak和Postman时, OAuth 2.0 授权码授予的底层工作原理。
在第一部分,我们将探讨 OAuth 2.0 授权的工作原理;在接下来的部分中,我们将向您展示授权码流程存在的问题,以及如何使用 Postman 通过PKCE解决这个问题。
要求
要按照本文中的步骤在本地计算机上操作,您需要运行Keycloak服务器、创建Keycloak域,并且至少创建一个用户。此外,您的本地计算机上还需要安装Postman 。
授权码的授权类型是什么?
在授权码授权过程中,客户端首先将用户的浏览器重定向到授权服务器的授权端点。授权服务器随后对用户进行身份验证,并请求用户同意授予其对应用程序的访问权限。如果获得批准,授权服务器会将浏览器重定向到客户端控制的 URI,其中包含一个授权码。之后,客户端可以调用授权服务器的令牌端点,将授权码交换为访问令牌,从而代表用户访问 API。
Postman可以轻松地在授权码授予流程中扮演客户端角色。我们还可以从任何支持OAuth 2.0标准的授权服务器获取访问令牌。这里我们使用Keycloak服务器来扮演授权服务器的角色。
授权码流程
步骤 1
第一步,我们需要填写所有必需的OAuth 2.0配置选项,然后在Postman授权选项卡中单击“获取新的访问令牌” 。
- 身份验证 URL:
{server}/auth/realms/{realm}/protocol/openid-connect/auth - 访问令牌 URL:
{server}/auth/realms/{realm}/protocol/openid-connect/token
步骤 2
Postman会使用其内置浏览器将用户重定向到Keycloak的身份验证端点。Postman在此重定向中包含客户端 ID ( ) 和所需的范围 ( ) 。client_idscope
HTTP 200
GET https://KEYCLOAKDOMAIN/auth/realms/test-realm/protocol/openid-connect/auth?
response_type=code&
client_id=CLIENTID&
state=state_value&
scope=offline_access&
redirect_uri=https://localhost:8081/test-callback
ℹ️ Keycloak或我们使用的任何授权服务器都要求客户端的重定向 URI 预先注册,以防止开放重定向攻击。
步骤 3
Keycloak加载 HTML 表单并验证用户身份,然后请求用户同意授予客户端(Postman)访问权限。
<form
action="https://KEYCLOAKDOMAIN/auth/realms/test-realm/login-actions/authenticate?session_code=o0Do5Ts1tzEp3E6FcIxO3qxJtT_PuiFNdG2fJloYfyw&execution=8ac4f6a5-7f35-4db7-9f5b-90953e7ddebd&client_id=test-client&tab_id=uxX7xjpChS8"
method="post">
<input name="username" type="text"/>
<input name="password" type="password"/>
<input type="hidden" id="id-hidden-input" name="credentialId" />
<input name="login" value="Sign In"/>
</form>
第四步
用户通过填写并提交表单来验证请求。
第五步
如果Keycloak批准了用户,则Keycloak会将 Web 浏览器重定向到客户端( Postmanredirect_uri )控制的URI( ) ,其中包含授权码()和原始状态值作为查询参数。code
HTTP 302
Response Header:
Location: https://localhost:8081/test-callback?
state=state_value&
code=183c6a33-b96d-4b33-aaf0-b7e74ca13675.60d1c32a-c664-4a73-a6b2-60fcc8e43aee.7306139f-c07c-4adc-b175-f6c509b80964
⚠️ 在重定向 URL 的查询参数中传递授权码容易被恶意脚本窃取或泄露到服务器日志、浏览器历史记录中。
步骤 6
现在,Postman调用授权服务器(Keycloak)的令牌端点,以交换授权码来获取访问令牌,从而代表用户访问资源服务器API。它将授权码放在 POST 请求的正文中发送,并使用以下参数进行编码,授权标头以 base64 编码格式application/X-WWW-form-urlencoded提供客户端凭据:client_id:client_secret
HTTP 200
POST https://KEYCLOAKDOMAIN/auth/realms/test-realm/protocol/openid-connect/token
Content-Type: application/x-www-form-urlencoded
Authorization: Basic dGVzdC1jbGllbnQ6aUxUTGFJelNuM3pUdVAyZHhMY2FJc3JiVldNQXZkNzg=
Body:
grant_type: "authorization_code"
code: "183c6a33-b96d-4b33-aaf0-b7e74ca13675.60d1c32a-c664-4a73-a6b2-60fcc8e43aee.7306139f-c07c-4adc-b175-f6c509b80964"
redirect_uri: "https://localhost:8081/test-callback"
client_id: "CLIENTID"
步骤 7
如果授权码有效且未过期,则Keycloak将在编码正文中返回访问令牌,application/json以及有关令牌范围和过期时间的一些可选详细信息。
HTTP 200
Content-Type: application/json
Body:
access_token: "eyJh...",
expires_in: 300,
refresh_expires_in: 0,
refresh_token: "eyJh...",
token_type: "Bearer",
not-before-policy: 0,
session_state: "60a62786-1bf3-4a78-b4e2-89d414ee2026",
scope: "offline_access email profile"
第 8 步
Postman获取到访问令牌后,可以通过将其包含在 HTTP 请求的标头中来访问资源服务器Authorization: Bearer eyJh...API 。
包起来
在这篇博文中,我们向您展示了 OAuth 2.0 授权码流程的工作原理以及Postman如何为我们完成这项工作。


