发布于 2026-01-06 6 阅读
0

使用 Postman 进行 OAuth 2.0 授权码授予(第一部分)

使用 Postman 进行 OAuth 2.0 授权码授予(第一部分)

概述

在本系列博客文章中,我们将向您展示在使用KeycloakPostman时, 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


以下是 Postman 获取令牌所需的 Postman 授权配置选项示例。

步骤 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


Enter fullscreen mode Exit fullscreen mode

ℹ️ Keycloak或我们使用的任何授权服务器都要求客户端的重定向 URI 预先注册,以防止开放重定向攻击。

步骤 3

Keycloak加载 HTML 表单并验证用户身份,然后请求用户同意授予客户端(Postman)访问权限。


这是一个 Keycloak 登录页面示例,它会要求用户输入用户名或电子邮件地址以及密码。



<form 
action="https://KEYCLOAKDOMAIN/auth/realms/test-realm/login-actions/authenticate?session_code=o0Do5Ts1tzEp3E6FcIxO3qxJtT_PuiFNdG2fJloYfyw&amp;execution=8ac4f6a5-7f35-4db7-9f5b-90953e7ddebd&amp;client_id=test-client&amp;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>


Enter fullscreen mode Exit fullscreen mode

第四步

用户通过填写​​并提交表单来验证请求。

第五步

如果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


Enter fullscreen mode Exit fullscreen mode

⚠️ 在重定向 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"

Enter fullscreen mode Exit fullscreen mode




步骤 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"

Enter fullscreen mode Exit fullscreen mode




第 8 步

Postman获取到访问令牌后,可以通过将其包含在 HTTP 请求的标头中来访问资源服务器Authorization: Bearer eyJh...API 。

包起来

在这篇博文中,我们向您展示了 OAuth 2.0 授权码流程的工作原理以及Postman如何为我们完成这项工作。

参考

文章来源:https://dev.to/oneadvanced/oauth-20-authorization-code-grant-with-postman-part-1-5238