2012-04-25 3 views
8

Я пытаюсь загрузить файл с PhoneGap на сервер, используя FileTransfer method. Для этой загрузки мне нужно, чтобы HTTP basic auth был включен.PhoneGap FileTransfer с базовой аутентификацией HTTP

Вот соответствующий код:

var options = new FileUploadOptions({ 
     fileKey: "file", 
     params: { 
      id: my_id, 
      headers: { 'Authorization': _make_authstr() } 
     } 
    }); 
    var ft = new FileTransfer(); 
    ft.upload(image, 'http://locahost:8000/api/upload', success, error, options); 

Looking over the PhoneGap source code кажется, что я могу указать заголовок авторизации, в том числе «заголовки» в списке «Титулы», как я сделал выше:

 JSONObject headers = params.getJSONObject("headers"); 
     for (Iterator iter = headers.keys(); iter.hasNext();) 
     { 
     String headerKey = iter.next().toString(); 
     conn.setRequestProperty(headerKey, headers.getString(headerKey)); 
     } 

Однако на самом деле это не добавляет заголовок.

Итак: есть ли способ сделать базовую аутентификацию HTTP с помощью FileTransfer PhoneGap для iPhone и Android?

+0

Для тех, кто интересно, этот метод перечисленных выше работает для меня. Просто добавьте это: 'params.headers = {Авторизация: 'Basic' + creds}; options.params = params; ' – gabaum10

+0

заголовкам нужно перейти к options.headers, не добавленным в options.params .____ – Adam

ответ

9

Вы можете добавить пользовательские заголовки, добавляя их к вариантов, а не Params так:

authHeaderValue = function(username, password) { 
    var tok = username + ':' + password; 
    var hash = btoa(tok); 
    return "Basic " + hash; 
}; 

options.headers = {'Authorization': authHeaderValue('Bob', '1234') }; 
+0

FYI. У меня проблемы с этим в iOS (по состоянию на 1/14/13). Прекрасно работает в Android и BB ... – gabaum10

+0

какая версия телефонного разговора вы используете? У меня был успех на iOS с 2.3.0 – Ryan

+0

2.2.0 ... это интересно, возможно, мне стоит попробовать обновить? У вас были проблемы с версией 2.2.0? – gabaum10

0

Правильное место для массива заголовков в качестве непосредственного ребенка вариантов. Настройки-> заголовки. Не параметры-> params-> заголовки. Вот пример:

//************************************************************** 
//Variables used below: 
//1 - image_name: contains the actual name of the image file. 
//2 - token: contains authorization token. In my case, JWT. 
//3 - UPLOAD_URL: URL to which the file will be uploaded. 
//4 - image_full_path - Full path for the picture to be uploaded. 
//*************************************************************** 
var options = { 
    fileKey: "file", 
    fileName: 'picture', 
    chunkedMode: false, 
    mimeType: "multipart/form-data", 
    params : {'fileName': image_name} 
}; 

var headers = {'Authorization':token}; 

//Here is the magic! 
options.headers = headers; 
//NOTE: I creaed a separate object for headers to better exemplify what 
// is going on here. Obviously you can simply add the header entry 
// directly to options object above. 

$cordovaFileTransfer.upload(UPLOAD_URL, image_full_path, options).then(
    function(result) { 
     //do whatever with the result here. 
}); 

Вот официальная документация: https://github.com/apache/cordova-plugin-file-transfer

0

Вы можете создать заголовок авторизации самостоятельно. Но вы можете также ввести учетные данные в URL, как это:

var username = "test", password = "pass";  
var uri = encodeURI("http://"+username + ':' + password +"@localhost:8000/api/upload"); 

См FileTransfer.js для реализации (строка 45):

function getBasicAuthHeader(urlString) { 
var header = null; 


// This is changed due to MS Windows doesn't support credentials in http uris 
// so we detect them by regexp and strip off from result url 
// Proof: http://social.msdn.microsoft.com/Forums/windowsapps/en-US/a327cf3c-f033-4a54-8b7f-03c56ba3203f/windows-foundation-uri-security-problem 

if (window.btoa) { 
    var credentials = getUrlCredentials(urlString); 
    if (credentials) { 
     var authHeader = "Authorization"; 
     var authHeaderValue = "Basic " + window.btoa(credentials); 

     header = { 
      name : authHeader, 
      value : authHeaderValue 
     }; 
    } 
} 

return header; 
} 
Смежные вопросы