2013-03-17 95 views
1

我希望有人能幫助我。 我有一個使用JSON Web服務實現的API。我想實現登錄。用戶已創建,我需要登錄用戶。那是當我輸入用戶名和密碼時,它必須登錄用戶。在Titanium中使用JSON實現登錄

我已閱讀tutsplus教程,但我無法驗證用戶身份。誰能幫我嗎。

這裏是我使用的代碼:

// create tab group 
var tabGroup = Titanium.UI.createTabGroup(); 

var win1 = Titanium.UI.createWindow({ 
title:'Login', 
backgroundColor:'#fff' 
}); 

var username = Ti.UI.createTextField({ 
top:'10%', 
borderRadius:3, 
hintText:'username', 
keyboardType:Titanium.UI.KEYBOARD_DEFAULT, 
width:'80%', 
height:'auto', 
left:'10%', 
right:'10%', 
touchEnabled: true, 
}); 
win1.add(username); 
var pass = Ti.UI.createTextField({ 
top:'30%', 
borderRadius:3, 
hintText:'password', 
keyboardType:Titanium.UI.KEYBOARD_DEFAULT, 
width:'80%', 
height:'auto', 
left:'10%', 
right:'10%', 
touchEnabled: true, 
passwordMask: true 
}); 

win1.add(pass); 
var loginBtn = Titanium.UI.createButton({ 
title:'Login', 
top:'50%', 
width:'60%', 
height:'15%', 
borderRadius:1, 
font:{fontFamily:'Arial',fontWeight:'bold',fontSize:14} 
}); 
win1.add(loginBtn); 

var url = 'http://qudova.com/api.php?function=AuthenticateUser&[email protected]&p=qudovatest'; 
var json; 
var loginReq = Titanium.Network.createHTTPClient(); 
loginBtn.addEventListener('click',function(e) 
{ 
if (username.value != '' && pass.value != '') 
{ 
    // Here I will get the Token (asdfasdf....) 
    loginReq.open("GET",url); 
    authstr = 'Basic ' +Titanium.Utils.base64encode(username.value +':' +pass.value); 
    loginReq.setRequestHeader('Authorization', authstr); 

    loginReq.send(); 
} 
else 
{ 
    alert("Username/Password are required"); 
} 
}); 
loginReq.onload = function() 
{ 
    var jsonObject = JSON.parse(this.responseText); 
    // Here I have made a check if the Token is returned successfully it will alert the user that he authenticated 
    if (jsonObject.Token == "asdfadsfasdfadsf") 
     { 
      alert("Authenticated"); 
     } 
    else 
     { 
      alert("response.message"); 
     } 
}; 
win1.open(); 

在此先感謝。我的概念是否清晰?

+0

在您的代碼中,您使用了3(!!!)種方式進行身份驗證。 1.純文本證書作爲URL中的GET參數。 2.從字段生成的基本身份驗證標題和3.從字段生成的POST params(普通)。哪一個應該工作/在後端實現?當我複製你的網址並將其粘貼到瀏覽器中時,我會得到你期望的答案(asdfasdf ...)而無需特別登錄。請證明你的概念並澄清你真正想做的事! – 2013-03-17 21:50:58

+0

感謝您的回覆, – 2013-03-18 06:52:39

+0

我想基於'setRequestHeader'參數驗證用戶身份。通過這種方式進行身份驗證時,將返回令牌(asdfasdf ...),並且我可以對令牌進行檢查以驗證身份驗證並提醒用戶他已驗證身份。我編輯了我的代碼。 – 2013-03-18 07:00:31

回答

2

你得到一個JSON數組作爲響應。所以你應該訪問jsonObject[0].Token

// create tab group 
var tabGroup = Titanium.UI.createTabGroup(); 

var win1 = Titanium.UI.createWindow({ 
title:'Login', 
backgroundColor:'#fff' 
}); 

var username = Ti.UI.createTextField({ 
top:'10%', 
borderRadius:3, 
hintText:'username', 
keyboardType:Titanium.UI.KEYBOARD_DEFAULT, 
width:'80%', 
height:'auto', 
left:'10%', 
right:'10%', 
touchEnabled: true, 
}); 
win1.add(username); 
var pass = Ti.UI.createTextField({ 
top:'30%', 
borderRadius:3, 
hintText:'password', 
keyboardType:Titanium.UI.KEYBOARD_DEFAULT, 
width:'80%', 
height:'auto', 
left:'10%', 
right:'10%', 
touchEnabled: true, 
passwordMask: true 
}); 

win1.add(pass); 
var loginBtn = Titanium.UI.createButton({ 
title:'Login', 
top:'50%', 
width:'60%', 
height:'15%', 
borderRadius:1, 
font:{fontFamily:'Arial',fontWeight:'bold',fontSize:14} 
}); 
win1.add(loginBtn); 

var url = 'http://qudova.com/api.php?function=AuthenticateUser&[email protected]&p=qudovatest'; 
var json; 
var loginReq = Titanium.Network.createHTTPClient(); 
loginBtn.addEventListener('click',function(e) 
{ 
if (username.value != '' && pass.value != '') 
{ 
    // Here I will get the Token (asdfasdf....) 
    loginReq.open("GET",url); 
    authstr = 'Basic ' +Titanium.Utils.base64encode(username.value +':' +pass.value); 
    loginReq.setRequestHeader('Authorization', authstr); 

    loginReq.send(); 
} 
else 
{ 
    alert("Username/Password are required"); 
} 
}); 
loginReq.onload = function() 
{ 
    var jsonObject = JSON.parse(this.responseText); 
    // Here I have made a check if the Token is returned successfully it will alert the user that he authenticated 
    if (jsonObject[0].Token === "asdfadsfasdfadsf") 
     { 
      alert("Authenticated"); 
     } 
    else 
     { 
      alert("response.message"); 
     } 
}; 
win1.open(); 

或者,你可以改變你的後端實現,結果將是一個對象而不是數組。

不過,你應該改變你的後端,因爲目前可以通過簡單的GET參數進行身份驗證。

+0

我在你的答案之前就已經明白了,順便說一下,我仍然會接受它,因爲這是正確的答案。謝謝 – 2013-03-19 05:07:41