Hi I’m trying to make a log in using whoop api, currently they use passport and OAuth2.0, but it seems that it gaves me an error when i do the passport.authenticate in the callback endpoint.
This is my User.js routes
const express = require('express')
const app = express()
const passport = require('passport')
const OAuth2Strategy = require('passport-oauth2')
const User = require('../Models/User')
require('dotenv').config()
const whoopOAuthConfig = {
authorizationURL: `${process.env.WHOOP_API_HOSTNAME}/oauth/oauth2/auth`,
tokenURL: `${process.env.WHOOP_API_HOSTNAME}/oauth/oauth2/token`,
clientID: process.env.CLIENT_ID,
clientSecret: process.env.CLIENT_SECRET,
callbackURL: process.env.CALLBACK_URL,
state: true,
scope: [
'offline',
'read:profile',
'read:recovery',
'read:cycles',
'read:sleep',
'read:workout',
'read:body_measurement'
],
}
async function getUser(
accessToken,
refreshToken,
{expires_in},
profile,
done,
){
console.log(profile)
const {first_name, last_name, user_id} = profile
const user = await User.findOne({userId: user_id})
if (user) {
user.acessToken = accessToken
user.refreshToken = refreshToken
user.expiresIn = Date.now() + expires_in * 1000
user.firstName = first_name
user.lastName = last_name
user.userId = user_id
await user.save()
done(err, user)
} else{
const newUser = new User({
acessToken: accessToken,
refreshToken: refreshToken,
expiresIn: Date.now() + expires_in * 1000,
firstName: first_name,
lastName: last_name,
userId: user_id,
})
done(err, newUser)
}
}
async function fetchProfile(
accessToken,
done,
){
console.log(accessToken)
const profileResponse = await fetch(
`${process.env.WHOOP_API_HOSTNAME}/developer/v1/user/profile/basic`,
{
headers: {
Authorization: `Bearer ${accessToken}`,
},
},
)
const profile = await profileResponse.json()
done(err, profile)
}
const whoopAuthorizationStrategy = new OAuth2Strategy(whoopOAuthConfig, getUser)
whoopAuthorizationStrategy.userProfile = fetchProfile
passport.use('oauth2', whoopAuthorizationStrategy)
var printSometing = function(req, res, next) {
console.log("I'm still here");
return next();
}
app.get('/auth/performance',
passport.authenticate('oauth2'));
app.get('/auth/performance/callback',
passport.authenticate('oauth2', {failureRedirect: '/', failureMessage: true }),
printSometing, function (req, res) {
res.redirect('http://localhost:3000/');
});
module.exports = app;
And this is my index.js
const express = require('express')
const app = express()
const port = 8081
const cors = require('cors')
const session = require('express-session')
const mongoose = require('mongoose')
require('dotenv').config()
var bodyParser = require( 'body-parser' );
const passport = require('passport')
mongoose.connect(process.env.MONGO_URI)
const database = mongoose.connection;
database.on('error', console.error.bind(console, 'connection error:'));
database.once('connected', function() {
console.log("Connected to MongoDB")
});
app.get('/', (req, res) => {
res.send({msg: 'Hello World!'})
})
app.use(session({secret: process.env.CLIENT_SECRET, resave: true, saveUninitialized: true}))
app.use(express.urlencoded({ extended: false }));
app.use(bodyParser.json({ limit: '10mb' }));
app.use(bodyParser.urlencoded({ extended: true, limit: '10mb' }));
app.use(passport.initialize());
app.use(passport.session());
app.use(cors());
app.use('/api', require('./routes/user.js'));
app.listen(port, () => {
console.log(`Example app listening on port ${port}`)
})
I’ve followed the Whoop’s API documentation and it didn’t work, tried to change the secret and api keys and online reasearch.