запрос.session не определен для приложения express (с использованием промежуточного программного обеспечения Okta) в Chrome, но не safari

#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 вы нашли исправление для этого?