API কীগুলো আপনার সার্ভিসের সামনের দরজার চাবির মতো—এরা ইউজারদের ভিতর ঢুকতে দেয় নিরাপত্তা রক্ষা করে। এই ব্লগে, আমি আপনাকে একটি সিম্পল, সিকিউর API কী জেনারেটার বানাতে গাইড করব Upstash Redis ব্যবহার করে দ্রুত, সার্ভারлес ডেটা স্টোরেজ এবং Cloudflare Workers ব্যবহার করে এজে রিকোয়েস্ট হ্যান্ডেল করার জন্য। আপনি নया সার্ভিস সেট আপ করছেন বা এক্সিস্টিং অ্যাপে কী যোগ করছেন, আপনি শিখবেন কীভাবে API কী জেনারেট, স্টোর, এবং ভ্যালিডেট করতে হয় সব কিছু স্মূথ এবং ইফিশিয়েন্টলি চালানোর জন্য।
API কী কী?
একটি API কী হলো একটি যুনিক কোড যা একজন ইউজার বা অ্যাপ্লিকেশনকে আইডেন্টিফাই এবং অথেন্টিকেট করে আপনার API অ্যাক্সেস করার চেষ্টা করলে। এটিকে একটি পারসোনাল পাসের মতো ভাবুন: যখন কেউ আপনার সার্ভিস ব্যবহার করতে চায়, তাকে এই "চাবি"টি দেখাতে হবে প্রমাণ করার জন্য যে সে ঢুকতে পারব। API কী আপনাকে কন্ট্রোল করতে সাহায্য করে কে আপনার রিসোর্স অ্যাক্সেস করতে পারব, এবং এগুলো أكসর ব্যবহার হয় ইউজেজ ট্র্যাক করতে, লিমিট এনফোর্স করতে, বা অনঅথরাইজড অ্যাক্সেস প্রতিরোধ করতে। এগুলো API অ্যাক্সেস ম্যানেজ করতে এবং আপনার ডেটা সিকিউর রাখতে একটি সরল উপায়।
আমরা কী বানাব
এই গাইডে, আমরা একটি API কী জেনারেটার তৈরি করব যা দুটি কোর ফাংশনালিটি প্রদান করবে:
- কাস্টম সেটিংসহ নতুন API কী জেনারেট করা
- API কী ভ্যালিডেট করা তাদের মেটাডেটা রিট্রিভ করার সাথে সাথে
প্রধান ফিচারগুলো شامل:
- কাস্টোমাইজেবল কী প্রিফিক্স
- এক্সপায়ারেশন ডেট
- রেট লিমিটিং
- মেটাডেটা স্টোরেজ
- ওয়নার আইডেন্টিফিকেশন
আমাদের API কী সিস্টেম ভিজুয়ালাইজ করুন
এই ডায়াগ্রামটি ক্লায়েন্ট, আমাদের Cloudflare Worker, এবং Upstash Redis-এর ইন্টারঅ্যাকশন ইলাস্ট্রেট করে API কী তৈরি এবং ভ্যালিডেট করার জন্য। এই ওভারভিউ মনে রেখে, চলুন আমাদের সিস্টেম বানানো শুরু করি।

