Back

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

Jul 17, 20247 minute read

Hey there, fellow JavaScript enthusiast! Ready to dive into the world of Notion integrations? Today, we're going to tackle one of the most crucial aspects of building a public Notion integration: the authorization flow. Buckle up, because we're about to make your integration secure and user-friendly in no time!

Introduction

Notion integrations are a game-changer, allowing us to extend the platform's capabilities and create awesome tools for users. But before we can do any of that cool stuff, we need to nail the auth flow. It's like the bouncer at an exclusive club – it keeps the riffraff out and lets the VIPs (your users) in.

Prerequisites

Before we jump in, make sure you're comfortable with:

  • Notion API basics
  • OAuth 2.0 (don't worry, we'll refresh your memory)
  • Your favorite JavaScript framework (Express.js, anyone?)

Got your dev environment set up? Great! Let's roll.

Setting up the integration

First things first, head over to the Notion developers page and create a new integration. You'll get a client ID and client secret – treat these like your firstborn, especially the secret. We'll need them soon.

Implementing the auth flow

Step 1: Redirect to Notion's authorization page

Time to send your users on a little trip to Notion's auth page. Here's how:

const authUrl = `https://api.notion.com/v1/oauth/authorize?client_id=${CLIENT_ID}&response_type=code&owner=user&redirect_uri=${REDIRECT_URI}`; // Redirect the user to authUrl

Pro tip: Use a secure, random state parameter to prevent CSRF attacks. Your future self will thank you.

Step 2: Handling the callback

Notion's going to send your user back with a shiny authorization code. Catch it like this:

app.get('/callback', (req, res) => { const { code } = req.query; // Now, let's trade this code for an access token });

Step 3: Exchanging the code for an access token

Time to make the trade of the century – code for token:

const response = await fetch('https://api.notion.com/v1/oauth/token', { method: 'POST', headers: { 'Authorization': `Basic ${Buffer.from(`${CLIENT_ID}:${CLIENT_SECRET}`).toString('base64')}`, 'Content-Type': 'application/json' }, body: JSON.stringify({ grant_type: 'authorization_code', code, redirect_uri: REDIRECT_URI }) }); const { access_token } = await response.json(); // Store this token securely. It's your golden ticket!

Step 4: Using the access token

Now you're in! Use this token to make authenticated requests to the Notion API:

const notionResponse = await fetch('https://api.notion.com/v1/users/me', { headers: { 'Authorization': `Bearer ${access_token}`, 'Notion-Version': '2022-06-28' } });

Security considerations

Remember, with great power comes great responsibility. Keep your client secret and access tokens locked up tight. Use HTTPS everywhere, and implement CSRF protection. Your users are trusting you with their data, so don't let them down!

Error handling and edge cases

Things will go wrong. It's not pessimism, it's programming! Handle errors gracefully:

try { // Your auth code here } catch (error) { console.error('Oops!', error); // Show a user-friendly error message }

Testing the auth flow

Test, test, and test again! Try happy paths, sad paths, and everything in between. Consider setting up automated tests to catch any future hiccups.

Conclusion

And there you have it! You've just built a rock-solid auth flow for your Notion integration. Pat yourself on the back – you've taken the first big step towards creating something awesome.

Remember, this is just the beginning. Now that you've got authentication sorted, the Notion API is your oyster. Go forth and build amazing things!

Additional resources

Want to dive deeper? Check out:

Happy coding, and may your integrations be ever awesome!