DynamoDB 适配器
资源
设置
安装
npm install @auth/dynamodb-adapter @aws-sdk/lib-dynamodb @aws-sdk/client-dynamodb
环境变量
AUTH_DYNAMODB_ID=accessKey
AUTH_DYNAMODB_SECRET=secretKey
AUTH_DYNAMODB_REGION=eu-west-1
配置
您需要从模块化 aws-sdk
v3 将 DynamoDBDocument
客户端传递给适配器。默认表名为 next-auth
,但您可以通过将 { tableName: 'your-table-name' }
作为适配器中的第二个参数来自定义。
./auth.ts
import NextAuth from "next-auth"
import { DynamoDB, DynamoDBClientConfig } from "@aws-sdk/client-dynamodb"
import { DynamoDBDocument } from "@aws-sdk/lib-dynamodb"
import { DynamoDBAdapter } from "@auth/dynamodb-adapter"
const config: DynamoDBClientConfig = {
credentials: {
accessKeyId: process.env.AUTH_DYNAMODB_ID,
secretAccessKey: process.env.AUTH_DYNAMODB_SECRET,
},
region: process.env.AUTH_DYNAMODB_REGION,
}
const client = DynamoDBDocument.from(new DynamoDB(config), {
marshallOptions: {
convertEmptyValues: true,
removeUndefinedValues: true,
convertClassInstanceToMap: true,
},
})
export const { handlers, auth, signIn, signOut } = NextAuth({
providers: []
adapter: DynamoDBAdapter(client),
})
AWS 凭据
在授予对 AWS 服务/资源的访问权限时,始终遵循**最小权限原则** -> 身份应只被允许执行完成特定任务所需的最小子集操作。
- 打开 AWS 控制台 并转到“IAM”,然后转到“用户”。
- 创建一个新用户。此用户的目的是提供对 DynamoDB 的编程访问权限。
- 创建访问密钥,然后将密钥 ID 和密钥复制到您的
.env
/.env.local
文件中。 - 选择“添加权限”和“创建内联策略”。
- 将下面的 JSON 复制到 JSON 输入中,并用您的值替换
region
、account_id
和table_name
。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "DynamoDBAccess",
"Effect": "Allow",
"Action": [
"dynamodb:BatchGetItem",
"dynamodb:BatchWriteItem",
"dynamodb:Describe*",
"dynamodb:List*",
"dynamodb:PutItem",
"dynamodb:DeleteItem",
"dynamodb:GetItem",
"dynamodb:Scan",
"dynamodb:Query",
"dynamodb:UpdateItem"
],
"Resource": [
"arn:aws:dynamodb:{region}:{account_id}:table/{table_name}",
"arn:aws:dynamodb:{region}:{account_id}:table/{table_name}/index/GSI1"
]
}
]
}
高级用法
IaC 模板
以下是一些流行提供商的 基础设施即代码模板,可帮助您启动 DynamoDB。
默认架构
该表遵循单表设计模式。这有许多优势
- 只需管理、监控和配置一个表。
- 查询关系比多表架构快(例如,检索某个用户的全部会话)。
- 如果要进行多区域操作,则只需复制一个表。
默认情况下,适配器期望一个表具有一个分区键 pk
和一个排序键 sk
,以及一个名为 GSI1
的全局二级索引,GSI1PK
作为分区键,GSI1SK
作为排序键。要使用 dynamodb TTL 自动删除会话和验证请求(在它们过期后),您应该 启用 TTL,其属性名为 expires
。您可以将任何您想要的内容设置为表名和计费方式。您可以在下面的表结构部分找到完整的架构。
使用自定义架构
您可以通过将 options
键传递给适配器构造函数来配置您的自定义表架构
./auth.js
const adapter = DynamoDBAdapter(client, {
tableName: "custom-table-name",
partitionKey: "custom-pk",
sortKey: "custom-sk",
indexName: "custom-index-name",
indexPartitionKey: "custom-index-pk",
indexSortKey: "custom-index-sk",
})