DartAPI Auth

DartAPI Auth is a lightweight authentication package for Dart-based backend applications. It provides JWT-based authentication with built-in support for access tokens, refresh tokens, and middleware protection.

🚀 Features

  • JWT Authentication (Signed JSON Web Tokens using dart_jsonwebtoken)
  • Access & Refresh Tokens (With Expiry & Rotation Support)
  • Issuer (iss) & Audience (aud) Validation for Security
  • Middleware Protection for Securing Routes
  • Unit Tested for Maximum Reliability

📌 Installation

Add dartapi_auth as a dependency in your Dart project:

dart pub add dartapi_auth

Or, add it manually to your pubspec.yaml:

dependencies:
  dartapi_auth: ^1.0.0

🔑 Usage

1️⃣ Setting Up JwtService

import 'package:dartapi_auth/jwt_service.dart';

void main() {
  final jwtService = JwtService(
    accessTokenSecret: 'your-very-secure-secret',
    refreshTokenSecret: 'your-super-secure-refresh-secret',
    issuer: 'dartapi-auth',
    audience: 'dartapi-users',
  );

  // ✅ Generate Access Token
  final accessToken = jwtService.generateAccessToken(claims: {
    'sub': 'user-123',
    'username': 'john_doe',
  });

  print('Access Token: \$accessToken');
}

2️⃣ Verifying Access Tokens

final payload = jwtService.verifyAccessToken(accessToken);
if (payload != null) {
  print('Token is valid! User: \${payload['username']}');
} else {
  print('Invalid token!');
}

3️⃣ Generating & Verifying Refresh Tokens

final refreshToken = jwtService.generateRefreshToken(accessToken: accessToken);
final verifiedPayload = jwtService.verifyRefreshToken(refreshToken);

if (verifiedPayload != null) {
  print('Refresh Token Verified! User: \${verifiedPayload['username']}');
} else {
  print('Invalid Refresh Token!');
}

4️⃣ Protecting Routes with Authentication Middleware

import 'package:dartapi_auth/auth_middleware.dart';
import 'package:shelf/shelf.dart';
import 'package:shelf/shelf_io.dart' as io;

void main() async {
  final handler = Pipeline()
      .addMiddleware(authMiddleware(jwtService))
      .addHandler((Request request) {
    final user = request.context['user'];
    return Response.ok('Hello, \${user?['username']}!');
  });

  final server = await io.serve(handler, 'localhost', 8080);
  print('🚀 Server running on http://localhost:8080');
}

Example Login Response:

{
  "access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ...",
  "refresh_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ...",
  "expires_in": 3600
}

🛠 Testing the Package

Run tests using:

dart test

📜 License

This package is open-source and licensed under the BSD-3-Clause License.

© 2025 Akash G Krishnan. All rights reserved.

Libraries

dartapi_auth