{"record":{"id":"1cb588beea851583","repo":"transloadit/uppy","slug":"missing-token-payload-for-provider-providername","errorCode":null,"errorMessage":"Missing token payload for provider ${providerName}","messagePattern":"Missing token payload for provider (.+?)","errorType":"validation","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/@uppy/companion/src/server/helpers/jwt.ts","lineNumber":81,"sourceCode":"  secret: EncryptionSecret,\n) => {\n  const ret = verifyJwtToken(decrypt(token, secret), secret)\n  if (!ret) throw new Error('No payload')\n  return ret\n}\n\nexport const verifyEncryptedAuthToken = <T extends Record<string, unknown>>(\n  token: string,\n  secret: EncryptionSecret,\n  providerName: string,\n): T => {\n  const json = verifyEncryptedToken(token, secret)\n  if (typeof json !== 'string') {\n    throw new Error('Invalid token payload: expected string')\n  }\n  const tokens: T = JSON.parse(json)\n  if (!isRecord(tokens) || !Object.hasOwn(tokens, providerName))\n    throw new Error(`Missing token payload for provider ${providerName}`)\n  return tokens\n}\n\nfunction getCommonCookieOptions({\n  companionOptions,\n}: {\n  companionOptions: CompanionRuntimeOptions\n}): Record<string, unknown> {\n  const cookieOptions: Record<string, unknown> = {\n    httpOnly: true,\n  }\n\n  // Fix to show thumbnails on Chrome\n  // https://community.transloadit.com/t/dropbox-and-box-thumbnails-returning-401-unauthorized/15781/2\n  // Note that sameSite cookies also require secure (which needs https), so thumbnails don't work from localhost\n  // to test locally, you can manually find the URL of the image and open it in a separate browser tab\n  if (companionOptions.server && companionOptions.server.protocol === 'https') {\n    cookieOptions['sameSite'] = 'none'","sourceCodeStart":63,"sourceCodeEnd":99,"githubUrl":"https://github.com/transloadit/uppy/blob/5d4dedd02a1ac0ae022c75c54aca76558f88e256/packages/@uppy/companion/src/server/helpers/jwt.ts#L63-L99","documentation":"After parsing the auth token, verifyEncryptedAuthToken requires an object that has the specific providerName as an own property (Object.hasOwn). If the stored token map lacks an entry for that provider (e.g. token contains dropbox but the request needs googledrive), it throws 'Missing token payload for provider ${providerName}'.","triggerScenarios":"Calling a provider endpoint (e.g. /drive/list) with a companionAuthToken that was created for a different provider, or after the provider entry was never stored in the token.","commonSituations":"Sharing/reusing one provider's token for another provider's routes, stale tokens from before additional providers were added, or custom flows that build the token map with a subset of providers.","solutions":["Use the auth token generated for the same provider being accessed","Re-authenticate with the target provider so its token is included in the stored payload","When composing tokens manually, include every needed provider key in the map"],"exampleFix":"// before\nconst token = generateEncryptedAuthToken({ dropbox: dbxToken }, secret)\nfetch('/drive/list', { headers: { 'uppy-auth-token': token } }) // googledrive route\n\n// after\nconst token = generateEncryptedAuthToken({ googledrive: gdToken }, secret)\nfetch('/drive/list', { headers: { 'uppy-auth-token': token } })","handlingStrategy":"validation","validationCode":"const tokens = JSON.parse(decodedPayload)\nif (!Object.hasOwn(tokens, providerName)) throw new Error(`client precheck: no token for ${providerName}`)","typeGuard":"const hasProviderToken = (t: unknown, p: string): t is Record<string, unknown> =>\n  typeof t === 'object' && t !== null && Object.hasOwn(t, p);","tryCatchPattern":"try { await providerApi.call() } catch (err) {\n  if (err.message.startsWith('Missing token payload for provider')) { /* re-auth that provider */ }\n}","preventionTips":["Store per-provider tokens keyed exactly by providerName","Re-authenticate when adding a new provider instead of reusing an old token"],"tags":["companion","jwt","oauth","provider","token"],"backgroundTag":"provider-token-missing","analyzedSha":"5d4dedd02a1ac0ae022c75c54aca76558f88e256","analyzedAt":"2026-08-28T12:18:41.267Z","schemaVersion":2},"datasetVersion":"2026-08-28T16:17:29.566Z"}