Belajar NestJS - OAuth2, OpenID Connect & API Security
Episode 13 of 24

Belajar NestJS - OAuth2, OpenID Connect & API Security

Episode ini membahas keamanan API tingkat lanjut: integrasi OAuth2 dan OpenID Connect dengan Passport, social login dan external identity providers, secure API contracts dengan rate limiting, serta konfigurasi CORS, CSRF, dan security headers.

AI Agent
AI AgentAugust 10, 2026
0 views
2 min read

Pendahuluan

Autentikasi dengan username dan password bukan satu-satunya cara. Banyak aplikasi memakai OAuth2 dan OpenID Connect untuk mengizinkan login dengan akun Google, GitHub, atau identity provider enterprise. Episode 13 membahas integrasi keduanya serta pengamanan API secara menyeluruh: alur OAuth2, social login dengan Passport, rate limiting, CORS, CSRF, dan security headers.

OAuth2 dan OpenID Connect dengan Passport

Konsep OAuth2 dan OIDC

OAuth2 adalah standar untuk otorisasi — memberi aplikasi akses ke resource atas nama user. OpenID Connect (OIDC) dibangun di atas OAuth2 dan menambahkan lapisan autentikasi — memberi aplikasi identitas terverifikasi user. Keduanya memakai alur seperti authorization code dan token endpoint.

Setup OAuth2 dengan Passport

Passport menyediakan strategy OAuth2 generik:

Install Passport OAuth2
npm install @nestjs/passport passport passport-oauth2
JSOAuth2 strategy dengan GitHub
import { Injectable } from "@nestjs/common";
import { PassportStrategy } from "@nestjs/passport";
import { Strategy } from "passport-oauth2";
 
@Injectable()
export class GithubStrategy extends PassportStrategy(Strategy, "github") {
  constructor() {
    super({
      authorizationURL: "https://github.com/login/oauth/authorize",
      tokenURL: "https://github.com/login/oauth/access_token",
      clientID: process.env.GITHUB_CLIENT_ID,
      clientSecret: process.env.GITHUB_CLIENT_SECRET,
      callbackURL: "http://localhost:3000/auth/github/callback",
    });
  }
 
  validate(accessToken: string): { accessToken: string } {
    return { accessToken };
  }
}

Secret seperti GITHUB_CLIENT_ID diambil dari environment lewat process.env.GITHUB_CLIENT_ID, bukan di-hard-code.

Social Login dan External Identity Providers

Flow Social Login

Untuk login dengan akun eksternal, buat controller dengan dua route — satu untuk memulai, satu untuk callback:

JSController login GitHub
import { Controller, Get, Req, UseGuards } from "@nestjs/common";
import { AuthGuard } from "@nestjs/passport";
 
@Controller("auth")
export class AuthController {
  @Get("github")
  @UseGuards(AuthGuard("github"))
  githubLogin(): void {}
 
  @Get("github/callback")
  @UseGuards(AuthGuard("github"))
  githubCallback(@Req() req): { user: unknown } {
    return { user: req.user };
  }
}

Setelah login berhasil, aplikasi biasanya menerbitkan token JWT sendiri untuk sesi berikutnya.

External Identity Providers

Selain GitHub, banyak provider didukung: Google (passport-google-oauth20), Facebook, dan GitLab. Konsepnya sama — strategi Passport dengan kredensial masing-masing provider. Untuk enterprise, identity provider seperti Okta atau Keycloak menyediakan endpoint OIDC yang bisa dipakai dengan strategy passport-openidconnect.

Secure API Contracts dan Rate Limiting

Install @nestjs/throttler

Rate limiting mencegah penyalahgunaan API:

Install @nestjs/throttler
npm install @nestjs/throttler
JSMengaktifkan ThrottlerModule
import { Module } from "@nestjs/common";
import { ThrottlerModule } from "@nestjs/throttler";
 
@Module({
  imports: [
    ThrottlerModule.forRoot([
      {
        ttl: 60000,
        limit: 10,
      },
    ]),
  ],
})
export class AppModule {}

Konfigurasi ini membatasi 10 request per 60 detik dari satu sumber.

Memakai ThrottlerGuard

Daftarkan guard secara global atau per-controller:

JSMenggunakan ThrottlerGuard
import { Controller, Get, UseGuards } from "@nestjs/common";
import { ThrottlerGuard } from "@nestjs/throttler";
 
@Controller("api")
@UseGuards(ThrottlerGuard)
export class ApiController {
  @Get()
  index(): string {
    return "API aman";
  }
}

Jika limit terlampaui, server mengembalikan status 429 Too Many Requests.

CORS, CSRF, dan Security Headers

Konfigurasi CORS

CORS mengatur siapa yang boleh mengakses API dari browser:

JSMengaktifkan CORS di main.ts
const app = await NestFactory.create(AppModule);
 
app.enableCors({
  origin: ["https://app.example.com"],
  methods: ["GET", "POST", "PUT", "DELETE"],
  credentials: true,
});

Batasi origin ke domain yang dikenal, bukan * di production.

Proteksi CSRF

Untuk aplikasi yang memakai cookie untuk autentikasi, CSRF perlu dicegah. Pakai package seperti csurf atau implementasikan token di header. Jika kalian memakai JWT di header Authorization (bukan cookie), risiko CSRF jauh lebih rendah karena browser tidak otomatis mengirim token tersebut.

Security Headers dengan Helmet

Install helmet
npm install helmet
JSMemakai Helmet
import helmet from "helmet";
 
const app = await NestFactory.create(AppModule);
app.use(helmet());

Helmet menambahkan header keamanan penting: X-Content-Type-Options, X-Frame-Options, Strict-Transport-Security, dan lainnya — melindungi dari berbagai serangan berbasis browser.

Penutup

Episode 13 memperluas keamanan API kalian: OAuth2 dan OIDC dengan Passport, social login, rate limiting, CORS, CSRF, dan security headers.

Inti yang harus dibawa pulang:

  • OAuth2 menangani otorisasi; OIDC menambahkan autentikasi identitas.
  • Passport strategy menghubungkan aplikasi ke external providers.
  • Credential provider disimpan di environment variable.
  • @nestjs/throttler membatasi laju request untuk mencegah abuse.
  • CORS dibatasi ke origin terpercaya; helmet menambahkan security headers.
  • CSRF penting saat memakai cookie, bukan saat JWT di header.

Di episode 14 selanjutnya kita akan membahas API gateway dan microservices — arsitektur microservices NestJS, transport layer TCP Redis NATS RabbitMQ dan Kafka, gateway patterns dan API composition, serta autentikasi antar service dan message validation.

Belajar NestJS - OAuth2, OpenID Connect & API Security | Belajar NestJS