প্রত্যোজনীয় শর্তাবলী
ফলো করার জন্য, আপনার প্রয়োজন:
- একটি Cloudflare Workers অ্যাকাউন্ট
- একটি Upstash অ্যাকাউন্ট
- আপনার লোকাল মেশিনে Node.js ইনস্টলড
প্রজেক্ট স্ট্রাকচার
আমাদের প্রজেক্টের নিচের স্ট্রাকচার থাকবে:
folder-name/ ├── src/ │ ├── config/ │ │ ├── generateApiKey.ts │ │ └── schema-validation.ts │ ├── lib/ │ │ └── ratelimit.ts │ ├── routes/ │ │ ├── create.ts │ │ └── verify.ts │ ├── types/ │ │ └── api.ts │ └── index.ts ├── package.json └── wrangler.toml
স্টেপ ১: প্রজেক্ট সেটআপ
প্রজেক্ট সেট আপ করা শুরু করি এবং প্রয়োজনীয় ডিপেন্ডেন্সি ইনস্টল করি।
একটি নতুন প্রজেক্ট ডিরেক্টরি তৈরি করুন
আপনার টার্মিনাল খুলুন এবং নিচের কমান্ডগুলো রান করুন:
mkdir keyflow cd keyflow npm init -y
ডিপেন্ডেন্সি ইনস্টল করুন
আমাদের প্রজেক্টের জন্য কিছু প্যাকেজ দরকার:
npm install hono @upstash/redis @upstash/ratelimit @hono/zod-validator zod wrangler
@upstash/redis: সার্ভারлес এনভায়রনমেন্টের জন্য Upstash Redis ক্লায়েন্ট @upstash/ratelimit: Upstash Redis-এর জন্য রেট লিমিটিং লাইব্রেরি @hono/zod-validator: Hono-এর জন্য রিকোয়েস্ট ভ্যালিডেশন মিডলওয়্যার zod: TypeScript-ফার্স্ট স্কিমা ভ্যালিডেশন লাইব্রেরি wrangler: Cloudflare-এর CLI Workers ডেভেলপমেন্ট এবং ডিপ্লয়মেন্টের জন্য
Upstash Redis সেট আপ করুন
- আপনার Upstash অ্যাকাউন্টে লগইন করুন এবং একটি নতুন Redis ডেটাবেস তৈরি করুন

- একবার তৈরি হলে, "REST API" সেকশনে যান

