Socket
Book a DemoInstallSign in
Socket

@dainprotocol/oauth2-storage-drizzle

Package Overview
Dependencies
Maintainers
12
Versions
13
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@dainprotocol/oauth2-storage-drizzle

Database-agnostic Drizzle ORM storage adapter for OAuth2 Token Manager

npmnpm
Version
0.1.3
Version published
Weekly downloads
25
-62.12%
Maintainers
12
Weekly downloads
 
Created
Source

@dainprotocol/oauth2-storage-drizzle

Drizzle ORM storage adapter for @dainprotocol/oauth2-token-manager.

Installation

npm install @dainprotocol/oauth2-storage-drizzle drizzle-orm

Usage

Database Setup

The adapter requires tables to be created before use. You can either:

  • Use the built-in migration function (recommended for development):
import { migrate } from '@dainprotocol/oauth2-storage-drizzle';
import { drizzle } from 'drizzle-orm/postgres-js';
import postgres from 'postgres';

const client = postgres(connectionString);
const db = drizzle(client);

// Run migrations to create tables
await migrate(db, { dialect: 'postgres' });
  • Use Drizzle Kit for production migrations:

First, create a drizzle.config.ts file:

import { defineConfig } from 'drizzle-kit';

export default defineConfig({
  schema: './node_modules/@dainprotocol/oauth2-storage-drizzle/dist/schema',
  out: './drizzle',
  dialect: 'postgresql', // or 'mysql', 'sqlite'
  dbCredentials: {
    connectionString: process.env.DATABASE_URL!,
  },
});

Then generate and run migrations:

npx drizzle-kit generate:pg
npx drizzle-kit migrate:pg

PostgreSQL

import { OAuth2Client } from '@dainprotocol/oauth2-token-manager';
import { DrizzleStorageAdapter, migrate } from '@dainprotocol/oauth2-storage-drizzle';
import { drizzle } from 'drizzle-orm/postgres-js';
import postgres from 'postgres';

const client = postgres(connectionString);
const db = drizzle(client);

// Run migrations on first setup (development)
if (process.env.NODE_ENV === 'development') {
  await migrate(db, { dialect: 'postgres' });
}

const storage = new DrizzleStorageAdapter(db, {
  dialect: 'postgres',
});

const oauth = new OAuth2Client({ storage });

MySQL

import { DrizzleStorageAdapter, migrate } from '@dainprotocol/oauth2-storage-drizzle';
import { drizzle } from 'drizzle-orm/mysql2';
import mysql from 'mysql2/promise';

const connection = await mysql.createConnection({
  host: 'localhost',
  user: 'root',
  database: 'oauth_tokens',
});

const db = drizzle(connection);

// Run migrations on first setup (development)
if (process.env.NODE_ENV === 'development') {
  await migrate(db, { dialect: 'mysql' });
}

const storage = new DrizzleStorageAdapter(db, {
  dialect: 'mysql',
});

SQLite

import { DrizzleStorageAdapter, migrate } from '@dainprotocol/oauth2-storage-drizzle';
import { drizzle } from 'drizzle-orm/better-sqlite3';
import Database from 'better-sqlite3';

const sqlite = new Database('oauth_tokens.db');
const db = drizzle(sqlite);

// Run migrations on first setup (development)
if (process.env.NODE_ENV === 'development') {
  await migrate(db, { dialect: 'sqlite' });
}

const storage = new DrizzleStorageAdapter(db, {
  dialect: 'sqlite',
});

API Methods

The DrizzleStorageAdapter implements all methods from the StorageAdapter interface:

Token Operations

  • saveToken(input) - Save or update a token (unique by provider + email)
  • getToken(provider, email) - Get a specific token
  • getTokenById(id) - Get a token by its ID
  • getTokensByUserId(userId) - Get all tokens for a user
  • getTokensByEmail(email) - Get all tokens for an email
  • getTokensByProvider(provider) - Get all tokens for a provider
  • getAccounts(userId, provider) - Get all tokens for a specific user in a specific provider
  • getTokensForEmail(userId, provider, email) - Get a single token for a specific user, provider, and email (returns null if not found)
  • getTokens(userId, provider) - Get all tokens for a specific user in a specific provider (alias for getAccounts)
  • updateToken(id, update) - Update a token
  • deleteToken(id) - Delete a token by ID
  • deleteTokenByProviderEmail(provider, email) - Delete a token by provider and email
  • deleteExpiredTokens() - Clean up expired tokens

Authorization State Operations

  • saveAuthorizationState(state) - Save an authorization state
  • getAuthorizationState(state) - Get an authorization state
  • deleteAuthorizationState(state) - Delete an authorization state
  • cleanupExpiredStates() - Clean up expired states (older than 10 minutes)

Schema

The adapter automatically creates the following tables:

oauth2_tokens

  • id - Unique identifier
  • provider - OAuth provider name
  • userId - User identifier
  • email - User email
  • accessToken - Encrypted access token
  • refreshToken - Encrypted refresh token (optional)
  • expiresAt - Token expiration timestamp
  • tokenType - Token type (e.g., "Bearer")
  • scope - OAuth scopes
  • metadata - Additional metadata (JSON)
  • createdAt - Creation timestamp
  • updatedAt - Last update timestamp

Unique constraint: provider + email

oauth2_authorization_states

  • state - Authorization state (primary key)
  • codeVerifier - PKCE code verifier
  • config - OAuth configuration (JSON)
  • metadata - Additional metadata (JSON)
  • createdAt - Creation timestamp

Features

  • Multi-database support (PostgreSQL, MySQL, SQLite)
  • Automatic schema creation
  • Secure token encryption
  • Built-in cleanup for expired tokens and states
  • TypeScript support

License

MIT

Keywords

oauth2

FAQs

Package last updated on 02 Jul 2025

Did you know?

Socket

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Install

Related posts