Skip to main content
Version: 2.x

Magic.Link Authentication


The following CLI command will install required packages and generate boilerplate code and files for Redwood Projects:

yarn rw setup auth magicLink

If you prefer to manually install the package and add code, run the following command and then add the required code provided in the next section.

cd web
yarn add @redwoodjs/auth magic-sdk


To get your application keys, go to then navigate to the API keys add them to your .env.

Including Environment Variables in Serverless Deployment: in addition to adding the following env vars to your deployment hosting provider, you must take an additional step to include them in your deployment build process. Using the names exactly as given below, follow the instructions in this document to "Whitelist them in your redwood.toml".

import { useAuth, AuthProvider } from '@redwoodjs/auth'
import { Magic } from 'magic-sdk'
import { FatalErrorBoundary } from '@redwoodjs/web'
import { RedwoodApolloProvider } from '@redwoodjs/web/apollo'

import FatalErrorPage from 'src/pages/FatalErrorPage'
import Routes from 'src/Routes'

import './index.css'

const m = new Magic(process.env.MAGICLINK_PUBLIC)

const App = () => (
<FatalErrorBoundary page={FatalErrorPage}>
<AuthProvider client={m} type="magicLink">
<RedwoodApolloProvider useAuth={useAuth}>
<Routes />

export default App
import { useAuth } from '@redwoodjs/auth'
import { Router, Route } from '@redwoodjs/router'

const Routes = () => {
return (
<Router useAuth={useAuth}>
<Route path="/" page={HomePage} name="home" />
<Route notfound page={NotFoundPage} />

export default Routes


The Redwood API does not include the functionality to decode authentication tokens, so the client is initiated and decodes the tokens inside of getCurrentUser.


First, you must manually install the Magic Admin SDK in your project's api/package.json.

yarn workspace api add @magic-sdk/admin


To get your application running without setting up Prisma, get your SECRET KEY from Then add MAGICLINK_SECRET to your .env.

import { Magic } from '@magic-sdk/admin'

export const getCurrentUser = async (_decoded, { token }) => {
const mAdmin = new Magic(process.env.MAGICLINK_SECRET)

return await mAdmin.users.getMetadataByToken(token)
} recommends using the issuer as the userID to retrieve user metadata via Prisma

import { Magic } from '@magic-sdk/admin'

export const getCurrentUser = async (_decoded, { token }) => {
const mAdmin = new Magic(process.env.MAGICLINK_SECRET)
const { email, publicAddress, issuer } = await mAdmin.users.getMetadataByToken(token)

return await db.user.findUnique({ where: { issuer } })