.envসেকশনেUPSTASH_REDIS_REST_URLএবংUPSTASH_REDIS_REST_TOKENকপি করুন
Cloudflare Workers কনফিগার করুন
আপনার প্রজেক্ট রুটে একটি wrangler.toml ফাইল তৈরি করুন নিচের কন্টেন্টসহ:
name = "keyflow" main = "src/index.ts" compatibility_date = "2023-05-18" [vars] UPSTASH_REDIS_REST_URL = "your-redis-url" UPSTASH_REDIS_REST_TOKEN = "your-redis-token"
"your-redis-url" এবং "your-redis-token" রিপ্লেস করুন Upstash থেকে কপি করা ভ্যালুগুলো দিয়ে।
স্টেপ ২: API টাইপ ডিফাইন করা
আসুন আমাদের API রিকোয়েস্ট এবং রেসপন্সের জন্য TypeScript ইন্টারফেস ডিফাইন করি। এই টাইপগুলো আমাদের অ্যাপ্লিকেশন জুড়ে টাইপ সেফটি মেইনটেইন করতে সাহায্য করবে। src/types/api.ts নামে একটি নতুন ফাইল তৈরি করুন:
export type CreateKeyRequest = { apiId: string; prefix?: string; byteLength?: number; ownerId?: string; name: string; meta?: Record; expires?: number; ratelimit?: { type: "fast" | "consistent"; limit: number; refillRate: number; refillInterval: number; }; }; export type CreateKeyResponse = { key: string; keyId: string; }; export type VerifyKeyRequest = { key: string; }; export type VerifyKeyResponse = { valid: boolean; ownerId?: string; meta?: Record; expires?: number; ratelimit?: { limit: number; remaining: number; reset: number; }; }; export type Env = { UPSTASH_REDIS_REST_URL: string; UPSTASH_REDIS_REST_TOKEN: string; };
স্টেপ ৩: API কী জেনারেশন ইমপ্লিমেন্ট করা
এখন, আমাদের API কী জেনারেট করার জন্য একটি ইউটিলিটি ফাংশন বানাই। src/config/generateApiKey.ts নামে একটি নতুন ফাইল তৈরি করুন:
export function generateApiKey( prefix: string | undefined, byteLength: number, ): string { const randomBytes = crypto.getRandomValues(new Uint8Array(byteLength)); const key = btoa(String.fromCharCode(...new Uint8Array(randomBytes))) .replace(/\+/g, "-") .replace(/\//g, "_") .replace(/=/g, ""); return prefix ? `${prefix}_${key}` : key; }
এই ফাংশনটি ক্রিপ্টোগ্রাফিক্যালি সিকিউর র্যান্ডম বাইটস ব্যবহার করে একটি র্যান্ডম API কী জেনারেট করে, এটিকে base64-এ এনকোড করে, এবং URL-সেফ করে।
স্টেপ ৪: রেট লিমিটিং ইমপ্লিমেন্ট করুন
src/lib/ratelimit.ts নামে একটি ফাইল তৈরি করুন:
import { Ratelimit } from "@upstash/ratelimit"; import { Redis } from "@upstash/redis/cloudflare"; import type { Context, Next } from "hono"; import { env } from "hono/adapter"; import type { Env } from "../types/api"; // Middleware for rate limiting export async function rateLimitMiddleware(c: Context, next: Next) { const { UPSTASH_REDIS_REST_TOKEN, UPSTASH_REDIS_REST_URL } = env(c); const redis = new Redis({ url: UPSTASH_REDIS_REST_URL, token: UPSTASH_REDIS_REST_TOKEN, }); const ratelimit = new Ratelimit({ redis: redis, limiter: Ratelimit.slidingWindow(5, "30 s"), }); const ip = c.req.header("CF-Connecting-IP") || "127.0.0.1"; const { success, limit, remaining, reset } = await ratelimit.limit(ip); if (!success) { return c.json({ error: "Rate limit exceeded" }, 429); } c.header("X-RateLimit-Limit", limit.toString()); c.header("X-RateLimit-Remaining", remaining.toString()); c.header("X-RateLimit-Reset", reset.toString()); await next(); }
স্টেপ ৫: API রুটস তৈরি করা
আমাদের মেইন অ্যাপ্লিকেশন ফাইল এবং API রুটস সেট আপ করি। এই ফাইলটি আমাদের Hono অ্যাপ্লিকেশন সেট আপ করে দুটি মূল রুটসহ: /keys/create নতুন API কী জেনারেট করার জন্য এবং /keys/verify এক্সিস্টিং কী ভ্যালিডেট করার জন্য তিনটি আলাদা ফাইল দিয়ে।
১. Create API Key রুট ইমপ্লিমেন্ট করুন
src/routes/create.ts নামে একটি ফাইল তৈরি করুন:
import { zValidator } from "@hono/zod-validator" import { Redis } from "@upstash/redis/cloudflare" import { Hono } from "hono" import { generateApiKey } from "../config/generateApiKey" import { createApiKeySchema } from "../config/schema-validation" import type { CreateKeyRequest, CreateKeyResponse, Env } from "../types/api" const create = new Hono<{ Bindings: Env }>() create.post( "/create", zValidator("json", createApiKeySchema, (result, c) => { if (!result.success) { return c.text("Invalid!", 400) } }), async (c) => { // Initialize Redis client const { UPSTASH_REDIS_REST_TOKEN, UPSTASH_REDIS_REST_URL } = c.env const redis = new Redis({ url: UPSTASH_REDIS_REST_URL, token: UPSTASH_REDIS_REST_TOKEN, }) const body = await c.req.json() // Generate unique identifier and API key const keyId = crypto.randomUUID() const key = generateApiKey(body.prefix, body.byteLength || 16) const keyData = { ...body, key, keyId, createdAt: Date.now(), } const encodedKey = encodeURIComponent(key) try { // Store key data and lookup reference in Redis await redis.set(`key:${keyId}`, JSON.stringify(keyData)) await redis.set(`lookup:${encodedKey}`, keyId) return c.json({ key, keyId }) } catch (error) { console.error("Error in /keys/create:", error) return c.json({ error: "Internal Server Error" }, 500) } } ) export default create
২. Verify API Key রুট ইমপ্লিমেন্ট করুন
src/routes/verify.ts নামে একটি ফাইল তৈরি করুন:
import { zValidator } from "@hono/zod-validator"; import { Redis } from "@upstash/redis/cloudflare"; import { Hono } from "hono"; import { verifyApiKeySchema } from "../config/schema-validation"; import type { CreateKeyRequest, Env, VerifyKeyRequest, VerifyKeyResponse, } from "../types/api"; // Initialize Hono app with environment bindings const verify = new Hono<{ Bindings: Env }>(); // Define POST route for verifying an API key verify.post( "/verify", // Validate request body against schema zValidator("json", verifyApiKeySchema, (result, c) => { if (!result.success) { return c.text("Invalid!", 400); // Return 400 if validation fails } }), async (c) => { // Set up Redis with environment variables const { UPSTASH_REDIS_REST_TOKEN, UPSTASH_REDIS_REST_URL } = c.env; const redis = new Redis({ url: UPSTASH_REDIS_REST_URL, token: UPSTASH_REDIS_REST_TOKEN, }); const body = await c.req.json(); if (!body.key) { return c.json({ error: "key is required" }, 400); // Require key in the request body } const encodedKey = encodeURIComponent(body.key); const keyId = await redis.get(`lookup:${encodedKey}`); // Retrieve key ID using encoded key if (!keyId) { return c.json({ valid: false }); // Key not found } const keyDataString = await redis.get(`key:${keyId}`); // Retrieve key data by key ID if (!keyDataString || typeof keyDataString !== "string") { return c.json({ valid: false }); // Key data missing or invalid } let keyData: CreateKeyRequest & { key: string; keyId: string; createdAt: number; }; try { keyData = JSON.parse(keyDataString); // Parse key data } catch (parseError) { // Handle parse error by deleting invalid data console.error("Key data parse error:", parseError); await Promise.all([ redis.del(`key:${keyId}`), redis.del(`lookup:${encodedKey}`), ]); return c.json( { error: "Invalid key data in storage", details: parseError instanceof Error ? parseError.message : "Unknown parse error", valid: false, }, 500, ); } // Check if key has expired if (keyData.expires && keyData.expires < Date.now()) { await Promise.all([ redis.del(`key:${keyId}`), redis.del(`lookup:${encodedKey}`), ]); return c.json({ valid: false }); } // Formulate response with validation status and metadata const response: VerifyKeyResponse = { valid: true, ownerId: keyData.ownerId, meta: keyData.meta, expires: keyData.expires, }; if (keyData.ratelimit) { response.ratelimit = { limit: keyData.ratelimit.limit, remaining: keyData.ratelimit.limit, reset: Date.now() + keyData.ratelimit.refillInterval, }; } return c.json(response); // Return verification response }, ); export default verify;
৩. মেইন ফাইল index.ts ইমপ্লিমেন্ট করুন
মেইন ফাইল src/index.ts ইমপ্লিমেন্ট করুন create.ts, verify.ts, এবং rateLimitMiddleWare ইম্পোর্ট করে
import { Hono } from "hono"; import { rateLimitMiddleware } from "./lib/ratelimit"; import create from "./routes/create"; import verify from "./routes/verify"; import type { Env } from "./types/api"; const app = new Hono<{ Bindings: Env; }>().basePath("/keys"); app.use("*", rateLimitMiddleware); // add the create file route and verify file route app.route("/", create); app.route("/", verify); export default app;
স্টেপ ৬: ডিপ্লয়মেন্ট
আপনার Keyflow অ্যাপ্লিকেশন Cloudflare Workers-এ ডিপ্লয় করুন:
Wrangler ইনস্টল করুন:
npm install -g wranglerCloudflare-এ অথেন্টিকেট করুন:
wrangler loginআপনার ওয়ার্কার ডিপ্লয় করুন:
wrangler deploy
স্টেপ ৭: ডিপ্লয়মেন্ট
এখন যেহেতু আমাদের অ্যাপ্লিকেশন রেডি, চলুন এটিকে Cloudflare Workers-এ ডিপ্লয় করি:
নিশ্চিত করুন Wrangler CLI ইনস্টলড আছে:
npm install -g wranglerআপনার Cloudflare অ্যাকাউন্টে অথেন্টিকেট করুন:
wrangler loginআপনার ওয়ার্কার ডিপ্লয় করুন:
wrangler deploy
স্টেপ ৮: আপনার API টেস্ট করা
আমাদের নতুন ডিপ্লয় করা API টেস্ট করি:
একটি নতুন API কী তৈরি করা
curl -X POST https://keyflow..workers.dev/keys/create \ -H "Content-Type: application/json" \ -d '{ "apiId": "my-api", "prefix": "prod", "name": "Production API Key", "expires": 1735689600000, "meta": { "environment": "production", "team": "backend" } }'
একটি API কী ভ্যালিডেট করা
curl -X POST https://keyflow..workers.dev/keys/verify \ -H "Content-Type: application/json" \ -d '{ "key": "prod_AbC123XyZ..." }'
রিপ্লেস করুন আপনার Cloudflare Workers সাবডোমেন দিয়ে এবং prod_AbC123XyZ... রিপ্লেস করুন Create এন্ডপয়েন্ট থেকে জেনারেট করা একটি আসল কী দিয়ে।
উপসংহার
একটি API কী জেনারেটার তৈরি করা আপনার অ্যাপ্লিকেশনের API সিকিউর করার এবং কে আপনার সার্ভিস অ্যাক্সেস করতে পারে তা ম্যানেজ করার একটি কী স্টেপ। একটি সিস্টেম বানানোর মাধ্যমে যা API কী জেনারেট, ভ্যালিডেট, এবং ম্যানেজ করতে পারে, আপনি একটি শক্তিশালী অ্যাক্সেস কন্ট্রোল লেয়ার যোগ করছেন যা আপনার ডেটা সেফ এবং অর্গানাইজড রাখতে সাহায্য করে।
এখানে একটি কুইক রানডাউন কী কী জিনিস একটি স olid API কী জেনারেটারে থাকে:
- সিকিউর কী জেনারেশন: যুনিক, সিকিউর কী যেগুলো কাস্টম প্রিফিক্স বা সেট লেংথের অপশন অন্তর্ভুক্ত করে, প্রতিটি কীকে ডISTINCT এবং অনুমান করা কঠিন করে।
- ভ্যালিডেশন এবং এক্সপায়ারেশন: চেক এবং এক্সপায়ারেশন ডেট যোগ করলে নিশ্চিত হয় প্রতিটি কী শুধু একটি নির্দিষ্ট সময়ের জন্য ভ্যালিড, যা অ্যাক্সেস কন্ট্রোল এবং লিমিট করা সহজ করে।
- মেটাডেটা এবং রেট লিমিটস: প্রতিটি কীসহ এক্সট্রা ইনফরমেশন স্টোর করা এবং রেট লিমিট সেট করা আপনাকে কী ইউজেজ মনিটর করতে, এক্টিভিটি ট্র্যাক করতে, এবং আপনার API-এর যেকোনো অবিউজ এড়াতে সাহায্য করে।
Upstash Redis এবং Cloudflare Workers-এর মতো টুলস ব্যবহার করে একটি সার্ভারлес এবং গ্লোবালি ডিস্ট্রিবিউটেড কী ম্যানেজমেন্ট সিস্টেম বানানো সহজ যা ভালো স্কেল করে এবং ইফিশিয়েন্টলি কাজ করে।
এই ফাউন্ডেশনসহ, আপনি আপনার API-এ অ্যাক্সেস সিকিউর এবং ম্যানেজেবল রাখতে সেট আপ হয়ে গেলেন, যা আপনাকে মানসিক শান্তি দেয় যে আপনার রিসোর্সগুলো প্রোটেক্টেড এবং সহজে মনিটর করা যাচ্ছে।