Skip to content

Instantly share code, notes, and snippets.

@guillegette
Last active August 3, 2022 06:40
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save guillegette/fa7224724d1e08823b104d2afd9fc705 to your computer and use it in GitHub Desktop.
Save guillegette/fa7224724d1e08823b104d2afd9fc705 to your computer and use it in GitHub Desktop.
Implementing Slack Oauth 2.0 for www.workat.com
const loginCallback = async (req, res, next) => {
const redirectUri = 'https://...'; // would be the URL defined above
const slackClient = await getSlackOpenIdClient(redirectUri);
const { slackLoginVerifyCode } = req.session;
const tokenSet = await slackClient.callback(
redirectUri,
req.query,
{ code_verifier: slackLoginVerifyCode }
);
const { access_token: accessToken } = tokenSet;
const {
'https://slack.com/team_id': teamId,
'https://slack.com/target_uri': targetUri,
'https://slack.com/user_id': slackUserId
} = tokenSet.claims();
};
'use strict';
const { Issuer, generators } = require('openid-client');
const {
slackClientId,
slackClientSecret,
slackOpenIdIssuer
} = require('./config'); // your own configs
// Keep in memory to reduce calls
let issuer;
const getSlackOpenIdClient = async (callbackUri) => {
if (!issuer) {
issuer = await Issuer.discover(slackOpenIdIssuer);
}
return new issuer.Client({
client_id: slackClientId,
client_secret: slackClientSecret,
redirect_uris: [callbackUri],
});
};
const login = async (req, res, next) => {
const { state } = req.query;
try {
// eslint-disable-next-line max-len
const callbackUri = 'https://..../callback'; // where slack will send the user back after authorization
const slackClient = await getSlackOpenIdClient(callbackUri);
// Generate code and save in session
const codeVerifier = generators.codeVerifier();
req.session.slackLoginVerifyCode = codeVerifier;
const codeChallenge = generators.codeChallenge(codeVerifier);
const slackLoginUrl = slackClient.authorizationUrl({
scope: LOGIN_SCOPES,
code_challenge: codeChallenge,
code_challenge_method: 'S256',
});
return res.redirect(slackLoginUrl);
} catch (err) {
logger.error('Error during slack login', err);
return next(err);
}
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment