Verifying API requests from different sources

I’m working on a sports data platform. We offer our API through our website and RapidAPI. I’m confused about handling authentication for these different sources.

On our site, users have a request limit. We check their API key in our Node/Express backend. But on RapidAPI, users get a different key. RapidAPI checks it before sending requests to us.

How can I tell if a request needs our API key check or if it’s pre-verified by RapidAPI? I’m thinking something like this:

app.get('/api/sports/odds', (req, res) => {
  if (isRapidAPIRequest(req)) {
    // Trust RapidAPI's auth, continue
  } else {
    // Check our API key
    if (isValidApiKey(req.query.key)) {
      // Continue
    } else {
      res.status(401).send('Invalid API key');
    }
  }
  // Handle request...
});

Any ideas on how to implement this? Is there a best practice for managing multiple API sources?

Having dealt with a similar situation, I can share some insights. One effective approach is to leverage HTTP headers. RapidAPI typically includes custom headers in their requests, such as ‘X-RapidAPI-Proxy-Secret’. You can check for these headers to identify RapidAPI requests.

Implement a middleware function to handle this logic:

function authMiddleware(req, res, next) {
  if (req.headers['x-rapidapi-proxy-secret']) {
    // RapidAPI request, proceed
    next();
  } else if (isValidApiKey(req.query.key)) {
    // Valid API key from your platform
    next();
  } else {
    res.status(401).send('Unauthorized');
  }
}

Then apply this middleware to your routes:

app.get('/api/sports/odds', authMiddleware, (req, res) => {
  // Handle request logic here
});

This approach centralizes authentication logic and keeps your route handlers clean. Remember to securely store and validate the RapidAPI secret to prevent spoofing.

hey man, in my experince rapidapi always sends ‘x-rapidapi-proxy-secret’.
check for it in ur request, if present trust rapidapi, else verify ur own key.

if(req.headers['x-rapidapi-proxy-secret']){
  // trust rapidapi
}

hope that clears it up!

I’ve dealt with this exact issue in my work. Here’s what I found effective:

Create a custom header in your RapidAPI setup, something like ‘X-Custom-Source: RapidAPI’. Then in your backend:

function checkSource(req, res, next) {
  if (req.headers['x-custom-source'] === 'RapidAPI') {
    req.isRapidAPI = true;
  } else {
    req.isRapidAPI = false;
  }
  next();
}

app.use(checkSource);

app.get('/api/sports/odds', (req, res) => {
  if (req.isRapidAPI || isValidApiKey(req.query.key)) {
    // Process request
  } else {
    res.status(401).send('Unauthorized');
  }
});

This approach is clean and scalable. It allows you to easily add more sources in the future without cluttering your route handlers. Just make sure to keep that custom header value secure.