У меня был такой же раздражающий опыт. Помогло удаление koa-session
и замена его на koa-generic-session
. Затем я установил хранилище памяти -> теперь оно работает:)
Я не уверен, что хранение токена в сеансе памяти - лучшая идея - но сейчас это мой первый черновик. Это всего лишь небольшой блок кода, чтобы связаться с Keycloak.
сервер. 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());
oauth2. js
const request = require('request');
const passport = require('koa-passport');
const OAuth2Strategy = require('passport-oauth2').Strategy;
const clientId = "b2m";
const clientSecrect = "57ce5bba-f336-417f-b9c2-06157face88f";
OAuth2Strategy.prototype.userProfile = function (accessToken, done) {
var options = {
url: 'http://localhost:8080/auth/realms/master/protocol/openid-connect/userinfo',
headers: {
'User-Agent': 'request',
'Authorization': 'Bearer ' + accessToken,
}
};
request(options, callback);
function callback(error, response, body) {
if (error || response.statusCode !== 200) {
return done(error);
}
var info = JSON.parse(body);
return done(null, info);
}
};
passport.use(new OAuth2Strategy({
authorizationURL: 'http://localhost:8080/auth/realms/master/protocol/openid-connect/auth',
tokenURL: 'http://localhost:8080/auth/realms/master/protocol/openid-connect/token',
clientID: clientId,
clientSecret: clientSecrect,
callbackURL: "http://localhost:3000/callback"
},
function(accessToken, refreshToken, profile, cb) {
console.log('#########################################################');
console.log('Authenticated with OAuth2');
console.log('accessToken', accessToken);
console.log('refreshToken', refreshToken);
var user = {
accessToken: accessToken,
refreshToken: refreshToken,
profile: profile
};
console.log('user', user);
return cb(null, user);
}
));
/* Example: storing user data received from the strategy callback in the session, i.e. in `req.session.passport.user` */
passport.serializeUser(function(user, done) {
done(null, user);
});
/* Example: getting the user data back from session and attaching it to the request object, i.e. to `req.user` */
passport.deserializeUser(function (user, next) {
/*
Example: if only a user identifier is stored in the session, this is where
the full set could be retrieved, e.g. from a database, and passed to the next step
*/
next(null, user);
});
module.exports = passport;