提问者:小点点

koa passport oauth2将令牌保存到状态


所以我试图将访问令牌保存到Koa中的状态,只是为了以后使用,并且省去了在客户机中传递它的麻烦。

根据Koa的passport oauth2文档,我正在努力将任何内容持久化到

Koa/passport oauth2设置:

server.koaApp.use(koaSession(
  {
    key: sessionKey,
    rolling: true,
    maxAge: sessionMaxAge,
    sameSite: 'none',
    secure: true,
    // @ts-ignore
    domain: undefined
  },
  server.koaApp,
));

// set up passport sessions here
function createPassport() {
  const passport = new KoaPassport();

  passport.use(new OAuth2Strategy({
    authorizationURL: oauthClientAuthUrl,
    tokenURL: oauthClientTokenUrl,
    clientID: oauthClientId,
    clientSecret: oauthClientSecret,
    callbackURL: oauthClientRedirectUrl,
  }, function(accessToken, refreshToken, params, profile, cb) {
    cb(null, {id: 'somedudesID', accessToken});
  }));

  passport.serializeUser((user, done) => {
    done(null, user);
  });

  passport.deserializeUser((user, done) => {
    done(null, user);
  });

  return passport;
};

应设置和读取AccessOken的路由声明:

router.get('/authorize', passport.authenticate('oauth2'), (ctx: any) => {
        const { accessToken } = ctx.session.passport.user;
        ctx.state.accessToken = accessToken;
        ctx.status = 200;
      });

    router.get('/get-token-from-state', (ctx: any) => {
      console.log(ctx.state.accessToken); // undefined
    });

问题:

> 的获取时未定义?

我甚至应该尝试像这样持久化访问令牌吗?在其他路线上是否有其他途径获得AccessOke?


共2个答案

匿名用户

我也有过同样恼人的经历。帮助您删除并用替换。然后设置内存存储-&>;现在它起作用了:)

我不确定将令牌存储在内存会话中是否是最好的主意--但现在这是我的第一稿。它只需要很小的代码块就可以与keycloak取得联系。

server.js

    var app = new Koa();
    app.keys = ['keys', 'keykeys'];
    var memoryStore = new session.MemoryStore();

    // Session
    app.use(session({
        secret: 'some secret',
        resave: false,
        saveUninitialized: true,
        store: memoryStore
      }));

    // Passport
    const passport = require('./oauth2')
    app.use(passport.initialize());
    app.use(passport.session());

匿名用户

所以,在回答我自己的问题时,有几个问题:

    <会话的licookie未保存在浏览器中,因为域稍有关闭(端口号不同。/li>

我可以在本地代理这一切都很好!