使用loopback

时间:2016-05-18 14:52:49

标签: node.js loopbackjs

我必须实现连接到现有MySQL数据库的strongloop API。我目前正在尝试基于用户创建一个模型,但我在请求中遇到了loggin。

问题是:我的数据库中的用户已经有密码,但加密与环回中使用的加密不同。有没有办法在strongloop中更改所有与密码相关的请求才能使用我的加密?而且有点棘手:有没有办法根据模型中的布尔值选择加密(即我正在考虑迁移所有密码,但我必须确保我的用户仍然可以使用他们的密码登录旧的和脏的加密密码)

谢谢,

bjorge

3 个答案:

答案 0 :(得分:1)

我认为你可以,但将内置插件改为那种程度会非常痛苦。在引导脚本中注入新路由可能会更好,并有条件地使用内置User模型上的辅助函数,例如: User.verify()User.confirm()

粗略地说:

module.exports = function (app) {
    //get User model from the express app
    var UserModel = app.models.User;

    //get your custom model
    var customModel = app.models.someCustomModel;

    app.post('/login', function (req, res) {        

        //parse user credentials from request body
        const userCredentials = {
            "username": req.body.username,
            "password": req.body.password
        }

        if (customModel.someBoolean == true) {
            //do your login stuff
        } else {
            UserModel.login(userCredentials, 'user', function (err, result) {           
                //handle response
            });     
        }

    });

}

答案 1 :(得分:1)

我的回答是基于@amuramoto的回答,但有两个额外的假设

  1. 在自定义登录后需要accessToken
  2. 如果仍然使用旧密码
  3. ,则在数据库中存储布尔值

    以下是代码:

    module.exports = function(app) {
        //get User model from the express app
        var UserModel = app.models.User;
        app.post('/login', function(req, res) {
    
            //parse user credentials from request body
            const userCredentials = {
                "username": req.body.username,
                "password": req.body.password
            }
    
            UserModel.findOne({
                "where": {
                    "username": userCredentials.username
                }
            }, function(err, user) {
    
    
                if (user.isOldPassword == true) {
                    //do your login method
    
    
                    // Create the Access Token as a return Value
                    user.createAccessToken(5000, function(err, token) {
                        res.json({
                            "token": result.id,
                            "ttl": result.ttl
                        });
                    })
    
    
                } else {
                    UserModel.login(userCredentials, 'user', function(err, result) {
                        //handle response
    
                        if (err) {
                            res.status(401).json({
                                "error": "login failed"
                            });
                            return;
                        }
    
                        //transform response to only return the token and ttl
                        res.json({
                            "token": result.id,
                            "ttl": result.ttl
                        });
                    });
                }
            })
        });
    }
    

答案 2 :(得分:0)

我们有类似的情况。我们想使用自己的用户模型和密码模式,最终决定不使用Loopback身份验证(或用户模型)。正如上面提到的amuramoto,这确实有点痛苦。但是我们可以通过使用我们自己的JWT实现以及我们自己的用户登录模型来实现它。这是一般的想法...

// *************
// Login Model
// *************

let Jwt = require('jwt-simple');

// Custom login/authentication goes here...
export function getToken(data, callback) {

    if (!data || !data.companyid || !data.userid || !data.password)
        return callback(null, Lib.returnEvent(false, 'Unauthorized', 401))

    try {

            Login.verifyLogin(data.companyid, data.userid, data.password).always(function (verified, payload) {

                if (verified) {

                    let token = Jwt.encode(payload, 'JWTPASSWORD');

                    let eventInfo: Type.Event = {
                        success: true,
                        messagenbr: 200,
                        returnvalue: token
                    }

                    return callback(null, eventInfo);

                } else {
                    return callback(null, Lib.returnEvent(false, 'Unauthorized', 401))
                }

            })

    } catch(e) {
        return callback(null, Lib.returnEvent(false, 'Unauthorized', 401))
    }
}

export function remoteMethod(model: any) {

    model.remoteMethod(
        'getToken',
        {
            http: { verb: 'post' },
            accepts: {arg: 'data', type: 'data' },
            returns: [
                { arg: 'eventinfo', type: 'data', root: true },
            ],
        }
    )
    return model;
}

然后,使用Loopback's middleware 'parse' phase进行令牌验证。

// ***************************
// Authenication - Parse Request (set filters)
// ***************************
app.middleware('parse', parseRequest)

  function parseRequest(req, res, next) {

    try {

        //
        let token: Type.JwtToken = Login.getToken(req);

        // If this is the actual login then return. 
        // Otherwise it will block the login url.
        if (token && token.crowid && req.url != '/api/login/gettoken' ) {
            companyrowid = token.crowid;
        }

    } catch (e) {
        debug.log('parse', 'error.catch', e)
    }

    return next();
} 

........     

// ***************************
// Verify Authentication Token
// ***************************
app.middleware('auth:before', Login.authenticateToken)