Passport.js со стратегией openid-client - TypeError: client должен быть экземпляром клиента openid-client - PullRequest
0 голосов
/ 24 мая 2019

Я строю приложение стека MERN, используя машинопись.Я использую паспорт со стратегией openid-client (https://github.com/panva/node-openid-client/blob/master/docs/README.md#strategy) для аутентификации пользователя. Я получаю следующую ошибку типа:

TypeError: client must be an instance of openid-client Client

Я пытался использовать Issuer.discover, новый Issuer () и await / async убедились, что узел и все мои пакеты обновлены, но безрезультатно.

Это соответствующий код:

import { Issuer, Strategy, generators } from "openid-client";

const googleClient = Issuer.discover("https://accounts.google.com/.well-known/openid-configuration")
    .then((googleIssuer: { Client: any; }) => {
        return googleIssuer.Client;
    });

Предполагается, что он возвращает экземпляр клиента openid-client, но возвращает ожидающее обещание.

Ответы [ 2 ]

0 голосов
/ 26 мая 2019

Решение для справки других.Я должен был положить все в обещание.

Issuer.discover('https://accounts.google.com/.well-known/openid-configuration')
    .then((googleIssuer: { issuer: any; metadata: any; Client: any; }) => {
        // console.log('Discovered issuer %s %O', googleIssuer.issuer, googleIssuer.metadata);
        const client = new googleIssuer.Client({
            client_id: process.env.GOOGLE_ID,
            client_secret: process.env.GOOGLE_SECRET,
            redirect_uris: ['list of URIs here'],
            response_types: ['code token id_token'],
        });

        const params = {
            client_id: process.env.GOOGLE_ID,
            response_type: 'code token id_token',
            scope: 'openid profile email',
            nonce: generators.nonce(),
            redirect_uri: 'URI here',
            state: generators.state(),
            prompt: 'select_account',
            display: 'popup',
            login_hint: 'sub',
        };

        const verify = ( tokenSet: any, userInfo: any, done: (arg0: null, arg1: any) => void ) => {
            console.log('USERINFO: ', userInfo);
            console.log('TOKENSET: ', tokenSet);
            return done(null, tokenSet);
        };

        const options = {
            client,
            params,
        };
        Passport.use('openid-client', new Strategy( options, verify ));
    }).catch((err: any) => {
        if (err) {
            console.log(err);
        }
    });
0 голосов
/ 25 мая 2019

Вы можете «дождаться» обещания, а затем его возвращаемому значению из оператора «then» будет присвоено значение переменной googleClient.

Попробуйте это

import { Issuer, Strategy, generators } from "openid-client";
​
let googleClient;
(async function discoverClient() {
  googleClient = await Issuer.discover("https://accounts.google.com/.well-known/openid-configuration")
  .then((googleIssuer: { Client: any; }) => {
    return googleIssuer.Client;
  });
})();

Некоторые хорошиеинформация об асинхронности / ожидании https://javascript.info/async-await

...