Skip to content

Auth

Auth adds credentials to a request: an Authorization header, an API key, an OAuth 2.0 access token that Zorvik fetches for you, a signature made for every send, or the answer to the server’s challenge. You can set it in three places:

WhereHow
A requestThe request’s Auth tab
A folderRight-click the folder → Folder settings… → Auth
The workspaceWorkspace menu → Workspace settings… → Default auth

Set auth once on a folder or the workspace, and leave its requests on Inherit from parent. See Inheritance.

Type (menu)In the file (auth.type)Sends
Inherit from parentinherit (the default; not written to the file)Whatever the folder or workspace uses
No authnoneNothing
Basic authbasicAuthorization: Basic <base64 of username:password>
Bearer tokenbearerAuthorization: Bearer <token>
API keyapiKeyA header or a query parameter with your key
OAuth 2.0oauth2Authorization: Bearer <access token>, with the token fetched, cached and refreshed
OAuth 1.0oauth1A signed Authorization: OAuth … header (or query parameters)
JWT (signed by Zorvik)jwtA token Zorvik signs from your claims, as Authorization: Bearer <token> or a query parameter
Digest authdigestThe answer to the server’s Digest challenge
NTLM (Windows)ntlmThe NTLMv2 handshake with the server
AWS Signature v4awsSigV4A signed Authorization: AWS4-HMAC-SHA256 … header, or a presigned URL
HawkhawkA signed Authorization: Hawk … header
Akamai EdgeGridakamaiEdgeGridA signed Authorization: EG1-HMAC-SHA256 … header
Atlassian ASAPasapA short-lived JWT signed with your service’s key, as Authorization: Bearer <token>

The signing types (OAuth 1.0, JWT, AWS, Hawk, EdgeGrid, ASAP) are signed for every send, after pre-request scripts ran, over the final method, URL, headers and body, with a fresh timestamp and nonce. In load tests each request is signed separately. Digest and NTLM can’t be load tested: they answer a challenge on the connection that received it.

When the request’s auth is not inherited, the Auth tab shows its type, for example Auth Bearer.

Every text field accepts {{variables}}. Keep real credentials in secret variables, not in the fields themselves:

  • Inherit from parent uses the auth of the nearest folder that sets one, else the workspace’s Default auth. New requests start here.
  • No auth sends no credentials and stops inheritance: the folder’s and workspace’s auth are not used for this request.

The workspace’s Default auth can’t inherit; its default is No auth.

FieldExample
Username{{username}}
Password{{password}}

Sends Authorization: Basic followed by the Base64 of username:password (after variables are resolved).

auth:
type: basic
username: "{{username}}"
password: "{{password}}"
FieldDefaultMeaning
TokenThe token, e.g. {{token}}
PrefixBearerSent as Authorization: <prefix> <token>. Leave it empty to send the bare token, or use another scheme such as Token.
auth:
type: bearer
token: "{{token}}"
prefix: Bearer
FieldDefaultMeaning
KeyX-API-KeyThe header name, or the query parameter name
ValueThe key, e.g. {{apiKey}}
Add toHeaderHeader or Query parameter
  • Header: sends Key: Value. If the request already has a header with that name (set by you, a folder or the workspace), the API key is not added.
  • Query parameter: appends key=value to the URL, URL-encoded, after any existing query parameters. It isn’t shown in the Params table.
  • With an empty Key, nothing is added.
auth:
type: apiKey
key: api_key
value: "{{apiKey}}"
location: query # header (default) or query

Zorvik gets an access token from your identity provider and sends it as Authorization: Bearer <token>. It supports four grant types:

