魔法链接

魔法链接或电子邮件链接是一种无需密码即可验证用户身份的方式。当用户输入其电子邮件地址时,会向其电子邮件发送一个链接。当用户点击该链接时,即可完成身份验证。

安装

添加服务器插件

将魔法链接插件添加到您的服务器:

server.ts
import { betterAuth } from "better-auth";
import { magicLink } from "better-auth/plugins";

export const auth = betterAuth({
    plugins: [
        magicLink({
            sendMagicLink: async ({ email, token, url }, request) => {
                // send email to user
            }
        })
    ]
})

添加客户端插件

将魔法链接插件添加到您的客户端:

auth-client.ts
import { createAuthClient } from "better-auth/client";
import { magicLinkClient } from "better-auth/client/plugins";
export const authClient = createAuthClient({
    plugins: [
        magicLinkClient()
    ]
});

使用方法

使用魔法链接登录

要使用魔法链接登录,您需要调用 signIn.magicLink,并提供用户的电子邮件地址。sendMagicLink 函数将被调用,以向用户的电子邮件发送魔法链接。

POST
/sign-in/magic-link
const { data, error } = await authClient.signIn.magicLink({    email: "user@email.com", // required    name: "my-name",    callbackURL: "/dashboard",    newUserCallbackURL: "/welcome",    errorCallbackURL: "/error",});
PropDescriptionType
email
发送魔法链接的电子邮件地址。
string
name?
用户显示名称。仅在用户首次注册时使用。
string
callbackURL?
魔法链接验证后的重定向 URL。
string
newUserCallbackURL?
新用户注册后的重定向 URL
string
errorCallbackURL?
验证时发生错误的重定向 URL 如果仅提供了 callbackURL 但未提供 errorCallbackURL,则用户将被重定向到 callbackURL,并带有 error 查询参数。
string

如果用户尚未注册,除非将 disableSignUp 设置为 true,否则用户将自动注册。

验证魔法链接

当您将 sendMagicLink 函数生成的 URL 发送给用户时,用户点击链接将完成身份验证,并重定向到 signIn.magicLink 函数中指定的 callbackURL。如果发生错误,用户将被重定向到带有错误查询参数的 callbackURL

如果未提供 callbackURL,用户将被重定向到根 URL。

如果您想手动处理验证(例如,如果您向用户发送了不同的 URL),可以使用 verify 函数。

GET
/magic-link/verify
const { data, error } = await authClient.magicLink.verify({    token: "123456", // required    callbackURL: "/dashboard",});
PropDescriptionType
token
验证令牌。
string
callbackURL?
魔法链接验证后的重定向 URL,如果未提供则返回会话。
string

配置选项

sendMagicLink:当用户请求魔法链接时,会调用 sendMagicLink 函数。它接受一个包含以下属性的对象:

  • email:用户的电子邮件地址。
  • url:要发送给用户的 URL。该 URL 包含令牌。
  • token:如果您想使用自定义 URL 发送令牌,则为令牌。

以及第二个参数 request 对象。

expiresIn:指定魔法链接过期的时间(以秒为单位)。默认值为 300 秒(5 分钟)。

disableSignUp:如果设置为 true,用户将无法使用魔法链接注册。默认值为 false

generateToken:调用 generateToken 函数来生成用于唯一标识用户的令牌。默认值为随机字符串。有一个参数:

  • email:用户的电子邮件地址。

使用 generateToken 时,请确保返回的字符串难以猜测, 因为它以机密方式用于验证某人的真实身份。 默认情况下,我们返回一个长且加密安全的字符串。

storeToken:调用 storeToken 函数将魔法链接令牌存储到数据库中。默认值为 "plain"

storeToken 函数可以是以下之一:

  • "plain":令牌以明文形式存储。
  • "hashed":使用默认哈希器对令牌进行哈希。
  • { type: "custom-hasher", hash: (token: string) => Promise<string> }:使用自定义哈希器对令牌进行哈希。

On this page