一段时间以来,我一直想为我的个人网站添加身份验证,以了解它在 Astro 中的工作原理。由于 Prisma 和 PlanetScale 已经在我的博客上
征求意见,我决定将我的帐户信息存储在 PlanetScale 中。 因为它只是用于我自己的帐户,并且我没有在我的数据库中存储任何其他敏感信息,所以我决定暂时以纯文本形式存储凭据。 我更改了我的 Prisma 模式以使其成为可能:
<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code>// schema.prisma
model Account {
id Int @id @default(autoincrement())
username String @unique
password String
}
</code></span></span>
在代码中更新模型后,运行npx prisma db push
会将更改传播到 PlanetScale,因此架构会在实际数据库中更新。
我使用一个现有的包@astro-auth
来处理我网站上的所有身份验证。
为此,我需要向我的应用程序添加 2 个环境变量:(ASTROAUTH_URL
托管我网站的 URL)和ASTROAUTH_SECRET
(一个自选密钥)。
因为我将凭据存储在 PlanetScale 中,所以我需要使用 来CredentialProvider
启用使用用户名和密码登录。
上还有许多其他提供程序可用@astro-auth
,如果您有兴趣,请查看软件包。
设置它所需的代码@astro-auth
如下所示:
<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code><span style="color:var(--syntax-comment-color)">// /pages/api/auth/[...astroauth].ts</span>
<span style="color:var(--syntax-declaration-color)">import</span> <span style="color:var(--syntax-name-color)">AstroAuth</span> <span style="color:var(--syntax-declaration-color)">from</span> <span style="color:var(--syntax-string-color)">'</span><span style="color:var(--syntax-string-color)">@astro-auth/core</span><span style="color:var(--syntax-string-color)">'</span><span style="color:var(--syntax-text-color)">;</span>
<span style="color:var(--syntax-declaration-color)">import</span> <span style="color:var(--syntax-text-color)">{</span> <span style="color:var(--syntax-name-color)">CredentialProvider</span> <span style="color:var(--syntax-text-color)">}</span> <span style="color:var(--syntax-declaration-color)">from</span> <span style="color:var(--syntax-string-color)">'</span><span style="color:var(--syntax-string-color)">@astro-auth/providers</span><span style="color:var(--syntax-string-color)">'</span><span style="color:var(--syntax-text-color)">;</span>
<span style="color:var(--syntax-declaration-color)">import</span> <span style="color:var(--syntax-text-color)">{</span> <span style="color:var(--syntax-name-color)">prisma</span> <span style="color:var(--syntax-text-color)">}</span> <span style="color:var(--syntax-declaration-color)">from</span> <span style="color:var(--syntax-string-color)">'</span><span style="color:var(--syntax-string-color)">../../../lib/prisma</span><span style="color:var(--syntax-string-color)">'</span><span style="color:var(--syntax-text-color)">;</span>
<span style="color:var(--syntax-declaration-color)">export</span> <span style="color:var(--syntax-declaration-color)">const</span> <span style="color:var(--syntax-name-color)">all</span> <span style="color:var(--syntax-erro