Grant type (menu)In the file (grantType)How the token is obtained
Client credentialsclientCredentialsAutomatically when you send
PasswordpasswordAutomatically when you send, with a username and password
Authorization codeauthorizationCodeYou sign in once in your browser with Get token; PKCE by default
Implicit (legacy)implicitYou sign in with Get token; the token comes back in the redirect itself, without a token URL. Older single-page apps use it; prefer the authorization code with PKCE when the provider offers it.
FieldGrant typesDefaultMeaning
Grant typeallClient credentialsSee above
Authorization URLAuthorization code, implicitThe provider’s authorize endpoint, e.g. https://id.example.com/oauth/authorize
Token URLall but implicitThe provider’s token endpoint
Client IDall
Client secretall but implicitLeave empty for public clients
Username, PasswordPasswordThe resource owner’s credentials
Redirect URIAuthorization code, implicithttp://127.0.0.1:53682/callbackWhere the provider sends you back; Zorvik listens there while you sign in
ScopeallSpace-separated scopes, e.g. read write
AudienceallSent as audience when set (used by some providers)
Client authallBasic auth headerHow the client ID and secret reach the token endpoint: Basic auth header or In request body
PKCEAuthorization codeOnUse PKCE (S256)
Header prefixallBearerSent as Authorization: <prefix> <token>; empty sends the bare token
auth:
type: oauth2
grantType: clientCredentials # clientCredentials | password | authorizationCode
tokenUrl: https://id.example.com/oauth/token
clientId: "{{clientId}}"
clientSecret: "{{clientSecret}}"
scope: orders:read
clientAuth: basicHeader # basicHeader | body
headerPrefix: Bearer
redirectUri: http://127.0.0.1:53682/callback
pkce: true

Zorvik asks the Token URL for a token with a POST:

  • Content-Type: application/x-www-form-urlencoded and Accept: application/json
  • grant_type: client_credentials, password (plus username and password), or authorization_code (plus code, redirect_uri and, with PKCE, code_verifier)
  • scope and audience, when set
  • The client credentials: with Basic auth header, an Authorization: Basic header made of the URL-encoded client ID and secret; with In request body, client_id and (when not empty) client_secret as form fields

The response may be JSON or form-encoded. Zorvik reads access_token (required), expires_in, refresh_token and scope. An error in the response fails the send with Token request failed, the status, the error and its error_description.

Token requests go through the same proxy and certificate settings as your requests.

Below the fields, a box shows the token Zorvik has for this configuration:

  • Token and the start and end of the token (for example eyJhbG…9xQw), Expires or Expired with the time, or No expiry, and refresh token available when there is one.
  • Without a token: No token yet. Sign in to get one. (authorization code) or No cached token. One is requested automatically when you send.
ButtonDoes
Get tokenAuthorization code: starts the browser sign-in (below)
Fetch tokenClient credentials and password: requests a new token now, even if one is cached
ClearForgets the cached token

When you send a request with OAuth 2.0:

  1. If a cached token is still valid for at least 30 more seconds, it is used. A token without expires_in is used until you clear it.
  2. If it expired and there is a refresh token, Zorvik refreshes it (grant_type=refresh_token). A new refresh token from the provider replaces the old one; otherwise the old one is kept.
  3. Otherwise, client credentials and password grants fetch a new token. The authorization code grant can’t sign in by itself: the send fails with No valid OAuth 2.0 token. Open the Auth tab and click “Get token” to sign in.

The token is cached per workspace on this computer, and per identity: the grant type, token URL, authorization URL, client ID, client secret, scope, audience, username and password, after variables are resolved. So:

  • Every request with the same OAuth configuration (typically, all requests inheriting it from one folder) shares one token.
  • Switching to an environment with other credentials uses, and fetches, a separate token.
  • Tokens are never shared between workspaces.

Tokens are stored in the app data folder (oauth-tokens.json), readable only by your user on macOS and Linux, and survive restarts. They are never written to the workspace.

  1. Register the Redirect URI with your identity provider. The default is http://127.0.0.1:53682/callback. It must be http:// with the host 127.0.0.1, localhost or [::1], and include a port.
  2. Choose Get token. Zorvik starts listening on that address and opens the Authorization URL in your default browser, with response_type=code, client_id, redirect_uri, a random state, scope and audience when set, and, with PKCE, an S256 code_challenge.
  3. Sign in and approve. The provider redirects your browser back to Zorvik, which shows Signed in. You can close this tab and return to Zorvik.
  4. Zorvik exchanges the code for a token and shows Token received.

