自動化取得 SSO Token:告別手動複製貼上到 Postman
背景
測試環境的 API 需要 OAuth 2.0 SSO token,token 很快過期。目前的流程是:
- 開瀏覽器,登入測試環境前端
- 打開 DevTools → Network tab
- 找到帶有 token 的 request,複製 header 中的值
- 貼到 Postman 的 Authorization header
這個流程不是不能接受,但 token 過期快,重複次數多,每次都要切換視窗、找對 request,很打斷思路。
桌面版 vs Web 版,以及版本限制
本文所有方案都適用於 Postman 桌面版,且桌面版在 OAuth 2.0 flow 上比 Web 版更強。
| 功能 | 桌面版 | Web 版 |
|---|---|---|
| OAuth 2.0 | ✅ 完整支援,含「在瀏覽器授權」 | ✅ 支援,但功能較受限 |
| Pre-request Scripts | ✅ | ✅ |
| Environment Variables | ✅ 完整支援 | ✅ 部分進階功能限桌面版 |
| Interceptor | ✅ macOS v10.17.4+、Windows v10.18+ 內建 | ✅ |
版本限制:
- PKCE 支援:v7.23 以後才有。目前最新版是 v12.1.4(2026/03),基本上不用擔心這個限制。
- Interceptor 內建:macOS 需 v10.17.4+、Windows 需 v10.18+。更舊的版本要另外手動安裝 Interceptor Bridge;Linux 所有版本都需手動安裝。
桌面版獨有的優勢: 方案一的「Authorize using browser」功能——點下去直接開你的預設瀏覽器完成 SSO 登入,callback 自動回 Postman(callback URL 是 https://oauth.pstmn.io/v1/browser-callback),不需要額外設定,對 SSO 場景特別方便。
問題的本質
SSO 的登入流程必須走瀏覽器——這是設計如此,不是 bug。標準的 Authorization Code Flow 長這樣:
你的 App ──redirect──► SSO Provider(Google、Okta、Azure AD...)
│
使用者在瀏覽器登入
│
redirect back
▼
你的 App 拿到 code
│
用 code 換 access_token
▼
token 到手Postman 沒辦法直接用帳密換 token(除非你的 SSO 支援 Resource Owner Password Credentials flow,但現代 SSO provider 幾乎都關閉了這個 flow)。所以問題的核心是:讓 Postman 能代替你走這個瀏覽器流程,或是讓瀏覽器流程只走一次、之後自動續命。
方案一:Postman 內建 OAuth 2.0(推薦優先嘗試)
Postman 支援完整的 OAuth 2.0 Authorization Code flow。設定好之後,它會幫你開一個內嵌瀏覽器,讓你登入 SSO,自動捕捉回來的 token,存進 Postman 環境變數。
設定步驟
- 在 Collection 或 Request 的 Authorization tab 選 OAuth 2.0
- 點 Configure New Token,填入以下欄位:
| 欄位 | 說明 | 哪裡找 |
|---|---|---|
| Token Name | 任意名稱 | 自訂 |
| Grant Type | Authorization Code | 固定選這個 |
| Callback URL | https://oauth.pstmn.io/v1/callback | Postman 預設值 |
| Auth URL | SSO 的 authorization endpoint | 問後端或查 SSO provider 文件 |
| Access Token URL | SSO 的 token endpoint | 同上 |
| Client ID | 你的 app 的 client id | 問後端 |
| Client Secret | 視情況,有些 public client 不需要 | 問後端 |
| Scope | 視 SSO 設定 | 問後端 |
- 點 Get New Access Token → Postman 開瀏覽器 → 用 SSO 帳號登入 → token 自動回填
PKCE(如果 SSO 要求)
現代的 SSO provider(Okta、Azure AD、Auth0)通常要求 PKCE(Proof Key for Code Exchange)。勾選 Authorization Code (with PKCE) 即可,Postman 會自動產生 code_verifier 和 code_challenge。
Token 過期怎麼辦
如果 SSO 有發 refresh token,Postman 會在 access token 過期後自動用它換新的。在 Current Token 區塊能看到過期時間。
這個方案不適用的情況:
- SSO provider 不允許你的 Postman callback URL(需要在 SSO provider 那邊把
https://oauth.pstmn.io/v1/callback加進 allowed redirect URIs) - 公司的 SSO 完全走 SAML(不是 OIDC/OAuth),Postman 無法處理 SAML assertion
方案二:Pre-request Script + Refresh Token(token 過期自動續命)
如果你能取得一次 refresh token,之後每次 request 前都自動換新的 access token,完全不用手動介入。
流程
第一次:手動登入,取得 access_token + refresh_token
→ 把 refresh_token 存進 Postman Environment Variable
→ 之後每次 request 前,Pre-request Script 檢查 access_token 是否過期
→ 過期就自動用 refresh_token 換新的
→ 更新 Environment Variable,繼續發 requestPre-request Script 範例
在 Collection 層級設定,所有 request 都會自動套用:
const tokenExpiry = pm.environment.get("token_expiry");
const now = Date.now();
// token 還沒過期,直接跳過
if (tokenExpiry && now < parseInt(tokenExpiry)) {
return;
}
// token 過期或不存在,用 refresh token 換新的
const refreshToken = pm.environment.get("refresh_token");
if (!refreshToken) {
console.warn("沒有 refresh token,請手動取得並設定環境變數");
return;
}
pm.sendRequest({
url: "https://your-sso-provider.com/oauth/token",
method: "POST",
header: { "Content-Type": "application/x-www-form-urlencoded" },
body: {
mode: "urlencoded",
urlencoded: [
{ key: "grant_type", value: "refresh_token" },
{ key: "refresh_token", value: refreshToken },
{ key: "client_id", value: pm.environment.get("client_id") },
]
}
}, (err, res) => {
if (err || res.code !== 200) {
console.error("Refresh token 換新 access token 失敗", err || res.json());
return;
}
const body = res.json();
pm.environment.set("access_token", body.access_token);
// 提前 30 秒視為過期,避免 race condition
pm.environment.set("token_expiry", Date.now() + (body.expires_in - 30) * 1000);
if (body.refresh_token) {
pm.environment.set("refresh_token", body.refresh_token);
}
});然後在 request 的 Authorization header 設定:
Authorization: Bearer {{access_token}}第一次怎麼拿到 refresh_token
用方案一的流程登入一次,從 Postman 的 token response 複製 refresh_token,手動存進 Environment Variable。之後就不用再動了(直到 refresh token 本身過期,通常是幾天到幾週)。
這個方案不適用的情況:
- SSO 不發 refresh token(純 access token,只能靠方案一每次重新登入)
- refresh token rotation 開啟但沒有更新腳本(每次 refresh 後舊 token 失效,要確保腳本有更新
refresh_token環境變數)
方案三:Postman Interceptor(直接同步瀏覽器 Session)
Postman 有一個 Chrome 擴充套件叫 Postman Interceptor,可以攔截瀏覽器的 request,把 cookies 和 headers 同步進 Postman。
設定
- 安裝 Postman Interceptor Chrome 擴充
- 在 Postman 桌面版開啟 Capture requests(右下角的衛星圖示)
- 連接 Interceptor
- 瀏覽器登入 SSO 後,Interceptor 自動把 cookies 帶入 Postman
適合的情境:
- SSO token 是存在 cookie 裡,而不是 Authorization header
- 系統用 session cookie 做認證,拿不到 Bearer token
限制:
- 需要安裝擴充套件(有些公司環境不允許)
- Cookies 同步,不是 Bearer token 同步,適用場景較窄
方案四:Bookmarklet 快速複製(最小改動)
如果以上方案都不可行(SSO 環境太封閉、無法拿到 refresh token、無法修改 redirect URI),至少可以讓「複製 token」這個動作更快。
在瀏覽器書籤列加一個 bookmarklet,點一下就把 token 複製到剪貼簿:
javascript:(function(){
// 根據你的 header name 修改
const token = document.cookie
.split('; ')
.find(r => r.startsWith('access_token='))
?.split('=')[1];
if (token) {
navigator.clipboard.writeText('Bearer ' + token);
alert('Token 已複製!');
} else {
alert('找不到 token,請確認登入狀態');
}
})();如果 token 在 request header 而不是 cookie,需要先在 DevTools Network tab 找到對應的 request,這個方案就幫不上忙了。
決策流程
你的 SSO 支援 OIDC / OAuth 2.0?
│
├── 是 → SSO provider 允許加 Postman callback URL?
│ │
│ ├── 是 → 用方案一(Postman 內建 OAuth 2.0)
│ │ SSO 有發 refresh token?
│ │ ├── 是 → 再加上方案二的 Pre-request Script
│ │ └── 否 → 方案一即可,token 過期手動重新取得
│ │
│ └── 否 → 用方案二(手動取得一次 refresh token)
│
└── 否(純 SAML)→ 方案三(Postman Interceptor)
或方案四(Bookmarklet 縮短手動步驟)延伸閱讀
- Postman OAuth 2.0 官方文件 — 涵蓋所有 grant type 的完整設定說明,包含 PKCE 和 token 管理
- Postman Pre-request Scripts — 如何在 request 發出前用 JavaScript 設定變數、header、body
- Postman Environment Variables — 環境變數的建立、管理與 scope 說明
- Postman Interceptor — 瀏覽器 extension,支援 Chrome、Firefox、Safari、Edge
- RFC 7636 — PKCE 標準規範 — 為什麼現代 OAuth 需要 PKCE 的 IETF 原始規範