API anahtarlarınızı Next JS ile koruma?

29 Mart 2023 20:25 tarihinde Yayınlandı
Api anahtarını gizleyerek nextjs ile api key koruması yapacağız.

Özellikle yeni öğrenirken ve özel anahtar gerektiren genel API'lerle oynamaya başladığımızda böyle sorunlarımız olabiliyor.

Anahtarlarınızı ön uçta korumanın iyi (veya herhangi) bir yolu yoktur. İyi bir alternatif, arka uç kodu tarayıcıya açıklanmadığından kendi sunucunuzda bir proxy oluşturmaktır. Ancak bu API'leri kullanan birçok kişi, henüz arka uç hakkında pek bir şey bilmeyen yeni başlayanlardır.

Peki, Next JS, entegre ve kullanıma hazır API Rotaları ile bunu sağlayabilir mi? Temelde, kullanıma hazır bir sunucu olan API uç noktaları oluşturmak için kullanabileceğiniz bir Node JS ortamıdır.

İlk Kurulum

İlk önce bir sonraki js uygulamasını oluşturalım.

npx create-next-app next-api
# veya
yarn create next-app next-api

cd next-api

Farklı bir .env dosyası

Projeye girdikten sonra bir dosya oluşturabiliriz .env.local. .envBu dosyalara aşina iseniz, normal dosyalarınızla aynı görünür . Aradaki fark, içindeki değişkenlerin .env.local yalnızca Next'in Node JS ortamında mevcut olmasıdır. Bu, tarayıcının bunlara erişimi olmadığı anlamına gelir.

Peki bu değişkenleri nerede kullanabiliriz?

İçinde pagesadında başka bir klasör var api, buradaki herhangi bir dosya bir API uç noktası olarak ele alınacaktır.

Aşağı yukarı böyle çalışır.

Sunucu tarafında elimizde pages/api/hello.js

export default (req, res) => {
  res.status(200).json({ name: 'Ahmet Veli' })
}
const fetchHello = async (page) => {
  const res = await fetch(`/api/hello`); // Api yolumuzu buraya giriyoruz
  const data = await res.json();
// data = { name: "Ahmet Veli" }
  return data;
};

Anahtarı korumak

Artık bunun nasıl çalıştığını bildiğimize göre, dosyaya bir anahtar ekleyelim .env.local.

İsteğimin URL'sini göndermem gereken bir anahtarım olduğunu varsayalım.

Anahtarı içeri ekleyelim .env.local

SECRET_KEY=secret_anahtar

Ve anahtarımızı client tarafında kullanmak yerine içeride kullanırız hello.js içinde.

// pages/api/hello.js
import axios from "axios";

export default async (req, res) => {
  const URL = `https://api.example.com/?&api_key=${process.env.SECRET_KEY}`;
  const response = await axios.get(URL);
  res.status(200).json({ data: response.data })
}

şimdi istemci tarafında /api/hello ya call atarak anahtarımızı gizlemiş olarak client side da işimizi yapabiliriz.

Hepsi bu kadar, anahtarımız ağ sekmesinde hiçbir yerde görünmüyor.