When WIPO DAS forwards a document retrieval request to an office of first filing (OFF), the request must be authenticated using an OAuth2 bearer token. Two authentication setups are supported:
Option 1 – WIPO authorization server (recommended for new offices): WIPO obtains a token from its own OpenAM OAuth2 server and forwards it with the request. The receiving office validates the token against WIPO's published JWKS endpoint. No OAuth2 infrastructure is required on the office side.
Option 2 – Mutual authorization server: The office operates its own OAuth2 server. WIPO queries that server to obtain a token before forwarding requests. This is the model currently used with USPTO.
The sequence below describes option 1, where WIPO's OpenAM server issues the token.
{
"access_token": "eyJ0eXAiOiJKV1QiLC...<token string>",
"scope": "das-api/office-exchange",
"token_type": "Bearer",
"expires_in": 3599
}Authorization header as a bearer token:Authorization: Bearer eyJ0eXAiOiJKV1QiLC...<token string>
Token validation: Upon receiving the request, the office validates the token by fetching WIPO's JWKS endpoint and verifying the token signature. See section 3 for the full validation procedure.
Extract the kid (key ID) and alg fields from the JWT header (the first Base64URL-decoded segment of the token). Example token header:
{
"typ": "JWT",
"kid": "lhWqTAfIEkodBo2nUGi3liFJG1U=",
"alg": "RS256"
}Retrieve the current key set from WIPO's JWKS URL (see section 5 for environment-specific URLs). The response contains an array of JSON Web Keys:
{
"keys": [
{
"kty": "RSA",
"kid": "lhWqTAfIEkodBo2nUGi3liFJG1U=",
"use": "sig",
"alg": "RS256",
"x5t": "SX7iI3yi9q5hGy7jPvJmjc5T0vY",
"x5c": ["MIIE1DCCA7ygAw...<certificate chain>"],
"n": "<RSA modulus, Base64URL-encoded>",
"e": "AQAB"
}
]
}kid value matches the kid from the token header. If no match is found, the token must be rejected. Keys should be cached (respecting HTTP cache headers) to avoid fetching the JWKS on every request; however, if a kid is not found in the cached set, the cache should be refreshed once before rejecting.n and e for RSA, or the certificate from x5c), verify the token's signature using the algorithm specified in alg (currently RS256). Standard JWT libraries handle this step natively once the matching JWK is provided.After the signature check, validate the standard JWT claims:
exp — token must not be expirediat — issued-at time should be in the pastscope — must include das-api/office-exchangeiss — issuer should match the expected WIPO OpenAM issuer URLjsonwebtoken for Node.js, PyJWT for Python, nimbus-jose-jwt for Java) accept a JWKS URI directly and handle key fetching, matching, and signature verification automatically. Manual key parsing is rarely necessary.| Field | Description |
|---|---|
kty | Key type. Currently RSA for all WIPO DAS keys. |
kid | Key ID. Used to match the key against the kid field in the JWT header. |
use | Intended key usage. sig indicates the key is used for signature verification. |
alg | Signing algorithm. Currently RS256 (RSA + SHA-256). |
x5t | Base64URL-encoded SHA-1 thumbprint of the X.509 certificate. |
x5c | X.509 certificate chain in PEM format (Base64-encoded DER). Can be used directly to verify the signature as an alternative to n/e. |
n | RSA modulus (Base64URL-encoded). Used with e to construct the RSA public key. |
e | RSA public exponent (Base64URL-encoded). Typically AQAB (= 65537). |
| Environment | JWKS URL |
|---|---|
| Production | https://www3.wipo.int/am/oauth2/connect/jwk_uri |
| Test / UAT | https://www5.wipo.int/am/oauth2/connect/jwk_uri |
| External reference: Introduction to JWKS (Authgear) · WIPO DAS REST API FAQ |