Как создать промежуточное ПО для API входа в систему (Создать маркер входа в систему) - PullRequest
0 голосов
/ 15 мая 2018
// Login
app.post('/user/login',(req, res) => {    
    var body = _.pick(req.body,['email','password']);    
    User.findByCredential(body.email,body.password).then((user) => {
        if(user.isadmin === true){
            //token coad
            let token = jwt.sign({email : user.email}, 'tokenKey111');
            user.tokens.pop()
            user.tokens.push({token});
            user.save(function (err) {
              if (err) {
                res.status(500).send(err)   
              } else {
                res.status(200).header('x-auth',token).send(`welcome ${user.email} you are logedin as Admin..`);
              }
            })
            //end
        }else{
            if(user.isconfirmed === true){
                if(user.isblocked === false){
                    //token coad
                    let token = jwt.sign({email : user.email}, 'tokenKey111');
                    user.tokens.pop()
                    user.tokens.push({token});
                    user.save(function (err) {
                      if (err) {
                        res.status(500).send(err)
                      } else {
                        res.status(200).header('x-auth',token).send(`Welcome ${user.firstname} you are successfully Logedin....! `);
                      }
                    })
                    //end
                }else{
                    res.status(401).send("Oh Nooo..!\nYou are blocked by Admin..!");
                }
            }else{
                res.status(401).send("Please verify your email address...");
            }
        }        
    }).catch((e) => {
        res.status(400).send(e);
    });
});

Это мой API входа в систему, в котором я беру электронную почту и пароль со стороны пользователя (ADMIN / USER), и после определенных критериев я генерирую токен для этого пользователя / пользователей.

Теперь я хочудля создания промежуточного программного обеспечения или чего-то в этом роде, с помощью которого я могу повторно использовать свой токен-код, который написан как для входа администратора, так и для входа пользователя.

1 Ответ

0 голосов
/ 15 мая 2018

Хорошо, есть несколько вещей, которые вам нужно сделать при использовании JWT, чтобы сделать его более надежным и безопасным.

Самое главное, вы не должны использовать tokenKey111 как секрет (это не очень секретно) или что-то подобное. Используйте пары открытого и закрытого ключей, чтобы сделать его безопасным.

В любом случае, поскольку вы не упомянули имя пакета, которое вы используете, я бы порекомендовал вам использовать - jsonwebtoken в качестве пакета jwt, я нашел его лучше, чем многие другие доступные там.

Вот услуга JWT.js:

// FileName = JWT.js

const fs        = require('fs');           // to read keys
const path      = require('path');         // to conveniently get paths
const jwt       = require('jsonwebtoken'); // JWT provider

// use 'utf8' to get string instead of byte array
var privateKEY  = fs.readFileSync(path.normalize( path.join(__dirname, '/private.key')), 'utf8');
var publicKEY   = fs.readFileSync(path.normalize( path.join(__dirname, '/public.key')), 'utf8');

module.exports = {
    sign: (payload, $Options) => {
        /*
            sOptions = {
                issuer: "Authorizaxtion/Resource/This server",
                subject: "iam@user.me", 
                audience: "Client_Identity" // this should be provided by client
            }
        */

        // Token signing options
        var signOptions = {
            issuer:     $Options.issuer || "SomeOrg.inc",
            subject:    $Options.subject,
            audience:   $Options.audience,
            expiresIn:  "30d",              // 30 days validity
            algorithm:  "RS256"             // RSASSA options[ "RS256", "RS384", "RS512" ]
        };
        return jwt.sign(payload, privateKEY, signOptions);
    },

    verify: (token, $Option) => {
        /*
            vOption = {
                issuer: "Authorization/Resource/This server",
                subject: "iam@user.me", 
                audience: "Client_Identity" // this should be provided by client
            }       
        */
        var decoded = jwt.decode(token, {complete: true});
        if(decoded === null){
            return false;
        }
        var verifyOptions = {
            issuer:     $Option.issuer || "SomeOrg.inc",
            subject:    $Option.subject || decoded.payload.sub,
            audience:   $Option.audience || 'false',
            expiresIn:  "30d",
            algorithm:  ["RS256"]
        };
        try{
            return jwt.verify(token, publicKEY, verifyOptions); 
        }catch(err){
            return false;
        }
    }, 

    decode: (token) => {
        return jwt.decode(token, {complete: true});
    }
}

Ну, это сервис, который вы можете использовать, но чтобы он работал, вам также необходимо внести некоторые изменения в код вашего Login API.

Ваша середина должна быть примерно такой

var JWT = require('fileLocation/JWT.js');

app.use(function(req, res, next){
 // considering 'client_id' and 'Token' is passed in header
 if(!req.get('client_id')){
    res.status(400);
    return res.json({msg:"Error! Client identification missing."});
 }
 if(!req.get('Token')){
    res.status(403);
    return res.json({msg: "Error! User authentication failed."})
 }
 if(!JWT.verify(req.get('Token'),{audience: req.get('client_id')})){
    res.status(403);
    return res.json({msg: "Error! User authentication failed."})
 }
 next()
})

Спасибо

...