Настраиваемая проверка подлинности Azure Mobile Services с помощью API

Я создаю пользовательскую аутентификацию через API в мобильной службе Azure и выбираю на основе этого ответа:

Регистрация и вход пользователей в Azure Mobile Services

Затем присоединился к коду предыдущей ссылки для создания токена аутентификации.

Но я получаю «внутреннюю ошибку сервера», когда я вызываю API. Здесь происходит ошибка: "...results.length..."

    var crypto = require('crypto');
    var iterations = 1000;
    var bytes = 32;
    var aud = "Custom";
    var masterKey = "wkeHEoWUaPJSHsSOcWgmVLOZbIpeeg92";
    var _request;
    var _response;

    exports.post = function(request, response) {
        var user = request.body.userName;
        var pass = request.body.password;
        _request = request;
        _response = response
        validateUserNamePassword(user, pass, function(error, userId, token) {
            if (error) {
                response.send(401, { error: "Unauthorized" });
            } else {
                response.send(200, { user: userId, token: token });
            }
        });
    }

    function validateUserNamePassword(user, pass, funcao){

        var accounts = _request.service.tables.getTable('account');

        accounts
            .where({ userid : user })
            .read({
                success: function(results) 
                {
                    if (results.length === 0) 
                    {
                        _response.send(401, { error: "Unauthorized1" });
                        console.log("Incorrect username or password");
                        _request.respond(401, "Incorrect username or password");
                    }
                    else 

                        _response.send(401, { error: "Unauthorized2" });
                        var account = results[0];
                        hash(item.password, account.salt, function(err, h) {
                            var incoming = h;
                            if (slowEquals(incoming, account.password)) {
                                var expiry = new Date().setUTCDate(new Date().getUTCDate() + 30);
                                var userId = aud + ":" + account.id;
                                _request.respond(200, {
                                    userId: userId,
                                    token: zumoJwt(expiry, aud, userId, masterKey) 
                                });
                            }
                            else {
                                _request.respond(401, "Incorrect username or password");
                            }
                        });
                    }
                }
            });
    }



    function hash(text, salt, callback) {
        crypto.pbkdf2(text, salt, iterations, bytes, function(err, derivedKey){
            if (err) { callback(err); }
            else {
                var h = new Buffer(derivedKey).toString('base64');
                callback(null, h);
            }
        });
    }

    function slowEquals(a, b) {
        var diff = a.length ^ b.length;
        for (var i = 0; i < a.length && i < b.length; i++) {
            diff |= (a[i] ^ b[i]);
        }
        return diff === 0;
    }

    function zumoJwt(expiryDate, aud, userId, masterKey) {

        var crypto = require('crypto');

        function base64(input) {
            return new Buffer(input, 'utf8').toString('base64');
        }

        function urlFriendly(b64) {
            return b64.replace(/\+/g, '-').replace(/\//g, '_').replace(new RegExp("=", "g"), '');
        }

        function signature(input) {
            var key = crypto.createHash('sha256').update(masterKey + "JWTSig").digest('binary');
            var str = crypto.createHmac('sha256', key).update(input).digest('base64');
            return urlFriendly(str);
        }

        var s1 = '{"alg":"HS256","typ":"JWT","kid":0}';
        var j2 = {
            "exp":expiryDate.valueOf() / 1000,
            "iss":"urn:microsoft:windows-azure:zumo",
            "ver":1,
            "aud":aud,
            "uid":userId 
        };
        var s2 = JSON.stringify(j2);
        var b1 = urlFriendly(base64(s1));
        var b2 = urlFriendly(base64(s2));
        var b3 = signature(b1 + "." + b2);
        return [b1,b2,b3].join(".");
    }

Я вызываю так:

        try 
        { 
            var loginInput = new JObject();
            loginInput.Add("userName", "breno");
            loginInput.Add("password", "test");
            var loginResult = await LoginAuthenticationService.InvokeApiAsync("login", loginInput);
            LoginAuthenticationService.CurrentUser = new MobileServiceUser((string)loginResult["user"]);
            LoginAuthenticationService.CurrentUser.MobileServiceAuthenticationToken = (string)loginResult["token"];
        }
        catch (MobileServiceInvalidOperationException e)
        {
            var exception = e;
        }

person Breno Santos    schedule 13.02.2014    source источник
comment
Что вы видите в журналах, если вы запустите console.log(results); позвонить, прежде чем проверить длину? Вы уверены, что request.body.userName содержит имя пользователя?   -  person Chris    schedule 14.02.2014
comment
@Chris Я обновляю пост, рассказывая, как я вызываю, я делаю что-то не так? Спасибо за помощь!!   -  person Breno Santos    schedule 14.02.2014
comment
Похоже, что запрос поступает к вашему пользовательскому API, потому что вы получаете 500. Что вы увидите, если сделаете console.log(request.body) в начале метода post?   -  person Chris    schedule 14.02.2014
comment
@Chris Я помещаю console.log(request.body), как вы сказали, и получаю это в журнале: Не удалось загрузить файл сценария «login.js»: SyntaxError: Неожиданный токен}   -  person Breno Santos    schedule 14.02.2014
comment
вам не хватает { после else в validateUserNamePassword / accounts.read / success   -  person Julien Ch.    schedule 20.02.2014


Ответы (1)


Если вы получаете сообщение об ошибке «Не удалось загрузить файл сценария 'login.js': SyntaxError: Unexpected token }», как показано в комментариях, в вашем сценарии есть проблема с синтаксисом. Вам нужно будет просмотреть свои сценарии и выяснить, в чем проблема.

person Chris    schedule 17.02.2014