【问题标题】:Passport.js with openid-client strategy-- TypeError: client must be an instance of openid-client ClientPassport.js with openid-client strategy-- TypeError: client must be an instance of openid-client Client
【发布时间】:2019-05-24 04:07:48
【问题描述】:

我正在使用 typescript 构建一个 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 和 new Issuer(),并等待/异步,确保 node 和我所有的包都是最新的,但无济于事。

这是相关代码:

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 客户端实例,但它返回一个待处理的承诺。

【问题讨论】:

    标签: reactjs typescript passport.js openid-connect


    【解决方案1】:

    您可以“等待”一个承诺,然后它的“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;
      });
    })();
    

    关于 async/await https://javascript.info/async-await 的一些有用信息

    【讨论】:

      【解决方案2】:

      解决方案供他人参考。我必须把所有东西都放在承诺中。

      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);
              }
          });
      

      【讨论】:

        猜你喜欢
        • 2021-07-11
        • 2018-07-25
        • 2017-08-14
        • 2018-03-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-02
        • 1970-01-01
        相关资源
        最近更新 更多