Details:

  • You have 5 minutes to finish signing in; after that, Timed out waiting for the sign-in to finish in the browser.
  • A redirect whose state doesn’t match is answered but ignored, so another web page can’t complete or cancel your sign-in. Other paths on that port get 404.
  • If the provider redirects with an error, the sign-in fails with that error and its description.
  • If the port is taken, Could not listen on 127.0.0.1:53682 for the OAuth redirect. Choose another port and register that URI instead.
  • The Authorization URL must start with http:// or https://.
  • Implicit grant: the same steps, but the authorization URL asks for response_type=token and the provider puts the token in the redirect’s #fragment, which browsers never send to a server. The page Zorvik shows at the redirect reads the fragment and hands it to Zorvik, then says Signed in. The token has no refresh token: sign in again when it expires.

Signs each request with OAuth 1.0a (RFC 5849), as Twitter/X, older Atlassian and many enterprise APIs expect.

FieldDefaultMeaning
Signature methodHMAC-SHA1HMAC-SHA1, HMAC-SHA256, HMAC-SHA512, RSA-SHA1, RSA-SHA256, RSA-SHA512 or PLAINTEXT
Consumer key, Consumer secretYour app’s credentials (the secret for HMAC and PLAINTEXT)
Private keyRSA methods: a PEM private key (PKCS#1 or PKCS#8) instead of the consumer secret
Token, Token secretThe user’s access token and its secret, when you have them
Callback URL, Verifier, RealmSent when set
Send oauth_version=1.0On
Sign the bodyOffAdds oauth_body_hash (for JSON and other bodies that aren’t form data)
Add toAuthorization headerOr the query string

The query parameters and, for application/x-www-form-urlencoded bodies, the form fields are part of the signature. Every send gets a new timestamp and nonce.

auth:
type: oauth1
consumerKey: "{{consumerKey}}"
consumerSecret: "{{consumerSecret}}"
token: "{{accessToken}}"
tokenSecret: "{{tokenSecret}}"
signatureMethod: HMAC-SHA256

Zorvik builds and signs a fresh JSON Web Token for every send, from claims you write.

FieldDefaultMeaning
AlgorithmHS256HS256/384/512 (a shared secret), RS256/384/512 and PS256/384/512 (an RSA key), ES256/384 (an EC key)
Secret / Private keyHS: the secret (The secret is base64 to decode it first). Others: a PEM private key; RSA keys of 2048, 3072 or 4096 bits (PKCS#1 or PKCS#8), EC keys as PKCS#8 or SEC1 with their public part
Payload{"sub": "1234567890"}The claims, as JSON. Variables work: {"sub": "{{userId}}", "iat": {{$timestamp}}, "exp": {{$timestamp(+1h)}}}
HeaderExtra header fields as JSON, such as {"kid": "key-1"} (alg and typ are set for you)
Add toAuthorization headerWith Prefix (Bearer; empty sends the bare token), or a query parameter named Parameter (token)

A payload that isn’t a JSON object, or a key that doesn’t fit the algorithm, stops the send with an error saying what to change.

HTTP Digest (RFC 7616 and RFC 2617). Zorvik sends the request, reads the server’s 401 challenge and sends it again with the answer, on the same connection.

FieldMeaning
Username, PasswordYour credentials

The rest comes from the server’s challenge: algorithms MD5, MD5-sess, SHA-256, SHA-256-sess and SHA-512-256, qop auth (preferred) or auth-int (the body is signed too), opaque, userhash, and non-ASCII usernames (username*). A wrong password gets the server’s 401 as the response. Request sent in the response’s Info tab shows the Authorization: Digest … header of the second attempt; the time includes both round trips.

NTLMv2, for IIS, SharePoint, Exchange and other Windows servers.

FieldMeaning
Usernameuser, DOMAIN\user or user@domain
Password
Domain, WorkstationOptional; the domain is taken from the username when it has one

Zorvik sends the negotiate message, answers the server’s challenge and sends the request again, all on one connection, so NTLM always uses HTTP/1.1 (choosing HTTP/2 for the request is refused). The server’s timestamp is used when it sends one. Servers that require Extended Protection (channel binding over TLS) or Kerberos refuse it.

Signs each request for AWS: API Gateway, S3, Lambda function URLs, OpenSearch and the other services.

FieldMeaning
Access key, Secret keyYour credentials, e.g. {{awsAccessKeyId}} and {{awsSecretAccessKey}}
Session tokenFor temporary credentials (STS, SSO): sent as X-Amz-Security-Token
Regione.g. eu-west-1
Servicee.g. execute-api, s3, lambda, es
Add toAuthorization header (with X-Amz-Date), or Query string (presigned URL), valid for an hour

The signature covers the method, the path (encoded as the service expects; S3 is different), the query, the Host header, your headers (not User-Agent, Authorization and a few connection headers) and a hash of the body. For S3, X-Amz-Content-Sha256 is added; set it yourself (for example UNSIGNED-PAYLOAD) to sign differently.

FieldMeaning
Hawk ID, Hawk keyYour credentials
AlgorithmSHA-256 (default) or SHA-1
Extra data (ext), App ID, Delegation (dlg)Sent when set
Sign the bodyAdds the payload hash (Content-Type and body); the server must check it

For Akamai’s APIs. Put the host from your .edgerc (akab-….luna.akamaiapis.net) in the URL.

FieldMeaning
Client token, Client secret, Access tokenFrom your .edgerc or API client
Headers to signUsually empty; comma-separated names
Max bodyBytes of a POST body in the signature (131072, Akamai’s default)

Atlassian’s service-to-service auth: a JWT your service signs, valid for a short time.

FieldDefaultMeaning
IssuerYour service
AudienceThe receiving service (comma-separated for several)
Key IDThe kid the receiver finds your public key by, e.g. my-service/key-1
Private keyPEM
AlgorithmRS256RS, PS or ES
SubjectOptional
Expires in3600Seconds (at most 3600)
Extra claimsOptional JSON

Each send gets a new token with iat, exp and a unique jti.

A request left on Inherit from parent uses the first auth it finds, looking:

  1. at its own folder, then each folder above it, up to the top of the collection, skipping folders that inherit too;
  2. then at the workspace’s Default auth.
Workspace Default auth: No auth
└── Payments/ Auth: OAuth 2.0 (client credentials)
├── Refunds/ Auth: Inherit from parent
│ └── Create refund Auth: Inherit from parent → OAuth 2.0 from Payments/
└── Health check Auth: No auth → nothing

A request that isn’t saved yet only inherits from the workspace, because it isn’t in a folder yet.

When you set an Authorization header yourself

Section titled “When you set an Authorization header yourself”

An Authorization header in the Headers of the request, a folder or the workspace wins over every auth type that uses it: Basic, Bearer, OAuth 2.0 and 1.0, JWT, Digest, NTLM, AWS, Hawk, EdgeGrid and ASAP add nothing (and no OAuth token is fetched). An API key header is skipped when a header with the same name exists.

No auth stops inherited auth, but not inherited headers: an Authorization header set in a folder’s or the workspace’s headers is still sent.

WebSocket, Socket.IO, event stream (SSE) and gRPC requests have the same Auth tab (for Socket.IO it becomes a header of the handshake). MQTT clients log in with the Basic auth username and password.

Imports bring auth along: every Postman auth type listed above, with its settings, and OpenAPI security schemes (Basic, Bearer, Digest, API keys and every OAuth 2.0 flow, with placeholders such as {{bearerToken}} and {{clientId}} in the new environment). See Import & export.