authpress
v1.0.2
Published
Multi-auth middleware for Express: JWT, Basic, API Key, OAuth (Google, GitHub, Facebook, Discord)
Maintainers
Readme
🛡️ AuthPress
Multi-auth middleware for Express.js: JWT, Basic, API Key, OAuth (Google, GitHub, Facebook, Discord). Supports session or JWT mode for OAuth.
Prerequisites
- Node.js >= 18
- Express.js >= 4
.envfile must include:
# --- GOOGLE OAUTH ---
GOOGLE_CLIENT_ID=your_google_client_id
GOOGLE_CLIENT_SECRET=your_google_client_secret
GOOGLE_CALLBACK_URL=http://localhost:3000/auth/google/callback
# --- GITHUB OAUTH ---
GITHUB_CLIENT_ID=your_github_client_id
GITHUB_CLIENT_SECRET=your_github_client_secret
GITHUB_CALLBACK_URL=http://localhost:3000/auth/github/callback
# --- FACEBOOK OAUTH ---
FACEBOOK_CLIENT_ID=your_facebook_app_id
FACEBOOK_CLIENT_SECRET=your_facebook_app_secret
FACEBOOK_CALLBACK_URL=http://localhost:3000/auth/facebook/callback
# --- DISCORD OAUTH ---
DISCORD_CLIENT_ID=your_discord_client_id
DISCORD_CLIENT_SECRET=your_discord_client_secret
DISCORD_CALLBACK_URL=http://localhost:3000/auth/discord/callback
# --- MODE (select one: session | jwt) ---
AUTH_MODE=jwt
# --- JWT CONFIG (if you use mode=jwt) ---
JWT_SECRET=supersecretkey
JWT_EXPIRES_IN=1h
# --- JWT SECRET ---
JWT_SECRET=yourjwtsecretInstallation
npm install authpressAuthentication Types
- JWT – Stateless, best for SPA or API.
- Basic – Simple username/password, good for internal tools.
- API Key – Header-based authentication, ideal for service-to-service communication.
- OAuth – Login via providers (Google, GitHub, Facebook, Discord), supports session or JWT mode.
Usage
const express = require("express");
const session = require("express-session");
const auth = require("authpress");
const applyAuth = auth.applyAuth;
const app = express();
app.use(express.json());
app.use(session({ secret: "secret", resave: false, saveUninitialized: true }));
// Initialize OAuth (only required for session mode)
auth.oauth.init(app);
// Setup providers
auth.oauth.oauth([
{
provider: "google",
clientId: process.env.GOOGLE_CLIENT_ID,
clientSecret: process.env.GOOGLE_CLIENT_SECRET,
callbackURL: process.env.GOOGLE_CALLBACK,
mode: "jwt",
jwtSecret: process.env.JWT_SECRET,
jwtExpiresIn: "2h" // default "1h"
},
{
provider: "github",
clientId: process.env.GITHUB_CLIENT_ID,
clientSecret: process.env.GITHUB_CLIENT_SECRET,
callbackURL: process.env.GITHUB_CALLBACK,
mode: "session"
}
]);
// JWT route
app.get("/jwt", auth.jwt({ secret: process.env.JWT_SECRET }), (req, res) => {
res.json({ message: "JWT Auth OK", user: req.user });
});
// JWT Login (generate token)
app.post('/login', (req, res) => {
const user = { id: 1, username: 'admin', role: 'admin' };
const token = auth.jwt.sign(user, config.secret, { expiresIn: '1h' });
res.json({ token });
});
// JWT route with role
app.get('/admin', auth.jwt({ secret: process.env.JWT_SECRET }), auth.jwt.withRole(['admin']), (req, res) => {
res.json({ message: 'Admin Dashboard' });
});
// JWT Refresh token
app.post('/refresh', (req, res) => {
const { refreshToken } = req.body;
try {
const newToken = auth.jwt.refresh(refreshToken, config.secret, { expiresIn: '1h' });
res.json({ token: newToken });
} catch {
res.status(401).json({ error: 'Invalid refresh token' });
}
});
// Basic Auth route
app.get("/basic", auth.basic({ users: { admin: "1234" } }), (req, res) => {
res.json({ message: "Basic Auth OK", user: req.user });
});
// API Key route
app.get("/apikey", auth.apikey({ keyHeader: "x-api-key", keys: ["123456"] }), (req, res) => {
res.json({ message: "API Key OK" });
});
// OAuth routes
app.get("/auth/google", auth.oauth.login("google"));
app.get("/auth/google/callback", auth.oauth.callback("google"));
// Multi-auth setup (optional)
const routes = [
{ method: "get", path: "/jwt", type: "jwt", config: { secret: process.env.JWT_SECRET }, handler: (req,res)=>res.json({user:req.user}) },
{ method: "get", path: "/basic", type: "basic", config: { users: { admin: "1234" } }, handler: (req,res)=>res.json({user:req.user}) },
{ method: "get", path: "/apikey", type: "apikey", config: { keyHeader: "x-api-key", keys: ["123456"] }, handler: (req,res)=>res.json({message:"API Key OK"}) },
{ method: "get", path: "/auth/google", type: "oauth", config: { provider: "google" }, handler: (req,res)=>{} },
{ method: "get", path: "/auth/google/callback", type: "oauth", config: { provider: "google", successRedirect: "/", failureRedirect: "/" }, handler: (req,res)=>{} }
];
applyAuth(app, routes);
app.listen(3000, () => console.log("✅ Server running at http://localhost:3000"));Tips
- Use
mode: "jwt"for SPAs or mobile apps. - Use
mode: "session"for traditional web applications. - Supports multiple OAuth providers at once.
- JWT can be customized via
jwtExpiresInandjwtSecret. - All authentication routes can be managed from a single
routesarray → clean & scalable.
License
🛡️ AuthPress is released under the MIT License.
