Skip to content

自動化取得 SSO Token:告別手動複製貼上到 Postman

背景

測試環境的 API 需要 OAuth 2.0 SSO token,token 很快過期。目前的流程是:

  1. 開瀏覽器,登入測試環境前端
  2. 打開 DevTools → Network tab
  3. 找到帶有 token 的 request,複製 header 中的值
  4. 貼到 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 環境變數。

設定步驟

  1. 在 Collection 或 Request 的 Authorization tab 選 OAuth 2.0
  2. Configure New Token,填入以下欄位:
欄位說明哪裡找
Token Name任意名稱自訂
Grant TypeAuthorization Code固定選這個
Callback URLhttps://oauth.pstmn.io/v1/callbackPostman 預設值
Auth URLSSO 的 authorization endpoint問後端或查 SSO provider 文件
Access Token URLSSO 的 token endpoint同上
Client ID你的 app 的 client id問後端
Client Secret視情況,有些 public client 不需要問後端
Scope視 SSO 設定問後端
  1. 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,繼續發 request

Pre-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。

設定

  1. 安裝 Postman Interceptor Chrome 擴充
  2. 在 Postman 桌面版開啟 Capture requests(右下角的衛星圖示)
  3. 連接 Interceptor
  4. 瀏覽器登入 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 縮短手動步驟)

延伸閱讀