Back

How to build a public Runkeeper integration: Building the Auth Flow

Aug 18, 20247 minute read

Hey there, fellow JavaScript enthusiasts! Ready to dive into the world of Runkeeper integrations? Today, we're going to tackle one of the most crucial aspects of building a public integration: the authorization flow. Buckle up, because we're about to make your app play nice with Runkeeper's API!

Setting the Stage

Before we jump in, let's quickly touch on why we're here. Runkeeper's API is a goldmine of fitness data, but to access it, we need to implement a rock-solid authorization flow. This isn't just about following the rules – it's about creating a smooth, secure experience for your users.

What You'll Need

Alright, let's make sure you've got your ducks in a row:

  • Runkeeper API credentials (if you don't have these yet, hop over to their developer portal)
  • A Node.js environment with Express.js set up (I'm assuming you've got this covered, you savvy dev, you!)

OAuth 2.0: The VIP Pass

We'll be using OAuth 2.0's Authorization Code Grant flow. Think of it as the VIP pass to the Runkeeper data party. It's secure, it's user-friendly, and it's exactly what we need.

Crafting the Perfect Invitation

First things first, we need to construct the authorization URL. This is where your users will go to give your app the green light. Here's how you might do it:

const authUrl = `https://runkeeper.com/apps/authorize?client_id=${YOUR_CLIENT_ID}&response_type=code&redirect_uri=${YOUR_REDIRECT_URI}`;

Now, when it's time to start the auth flow, just redirect your user to this URL. Easy peasy!

Rolling Out the Welcome Mat

When the user grants permission, Runkeeper will send them back to your redirect_uri with a special gift: the authorization code. Let's set up a route to receive it:

app.get('/callback', (req, res) => { const authCode = req.query.code; // Time to exchange this code for an access token! });

Trading Up: Code for Token

Now comes the fun part. We're going to exchange that authorization code for an access token. It's like trading in your ticket stub for backstage passes:

const tokenResponse = await axios.post('https://runkeeper.com/apps/token', { grant_type: 'authorization_code', code: authCode, client_id: YOUR_CLIENT_ID, client_secret: YOUR_CLIENT_SECRET, redirect_uri: YOUR_REDIRECT_URI }); const accessToken = tokenResponse.data.access_token;

Boom! You've got the access token. This is your key to the Runkeeper kingdom.

Keeping the Party Going: Token Refresh

Access tokens don't last forever, but don't worry – that's where refresh tokens come in. When your access token expires, use the refresh token to get a new one:

const refreshResponse = await axios.post('https://runkeeper.com/apps/token', { grant_type: 'refresh_token', refresh_token: storedRefreshToken, client_id: YOUR_CLIENT_ID, client_secret: YOUR_CLIENT_SECRET }); const newAccessToken = refreshResponse.data.access_token;

Locking It Down: Security First

Security isn't just important, it's essential. Here are two quick tips:

  1. Use a state parameter to prevent CSRF attacks:
const state = generateRandomString(); // Include this state in your auth URL and verify it in the callback
  1. Implement PKCE (Proof Key for Code Exchange) for an extra layer of security. It's like a secret handshake between your app and Runkeeper.

Handling the Unexpected

Sometimes things don't go as planned. Maybe the user says "no thanks" to your app, or a token expires. Don't sweat it – just make sure you've got error handling in place:

if (req.query.error) { // Handle the error gracefully }

Taking It for a Spin

Before you ship it, take your auth flow for a test drive. Click through it yourself, try to break it (trust me, it's fun), and maybe even write some automated tests if you're feeling fancy.

You've Got the Power!

And there you have it! You've just built a secure, user-friendly authorization flow for your Runkeeper integration. With this in place, you're ready to start pulling in those sweet, sweet fitness stats.

Remember, the auth flow is just the beginning. Now that you've got the keys to the kingdom, the real fun begins. Go forth and build something awesome!

Happy coding, and may your step counts always be high! 🏃‍♂️💨