@ 12- apps/ auth (英语)
作为插件的认证: Auth.js 接线,电子邮件+密码流 屏幕和流动所需的完整页面、可挂载后端表面以及 三个表格,所有它运行在,与 里面没有主机的词汇。 。 。 .
形状与 @12-apps/report-builder故意的 故意的 如果你采纳了
一,你已经知道这个的布局.
| 入境点 | 需求 | 里面有什么东西 |
|---|---|---|
. | 无 | createEmailCredentials、 密码策略、 令牌、 管理员许可列表、 限速器、 设备检测 |
./server | 无( 节点) | 页:1 Auth.js 大桥 (单位:千美元)createApiAuth, (中文(简体) ), auth, (中文(简体) ), handlers, (中文(简体) ), authConfig, (中文(简体) ), credentialsProvider),路由,状态词汇,邮件模板,以及鸭式证书+设置 存储接线 |
./react | 反应,反应 - 大小, @12-apps/ui | 屏幕,整个登录/签名 页次,平台设置屏幕 |
./hono | 哈诺 | 一个 mount 调用整个后端表面 |
./notifications | @12-apps/notifications | createAuthMailer - 四个认证电子邮件通过一个 EmailDriver |
./e2e | @playwright/test, (中文(简体) ), playwright-bdd | 盖克金的旅程及其步骤 |
切入点是不同的 端点永远不要只是一个模块。 每个同伴都是 选项,所以从不使页面安装的后端不会有反应.
. 是光线的一半,这是执行的. 它没有价值——没有
@auth/core,没有反应,没有hono ——所以背景工作 过期的过时的代币
能够 import { hashToken } from '@12-apps/auth' 并且只装上这个。 (原始内容存档于2018-09-21). The Auth.js
运行时间居住于 ./server 出于同样的原因,报告编写者保持
createReportBuilder 在这里. src/__tests__/light-root.test.ts 沿着根走
导入图表,如果事实不再真实,则失败.
表格是软件包的
prisma/auth.prisma 拥有 auth_credentials, (中文(简体) ), auth_tokens 财务报告和审定财务报表
auth_platform_settings他们身边有移民.
pnpm --filter @12-apps/auth prisma:sync # copy the partial into your schema
pnpm --filter @12-apps/auth prisma:sync:check # CI: fail if the copy drifted
这部分是 复制, 绝不对齐数字 : npm pack 放弃对称链接条目,
turbo prune 缠绕着一个所有者不是被宣布的附属者的联系,并且
普里斯马 lstats 迁移目录——所以一个连通的符号被默默地跳出,
它是一个绿色的部署,没有应用任何计划.
每个用户引用都是不透明的 user_id 与 没有外国密钥进入任何主机
图表因此,这些迁移适用于用户生活在下列情况下的回购:
其它名称,在另一个数据库中,或尚未存在.
留在你的身边
有一件事,因为它是 一个包裹不能知道一件事: 谁的用户
为:。 。 。 . EmailIdentityDelegate 是三种方法—— findByEmail, (中文(简体) ), findById, (中文(简体) ),
upsert - 超过自己的用户表。 其他东西都在这儿.
除此之外,真正属于产品的选择:
- 单词 ——每一份拷贝包都需要,从不缺省(
PT_BR_*船舶 每个地表一个; - 商标 页面上的一个插槽,与这个包完全不透明;
- 提供者 一个节点,因为 OAuth 按钮带有 回调 URL 、 同意门和重定向 此软件包不能拥有 ;
- 邮件供应商 - 您将环境命名为 VARIABLES; 哪些服务, 哪些服务
钥匙 地址是你的 它们之间的决议不是:
createEnvAuthMailer拥有水槽 / 供应商 / 拒绝树, 因为每个 它的分支是一个正确性的财产,而不是一个偏好.
相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相 原主机的整条线路现在:
export const authMailer = createEnvAuthMailer({
env: { provider: "NOTIFICATIONS_EMAIL_PROVIDER", apiKey: "RESEND_API_KEY",
from: "NOTIFICATIONS_EMAIL_FROM", sinkFile: "AUTH_EMAIL_LOG_FILE",
origin: ["APP_PUBLIC_URL", "AUTH_URL"] },
drivers: EMAIL_DRIVERS,
log: createFeatureLogger("auth-email"),
});
export const { GET, POST, PUT } = mountEmailAuth({
path: "/api/auth/email",
credentials, messages: PT_BR_MESSAGES, resolveUserId, onSignedUp,
});
安保模式
consumeToken必须 成为有条件的写入( t)UPDATE … WHERE consumed_at IS NULL报告是否影响到一行。 返回值为 单用担保.- 注册和密码重置的答案是 不变 无论是否 地址存在,以及邮件是否离开。 这就是为什么邮递员 解决而不是抛出.
- 部署与 没有 邮件提供者大声拒绝而不是退后 到日志:日志聚合器中的重置链接是日志中的证书 聚会.
requireEmailVerification更改注册 合同不仅仅是它的 安保——见Adopting.md.createInProcessRateLimiter()返回一个InProcessRateLimiter页:1AuthRateLimiter端口( e)check(key)+) 加上 (中文(简体) )retryAfterMs(key),则 毫秒到键 限制范围 获得新窗口( e)0当它是 没有限制,它的窗口已经过期,或者它从未被看到). 只读, 在 已注射now。一个主机回答 429 它变成Retry-After与Math.ceil(ms / 1000)。端口本身没有变化,所以是一个共享的商店 限制器不欠新的.
公约
- 每个地表都是
create*工厂 一个配置对象。 。 。 . - 这里没有读到环境变量.
- 数据库客户端是 鸭子型 (单位:千美元)
AuthDb, (中文(简体) ),AuthSettingsDb);这个 软件包永远不会解决生成的 Prisma 客户端. - 开发者-格式文本为英文;所运出的副本包为pt-BR.
完整接线、终点清单和不明显的决定: 采用.md旅行和驾驭笔记: E2E.m.d (电子数据)。 。 。 .
稳定的登录会话绑定
经核实的会话会显示可选 loginSessionId,随机的每个记录非ce.
这是在真正的登录上铸造的 encodeSessionToken),通过
普通 Auth.js JWT 更新,并在下次登录时替换. 这对
将 OAuth 同意请求绑定在一个 cookie- 认证的登录上: 账户 IDs
范围太广,而加密 cookie 字节和 Auth.js iat编号 :jti 变化期间
正常刷新。 总是从已核实的服务器会话读取, 从未读取过
客户端请求字段 。 没有索赔要求的后遗症饼干仍然得到认证,但
除非有新的签注,否则没有约束力;会话从不发明.