Вход в Google+ – страница доступна только для зарегистрированных пользователей

Я решил использовать преимущества социальных сетей на своей странице и в настоящее время реализую вход через Google+.

Одна из страниц моего веб-сайта должна быть доступна только для зарегистрированных пользователей (добавление материала на страницу). Я регистрирую пользователя на веб-сайте через JavaScript.

Я знаю, что javascript выполняется на стороне клиента, но мне любопытно, можно ли ограничить доступ к определенной странице, используя только javascript.


person Jakub Mendyk    schedule 20.08.2014    source источник


Ответы (2)


Вы не можете осуществлять надежный контроль доступа, используя только javascript на стороне клиента.

Это связано с тем, что, поскольку javascript выполняется в браузере пользователя, пользователь сможет обойти любое установленное вами правило контроля доступа.

Вы должны выполнять контроль доступа на стороне сервера, в вашем случае в коде Python.

Как правило, люди также выполняют некоторую проверку контроля доступа на стороне клиента, но не для предотвращения доступа, а, например, для скрытия/отключения кнопок, которые пользователь не может использовать.

person David    schedule 21.08.2014

Вот один из способов сделать это с комментариями:

var authenticate = function(req, success, failure) {

    // Use the Google strategy with passport.js, but with a custom callback.
    // passport.authenticate returns Connect middleware that we will use below.
    //
    // For reference: http://passportjs.org/guide/authenticate/
    return passport.authenticate('google', 
        // This is the 'custom callback' part
        function (err, user, info) {

            if (err) { 
                failure(err);
            }
            else if (!user) { 
                failure("Invalid login data");
            }
            else {
                // Here, you can do what you want to control 
                // access. For example, you asked to deny users 
                // with a specific email address:
                if (user.emails[0].value === "[email protected]") {
                    failure("User not allowed");
                }
                else {
                    // req.login is added by the passport.initialize() 
                    // middleware to manage login state. We need 
                    // to call it directly, as we're overriding
                    // the default passport behavior.
                    req.login(user, function(err) {
                        if (err) { 
                            failure(err);
                        }
                        success();
                    });
                }
            }
        }
    );
};

One idea is to wrap the above code in some more middleware, to make it easier to read:

// This defines what we send back to clients that want to authenticate
// with the system.
var authMiddleware = function(req, res, next) {

    var success = function() {
        res.send(200, "Login successul");
    };

    var failure = function(error) {
        console.log(error);
        res.send(401, "Unauthorized"); 
    };

    var middleware = authenticate(req, success, failure);
    middleware(req, res, next);
};


// GET /auth/google/return
//   Use custom middleware to handle the return from Google.
//   The first /auth/google call can remain the same.
app.get('/auth/google/return', authMiddleware);

Кредиты: https://stackoverflow.com/a/13734798/1670308

person TechLover    schedule 20.08.2014
comment
Было бы неплохо добавить кредиты к исходному ответу, откуда взят этот код. - person Natan Streppel; 20.08.2014
comment
Упс, пропустил. обновление ответа. - person TechLover; 20.08.2014
comment
Как я вижу, в ответе используется Node.js, который я не использую в своем проекте, и которого я хотел бы избежать (я никогда раньше не использовал Node.js). - person Jakub Mendyk; 21.08.2014