@mayaross/auth
SDK untuk autentikasi mayar-cli via mayar auth service menggunakan Google OAuth + SSE.
Instalasi
npm install @mayaross/auth
Tidak ada dependency eksternal — hanya menggunakan built-in Node.js (https, http, child_process). Membutuhkan Node.js >= 18.
Flow
mayar login
│
├─ 1. Minta appid + URL ke server → GET /token/cli/initiate
│
├─ 2. Buka browser ke auth URL → /oauth2/google?state=appid,<uuid>
│
├─ 3. Subscribe SSE → GET /token/cli/stream?appid=<uuid>
│ (tunggu token, max 5 menit)
│
├─ 4. User login Google di browser
│
└─ 5. Server push token via SSE → CLI terima, simpan credentials
Penggunaan
Login satu langkah
const { MayarAuth } = require('@mayaross/auth');
const auth = new MayarAuth('https://auth.mayar.id');
try {
const token = await auth.login({
onUrl: ({ url }) => {
console.log(`Membuka browser untuk login...`);
console.log(`Jika browser tidak terbuka, buka URL ini:\n${url}`);
}
});
console.log('Login berhasil!');
} catch (e) {
console.error('Login gagal:', e.message);
}
Manual step-by-step
const { MayarAuth } = require('@mayaross/auth');
const auth = new MayarAuth('https://auth.mayar.id');
const { appid, url } = await auth.initiate();
console.log('Buka URL ini di browser:', url);
auth.openBrowser(url);
const token = await auth.listenForToken(appid);
console.log('Token diterima:', token);
API
new MayarAuth(baseUrl, opts?)
baseUrl | string | 'https://auth.mayar.id' | Base URL auth server |
opts.timeoutMs | number | 300000 (5 menit) | Timeout tunggu login |
auth.login(opts?)
Full login flow: initiate → buka browser → tunggu token via SSE.
login(opts?: {
openBrowser?: boolean,
onUrl?: ({ appid, url }) => void
}): Promise<string>
auth.initiate()
Minta appid dan url dari server.
initiate(): Promise<{ appid: string, url: string }>
auth.listenForToken(appid)
Konek ke SSE stream dan tunggu token. Resolve saat token diterima, reject saat timeout.
listenForToken(appid: string): Promise<string>
auth.openBrowser(url)
Buka URL di browser default. Support macOS, Linux, Windows.
openBrowser(url: string): void
Format Token
Token yang dikembalikan berupa string dengan format:
authToken,refreshToken
- authToken — JWT RS256, berlaku 24 jam
- refreshToken — JWT RS256, berlaku 7 hari, digunakan untuk refresh otomatis via
/validate
Untuk decode payload:
const [authToken] = token.split(',');
const payload = JSON.parse(
Buffer.from(authToken.split('.')[1], 'base64url').toString()
);
Contoh Integrasi di mayar-cli
const { MayarAuth } = require('@mayaross/auth');
const fs = require('fs');
const os = require('os');
const path = require('path');
const CREDENTIALS_PATH = path.join(os.homedir(), '.mayar', 'credentials.json');
async function loginCommand() {
const auth = new MayarAuth(process.env.MAYAR_AUTH_URL || 'https://auth.mayar.id');
console.log('Menghubungkan ke mayar...');
const token = await auth.login({
onUrl: ({ url }) => {
console.log('\nJika browser tidak terbuka otomatis, buka URL ini:');
console.log(url + '\n');
}
});
const [authToken] = token.split(',');
const { sub: email, name, exp } = JSON.parse(
Buffer.from(authToken.split('.')[1], 'base64url').toString()
);
fs.mkdirSync(path.dirname(CREDENTIALS_PATH), { recursive: true });
fs.writeFileSync(CREDENTIALS_PATH, JSON.stringify({ token, email, name }, null, 2));
console.log(`\nLogin berhasil sebagai ${name} (${email})`);
console.log(`Token berlaku hingga ${new Date(exp * 1000).toLocaleString()}`);
}
module.exports = { loginCommand };
Server Endpoints
SDK ini mengonsumsi dua endpoint dari auth server:
/token/cli/initiate | GET | Generate appid + auth URL |
/token/cli/stream?appid=<uuid> | GET (SSE) | Stream token setelah user login |