Безопасно ли хранить пользовательские данные в localStorage через Angular? - PullRequest
1 голос
/ 17 марта 2020

Я новичок в мире Angular и пытаюсь создать свое первое приложение Angular, в настоящий момент я не понимаю, безопасно ли хранить пользовательские данные в localStorage, если нет, что следует делать? я делаю, чтобы спасти это? Я использую Cook ie сеансов.

Вот как работает мой бэкэнд-код (здесь только часть Аутентификация и авторизация):

const express = require('express');
const session = require('cookie-session');
const crypt = require('bcryptjs');
const config = require('../config');
const router = express.Router();
const users = require('../models/users');
const app = express();

app.use(session({
    name: 'session',
    keys: config.keys,
    secret: config.sessionkey,
    cookie: {
        secure: false,
        httpOnly: true,
        path: 'cookie',
        expires: new Date(Date.now() + 60 * 60 * 1000 * 24 * 365)
    }
}));

router.get('/', (req,res)=>{
    if(isAuthenticated(req)){
        res.send(req.session.user);
    } else {
        res.send({"message":"Authenticate first."});
    }
});

router.post("/login", (req, res) => {
    const email = req.body.email;
    const userpass = req.body.userpass;
    users.findUserByEmail(email,function(user){
        if(crypt.compareSync(userpass,user[0].userpass)){
            req.session.user = user;
            res.send(user);
        }
    });
});

router.post("/logout", (req,res)=> {
    req.session = null;
    res.redirect("/");
});

router.post("/register", (req, res) => {
    var user = { "username": req.body.username, "userpass": crypt.hashSync(req.body.userpass, 10) , "email": req.body.email, "birthDate": req.body.birthDate };
    users.createUser(user,(err)=>{
        if(!err){
            res.send({ "message":"Login" });
        } else {
            res.send({ "message":"Something went wrong during registration please retry." });
        }
    });

});

router.post("/unregister", isAuthenticated, (req, res) => {
    var email = req.body.email;
    if(isAuthenticated(req)){
        users.findUserByEmail(email,function(user){
            if(req.session.user == user){
                if(crypt.compareSync(req.body.userpass,user[0].userpass)){
                    req.session = null;
                    users.deleteUserByEmail(email,function(err){
                        if(err){
                            res.send({ "message":"Something went wrong while deleting the user please retry." });
                        } else {
                            res.send({ "message":"User deleted successfully" });
                        }
                    });
                }
            }
        });
    } else {
        res.send({ "message":"Authenticat first." });
    }
});

function isAuthenticated(req){
    return req.session.user != null;
}

module.exports.app = app;
module.exports.Router = router;
module.exports.isAuthenticated = isAuthenticated;

Как вы можете видеть, когда пользователь входит в систему правильно, я просто отправляю ему пользовательские данные, хранящиеся в БД, как есть (очевидно, без пользовательского пароля), так что я должен сделать, чтобы сделать безопасный сеанс на стороне angular?

Ответы [ 2 ]

3 голосов
/ 17 марта 2020

Вы должны использовать JWT для обмена данными аутентификации между сервером и клиентом, если вы новичок в идее JWT, вы можете прочитать об этом немного в intro , используя JWT у вас будет возможность прочитать его в клиенте (Angular) и сохранить его в localStorage, и вам не придется беспокоиться о его безопасности, потому что в конце концов это ha sh, и даже если кто-то сможет прочитать его содержимое, он / она не сможет изменить его, потому что он может быть сгенерирован только идентификатором вашего ключа безопасности / подписи на вашем сервере.

Конечно, вам придется отправлять токен jwt с каждым запросом на ваш сервер. и в Angular очень просто использовать interceptors для достижения такого подхода.

Вот полный пример , демонстрирующий использование JWT с Angular и NodeJS.

0 голосов
/ 18 марта 2020

Да, вы можете хранить токены jwt в localalstorage, и не рекомендуется хранить в них какие-либо другие данные, и, пожалуйста, не храните какие-либо идентифицирующие данные пользователя в localalstorage. Как указано в спецификациях, jwt может быть инструментом для аутентификации (для определения того, кто является отправителем), а не для авторизации (предоставления доступа), так как токен может быть имитирован человеком в середине.

...