2014-02-13 141 views
0

我创建通过在Azure移动服务API自定义验证,捡起基于这样的回答:自定义身份验证Azure的移动服务采用API

Registering and login users in 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; 
     } 
+0

如果您在“console.log(results);”中放入日志,您会在日志中看到什么?在检查长度之前打电话吗?你确定request.body.userName包含用户名吗? – Chris

+0

@Chris我更新帖子与我如何调用,我做错了什么?感谢您的帮助! –

+0

听起来好像这个请求是将它传递给你的自定义API,因为你得到了500.如果你在post方法的开头做了一个console.log(request.body),你看到了什么? – Chris

回答

0

如果您收到此错误“无法加载脚本文件'login.js':SyntaxError:Unexpected token}“,如注释中所示,您的脚本存在语法问题。你需要仔细阅读你的脚本并找出问题出在哪里。

相关问题