使用Node.js进行LTI启动身份验证

使用Node.js进行LTI启动身份验证,node.js,authentication,express,oauth,lti,Node.js,Authentication,Express,Oauth,Lti,我使用express.js框架创建了一个简单的“hello world”web应用程序 我希望该应用程序符合IMS-LTI,以便moodle和其他学习管理系统可以将其作为外部工具启动 但是,我不知道如何在我的应用程序中验证LTI启动(它使用oauth),并且我也找不到任何express.js/node.js示例来说明它是如何完成的。我看到passport lti节点模块存在(),但作为节点的noob,我不理解稀疏文档 我已经使用passport.js创建了本地身份验证-使用这个视频(),我希望能

我使用express.js框架创建了一个简单的“hello world”web应用程序

我希望该应用程序符合IMS-LTI,以便moodle和其他学习管理系统可以将其作为外部工具启动

但是,我不知道如何在我的应用程序中验证LTI启动(它使用oauth),并且我也找不到任何express.js/node.js示例来说明它是如何完成的。我看到passport lti节点模块存在(),但作为节点的noob,我不理解稀疏文档

我已经使用passport.js创建了本地身份验证-使用这个视频(),我希望能为LTI启动身份验证提供类似的帮助

感谢您的帮助

干杯, Ollie

当LTI工具使用者(即LMS)启动LTI应用程序(工具提供者)时,LTI工具将发送HTTP Post

为了验证post是否合法,需要使用配置LTI工具时与工具使用者交换的共享密钥在本地重新计算签名,从而验证post变量“oauth_signature”是否有效

验证OAuth签名的行为可能由OAuth库处理。。nodejs已经有了这些,所以请不要重新实现一个


您可以在

中阅读验证启动请求的完整过程。我只想提到,不久前我做了一个这样的工作示例

我最终执行了一个自定义passport策略,并使用另一个库进行身份验证


这是
新的lti.Provider
位,关键是它需要lti post req对象来进行身份验证。

我最终设法解决了这个问题。我没有意识到节点模块带有测试代码和文档。我使用测试代码来理解如何使用它。如果您不介意,可以在这里发布您的答案吗?我可以在node.js服务器上安装它,但我在如何使用它方面遇到了困难。@aless80,如果您不提供一个更精确的示例说明您在哪里遇到了困难/什么地方出了问题,我将无法帮助您。我帮助过的一个人的heroku设置有问题。你是对的,我必须再次尝试你的代码。让我困惑的是ims lti代码。文档代码中似乎省略了括号。我最后修改了这里的例子:我正在尝试PAOL Present和start-pm2-prod不运行。您可以更详细地说明问题,或者在实际回购中发布问题吗?我不再在维护它的机构工作,尽管我知道我可能是FOSS社区中为数不多的lti passport实现之一。它的目的是与PAOL一起运行,这是一个完整的讲座捕获系统。我已经好几年没做了。我建议查看源代码,而不是它的功能。
passport.use('lti-strategy', new CustomStrategy(
    function(req, callback) {
        var val = (req.body) ? req.body : req.user      
        try{
            var provider = new lti.Provider(val , process.env.LTI_SECRET)   
            if(req.user){
                callback(null, val)         
            }
            else{
                provider.valid_request(req, function(err, isValid) {
                    if(err){
                        console.log("LTI Error", err, isValid)
                    }
                    callback(err, val)
                });
            }       
        }
        catch(err){
            console.log("Authenication error", err)
            callback(err, null)
        }
    }
))