#javascript #node.js #okta #express-session #req
#javascript #node.js #okta #экспресс-сессия #запрос
Вопрос:
Есть похожие вопросы, но они не касаются того, почему это приложение express-session постоянно работает в Safari, но не в Chrome.
Ниже приведен мой серверный код, который требуется только для аутентификации одной страницы с видом выхода и входа в систему. Вчера это работало в Chrome при локальном обслуживании и при развертывании в Azure или Heroku. Сегодня, без каких-либо изменений, он вообще не работал в Chrome, как локально, так и развернуто. Домашняя страница загружается, но когда я нажимаю «Войти» и перенаправляюсь на страницу входа в Okta, это ошибка, которую я получаю после входа в систему при перенаправлении обратно на мою страницу (например, localhost:3000 / authorization-code / callback?code = xxxxxxxx amp; state = xxxxxxxx) после входа в систему:
Ошибка: не найдено ожидаемых сведений о запросе авторизации в сеансе, запрос.session[«oidc: https:// subdomain.domain.com/oauth2/default»] не определен
Затем я протестировал в Safari, где он последовательно работал без проблем — как локальный, так и размещенный. Я только что заметил, что размещенная версия снова работает в Azure на данный момент — опять же, без изменений или перераспределения. Локальная версия по-прежнему не работает.
const http = require('http')
const express = require('express')
const path = require('path')
const app = express()
const fs = require('fs')
require('dotenv').config()
app.use(express.json())
app.use(express.urlencoded({
extended: true
}))
app.use(express.static('express'))
var cors = require('cors')
const OktaJwtVerifier = require('@okta/jwt-verifier')
const session = require('express-session')
const {
ExpressOIDC
} = require('@okta/oidc-middleware')
var getUserInfo = require('./getUserInfo')
// session support is required to use ExpressOIDC
app.use(
session({
secret: 'secretsecret',
resave: true,
saveUninitialized: false,
cookie: {
httpOnly: false,
},
})
)
const oidc = new ExpressOIDC({
issuer: process.env.ISSUER || 'https://[okta hosted custom domain].com/oauth2/default',
client_id: process.env.CLIENT_ID || 'xxxxxxxxxx',
client_secret: process.env.CLIENT_SECRET || 'xxxxxxxxxxxxxxxxxxx',
redirect_uri: process.env.REDIRECT_URI ||
'http://localhost:3000/authorization-code/callback',
appBaseUrl: process.env.APP_BASE_URL || 'http://localhost:3000',
scope: 'openid profile',
})
// ExpressOIDC attaches handlers for the /login and /authorization-code/callback routes
app.use(oidc.router)
app.use(cors())
app.options('*', cors())
app.get('/userinfo', (req, res) => {
console.debug("in user info")
let domain = 'dev'
if (req.isAuthenticated()) {
getUserInfo.userRequest(res, req.userContext, domain)
}
})
app.get('/authStatus', (req, res) => {
console.debug("in auth status")
if (req.isAuthenticated()) {
res.send(req.userContext.userinfo)
}
})
app.post('/forces-logout', oidc.forceLogoutAndRevoke(), (req, res) => {
// Nothing here will execute, after the redirects the user will end up wherever the `routes.logoutCallback.path` specifies (default `/`)
})
// default URL for website
app.get('/', function(req, res) {
res.sendFile(path.join(__dirname '/express/index.html'))
//__dirname : It will resolve to your project folder.
})
// FAQ Path
app.get('/help', function(req, res) {
res.sendFile(path.join(__dirname '/express/help.html'))
//__dirname : It will resolve to your project folder.
})
// default URL for website
app.get('*', function(req, res) {
res.sendFile(path.join(__dirname '/express/index.html'))
//__dirname : It will resolve to your project folder.
})
const port = normalizePort(process.env.PORT || '3000')
const server = http.createServer(app)
server.listen(port)
console.debug('Info site server listening on port ' port)
function normalizePort(val) {
var port = parseInt(val, 10)
if (isNaN(port)) {
// named pipe
return val
}
if (port >= 0) {
// port number
return port
}
return false
}
Комментарии:
1. здесь та же проблема. @jake-durell вы нашли исправление для этого?