新的express openid连接包出现问题



过去几天我一直在尝试使用express openid connect,但没有成功。当我对参数进行艰苦编码时,我能够让流程正常工作。然而,我的目标是能够根据登录的用户动态调用auth((

app.use(auth(functionThatGetsParams()));

使用上述方法,express抱怨需要保密。出于某种原因,在解决其他问题之前,会调用auth调用。

我还尝试了一些不同的方法,

app.use((req,res, next)=> process.env.secret = 'hello');
app.use(auth({secret: process.env.secret}));

上面的示例还返回了机密问题。然而,在app.use之外设置process.env.secret效果良好。

我的问题似乎与我在app.use区块中所做的事情有关。我希望使用的方法是通过一个调用来解析我的用户,并在此基础上获得正确的设置。

app.use(ConnectionResolver.resolve);

我使用了一个类似于上面的调用,它基本上是一个处理程序,它做一些异步的事情来获取客户端信息和正确的设置,然后以next((结束。

我希望那时能打电话给

app.use(auth(ConnectionManager.getAuthSettings()));

会返回我需要的身份验证设置,但当我调试时,看起来这一行在其他任何事情之前都被调用了,所以正如错误所说,secret丢失了。

我相信我在网上看到的另一个选项是为每个客户端创建一个身份验证调用列表,然后我可以使用它进行身份验证,但我还没有看到任何这样做的例子。

有人知道这是怎么可能的吗?我所处的环境是多租户的。因此,我需要能够根据进行调用的用户动态地使用特定的auth-config。

如有任何帮助,我们将不胜感激。

您误解了中间件的概念。

auth函数是一个中间件工厂函数,它获得一组选项并基于这些选项返回一个中间件函数。

传递给express应用程序的use方法的函数将仅在传入请求到达时执行。

当您执行app.use(auth(getParams()))时,会发生的情况是,当您的服务器启动时,它将调用getParams函数,并将结果传递给auth函数,后者将返回将传递给app.use函数的身份验证中间件函数。

一旦请求到达,auth中间件(auth工厂函数返回的中间件(就会执行。

您不需要有条件地使用auth。您应该设置它,然后可以使用express-openid-connect包提供的requiresAuth中间件来保护需要授权/身份验证的路径。

如果您的秘密是异步加载的,请将您的整个express应用程序设置封装在引导函数中,加载您的秘密,然后调用服务器引导函数。

async function loadSecret() {
//load secret from external source
}
function bootstrapServer(secret) {
const app = express()

app.use(auth({ ..., secert }))

app.get('protected', requiresAuth(), (req, res) => {
// your protected route, will automatically return 401 if not authenticated
})
app.get('non-protected', (req, res) => {
// This route will be open to all without authentication
})
}

最新更新