Skip to content

Instantly share code, notes, and snippets.

@mattfysh
Last active June 7, 2023 14:45
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save mattfysh/14d37f808583e444be6f40bc939ebe38 to your computer and use it in GitHub Desktop.
Save mattfysh/14d37f808583e444be6f40bc939ebe38 to your computer and use it in GitHub Desktop.
urql + auth-exchange + aws-amplify
import { makeOperation } from '@urql/svelte'
import { authExchange } from '@urql/exchange-auth'
import { Auth } from 'aws-amplify'
import produce from 'immer'
import { set } from 'lodash'
const amplifyAuthExchange = authExchange({
addAuthToOperation: ({ authState, operation }) => {
if (!authState?.token) {
return operation
}
const newContext = produce(operation.context, context => {
set(context, 'fetchOptions.headers.Authorization', authState.token)
})
return makeOperation(operation.kind, operation, newContext)
},
willAuthError: ({ authState }) => {
try {
const [,payload] = authState.token.split('.')
const { exp } = JSON.parse(Buffer.from(payload, 'base64'))
return exp * 1000 < Date.now()
} catch(e) {
return true
}
},
didAuthError: ({ error }) =>
error.graphQLErrors.some(e => e.message === 'Unauthorized'),
getAuth: async () => {
const session = await Auth.currentSession()
if (session) {
// defines the authState elsewhere
return {
token: session.getAccessToken().getJwtToken(),
}
}
Auth.signOut()
return null
},
})
@aseer-ws
Copy link

aseer-ws commented Jun 7, 2023

In the latest version of @urql/exchange-auth, it doesn't getAuth function and I am not able to use Promise inside addAuthToOperation
Do you guys an alternate approach for the latest version @mattfysh @souravjamwal77 ?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment