"TypeError: OAuth2Strategy requires a verify callback." but i send it (nestjs)

251 Views Asked by At

I call the constructor of OAuth2Strategy in app.controller.ts, i send it the 2 params it needs: options with clientID, callbackURL etc, and a verify callback function. But i have this error, looks like i don't send a verify callback function to the constructor, but i did. The error happens in node_modules/passport-oauth2/lib/strategy.js.

app.controller.ts:

import { Body, Controller, Get, Post, Query, Res, Req, Next, UnauthorizedException, UseGuards } from '@nestjs/common';
import { PartieService, JoueurService, CanalService } from './app.service';
import { Joueur, Partie, Canal } from './app.entity';
import { AuthGuard } from '@nestjs/passport';
import passport = require("passport");
import OAuth2Strategy = require("passport-oauth2");
//var OAuth2Strategy = require('passport-oauth2').OAuth2Strategy;
//import OAuth2Strategy from 'passport-oauth2';

@Controller()
export class AppController {
  constructor(private readonly partieService: PartieService, private readonly joueurService: JoueurService,
    private readonly canalService: CanalService) {}

  @Get('/oauth2')
  async oauth2(@Req() req, @Res() res, @Next() next) {
    passport.use('oauth2', new OAuth2Strategy( 
      {
                clientID: 'my_clientID',
                clientSecret: 'my_clientSecret',
                authorizationURL: 'https://api.abc.com/oauth/authorize',
                tokenURL: 'https://api.abc.fr/oauth/token',
                callbackURL: 'http://localhost:3000/Connection'
            }, 
      async (accessToken: string, refreshToken: string, profile: any, done: Function) => {
                    //console.log(profile);
                    try {
                        if (!accessToken || !refreshToken || !profile) {
                            return done(new UnauthorizedException(), false);
                        }
                        const user: Joueur = await this.joueurService.findOrCreate(profile);
                        return done(null, user);
                    } catch (err) {
                        return done(new UnauthorizedException(), false);
                    }
                } ));
    passport.authenticate('oauth2');
    return res.sendFile("/home/user42/Documents/Projets/ft_transcendence/services/pong/pong/public/connection.html");
  }

  @Get('/Connection')
  //@UseGuards(AuthGuard('oauth2')) 
  async Callback(@Req() req, @Res() res, @Next() next) {
    passport.authenticate('oauth2', (err, user, info) => {
      if (err || !user) {
        req.session.destroy();
        return res.status(401).json({
          message: 'Unauthorized',
        });
      }
      req.user = user;
      return next();
    })(req, res, next);

    const utilisateur: Joueur = req.user;
    console.log(utilisateur);
  }
[...]
}

node_modules/passport-oauth2/lib/strategy.js:

function OAuth2Strategy(options, verify) {
  if (typeof options == 'function') {
    verify = options;
    options = undefined;
  }
  options = options || {};

  if (!verify) { throw new TypeError('OAuth2Strategy requires a verify callback'); }
[...]
}

Error:

[Nest] 6550  - 05/02/2023, 18:34:54   ERROR [ExceptionHandler] OAuth2Strategy requires a verify callback
TypeError: OAuth2Strategy requires a verify callback
    at new OAuth2Strategy (/home/user42/Documents/Projets/ft_transcendence/services/pong/pong/node_modules/passport-oauth2/lib/strategy.js:84:24)
    at Injector.instantiateClass (/home/user42/Documents/Projets/ft_transcendence/services/pong/pong/node_modules/@nestjs/core/injector/injector.js:340:19)
    at callback (/home/user42/Documents/Projets/ft_transcendence/services/pong/pong/node_modules/@nestjs/core/injector/injector.js:53:45)
    at Injector.resolveConstructorParams (/home/user42/Documents/Projets/ft_transcendence/services/pong/pong/node_modules/@nestjs/core/injector/injector.js:132:24)
    at Injector.loadInstance (/home/user42/Documents/Projets/ft_transcendence/services/pong/pong/node_modules/@nestjs/core/injector/injector.js:57:13)
    at Injector.loadProvider (/home/user42/Documents/Projets/ft_transcendence/services/pong/pong/node_modules/@nestjs/core/injector/injector.js:84:9)
    at async Promise.all (index 3)
    at InstanceLoader.createInstancesOfProviders (/home/user42/Documents/Projets/ft_transcendence/services/pong/pong/node_modules/@nestjs/core/injector/instance-loader.js:47:9)
    at /home/user42/Documents/Projets/ft_transcendence/services/pong/pong/node_modules/@nestjs/core/injector/instance-loader.js:32:13
    at async Promise.all (index 1)

`

I tried to change the import OAuth2Strategy many times (like the commented lines). I tried a lot of things but i cannot remember all. I found no answer in internet, and no more with the not-so-well-chatgpt. I am new in nestjs and this error is weird for me, how can it ask me a parameter that i send ? Can someone help me to resolve this pls ? :)

Sorry if the answer is obvious :/ , it's my first API with nestjs

1

There are 1 best solutions below

0
Panoramix On

The error was coming from another file, my bad, it's fixed.