1.0.2 • Published 9 months ago

lucia-dynamodb-adapter v1.0.2

Weekly downloads
-
License
CC0-1.0
Repository
github
Last release
9 months ago

lucia-dynamodb-adapter

An easy to set up adapter allowing you to use DynamoDB with the 'lucia-auth' library (v3).

Deprecation Notice

It has been announced that the lucia auth library will be deprecated. As such as of 26/10/2024 this adapter will no longer be maintained.

The package will remain as is for anybody already using it and the code is under a cc0 license so if anybody wants to create something new or apply fixes into the future and release that they can.

For a replacement to Lucia we recommend switching to Narvik (npm link).

Installation

npm install --save lucia-dynamodb-adapter

Features

  • Easy to set up, initialize adapter with some basic config and pass it to the 'lucia-auth' library
  • DynamoDB TTL based session expiration
  • Use your own user table by providing a "getUser" function

Usage

DynamoDB Setup (CDK Example)

Below is a basic example of how to set up a DynamoDB table for storing sessions with a global secondary index for the user id. This is a basic example, you may need to customise it to fit your needs.

You do not need to set this up using CDK, you can also set it up using cloudformation, manually in the AWS console or using any other method you prefer.

const sessionTable = new dynamodb.Table(customResourceStack, `SessionTable`, {
    tableName: 'lucia-sessions',
    partitionKey: { name: "id", type: dynamodb.AttributeType.STRING },
    billingMode: dynamodb.BillingMode.PROVISIONED,
    readCapacity: 1,
    writeCapacity: 1,
    timeToLiveAttribute: "ttl"
})

sessionTable.addGlobalSecondaryIndex({
    indexName: 'lucia-sessions-user-index',
    partitionKey: { name: "userId", type: dynamodb.AttributeType.STRING },
    readCapacity: 1,
    writeCapacity: 1
});

Configuring the adapter

DynamoDBAdapterConfig:

  • client - An instance of DynamoDB client setup with your configuration (Region, credentials, etc.)
  • sessionTableName - The name of the table in dynamodb for storing sessions (Needs to be created with the correct schema)
  • sessionUserIndexName - The name of the index in the session table for the user id
  • getUser - A function that takes a user id, loads the user from your db and returns it as a Lucia user object
import {Lucia, Session, User} from "lucia";
import {DynamoDBClient} from "@aws-sdk/client-dynamodb";
import {DynamoDBAdapter} from "@/lucia/DynamoDBAdapter";
import {getUserFromDb} from "your-user-db";

//Create a new DynamoDB client
const client = new DynamoDBClient();

// Create a function to get a user from your own user table then pass it to the adapter as a Lucia user
async function getUser(userId: string): Promise<User | null> {
    //Get the user from your own user table
    const user = await getUserFromDb(userId);
    
    //If the user does not exist, return null
    if (!user) {
        return null;
    }
    
    //Return the user as a Lucia user. This example assumes that the attributes field has been customised to include a username. See more in this tutorial https://lucia-auth.com/tutorials/username-and-password/
    return {
        id: user.id,
        attributes: {
            username: user.username,
        },
    };
}

//Create a new adapter with the required parameters
const adapter = new DynamoDBAdapter({
    client,
    sessionTableName: "lucia-sessions",
    sessionUserIndexName: "lucia-sessions-user-index",
    getUser: getUser,
});

//Use the adapter with the 'lucia-auth' library as you would with any other adapter

Contributions

If you want to improve the library, please create a pull request.