2016-04-26 2 views
3

Я создал тестовый отдых API на моем локальном сервере xampp. Я выполнил некоторую задачу, такую ​​как регистрация пользователя, пользователя входа и т. Д. Когда пользователь регистрируется, он создает api_key для зарегистрированного пользователя. Когда пользователь попытается выполнить задачу, чтобы добавить задачу в то время, когда я использовал функцию аутентификации, которая получает уникальный идентификатор пользователя на основе api_key.Как настроить заголовок авторизации для вызова rest api в android?

Вот моя функция аутентификации в PHP:

function authenticate(\Slim\Route $route){ 
     //Getting request header 
     $headers=apache_request_headers(); 
     $response=array(); 
     $app=\Slim\Slim::getInstance(); 


     //Verifying authorization Header 

     if(isset($headers['Authorization'])){ 
      $db=new DbHandler(); 

      //Get api key 
      $api_key=$headers['Authorization']; 

      //validating api key 

      if(!$db->isValidApiKey($api_key)){ 
       //Api key is not present in users table 
       $response["error"]=TRUE; 
       $response["message"]="Access_denied! Invalid api key"; 
       echoRespnse(401,$response); 
       $app->stop(); 
      } 
      else{ 
       global $student_id; 

       //getUser primary key id 

       $user=$db->getUserId($api_key); 
       if($user!=NULL){ 
        $student_id=$user['id']; 
       } 
      } 
     } 
     else{ 
      //api key is missing in header 
      $response["error"]=TRUE; 
      $response["message"]="Api key is missing"; 
      echoRespnse(400,$response); 
      $api->stop(); 
     } 
    } 

Вот моя функция IsValidApiKey() в php.Which проверки api_key является действительной или нет, который я вошел в заголовке, пока я прошу мой локальный сервер.

public function isValidApiKey($api_key) { 
     $stmt = $this->conn->prepare("SELECT id from student WHERE api_key = ?"); 
     $stmt->bind_param("s", $api_key); 
     $stmt->execute(); 
     $stmt->store_result(); 
     $num_rows = $stmt->num_rows; 
     $stmt->close(); 
     return $num_rows > 0; 
    } 

Вот задачи, которые добавляют задачу в моей БД-таблице:

$app->post('/tasks','authenticate',function() use ($app){ 
     //Check for required params 
     verifyRequiredParams(array('task')); 

     $response=array(); 
     $task=$app->request->post('task'); 
     global $user_id; 
     $db=new DbHandler(); 

     //Creating new task 

     $task_id=$db->createTask($user_id,$task); 

     if($task_id!=NULL){ 
      $response["error"]=FALSE; 
      $response["message"]="Task created successfully"; 
      $response["task_id"]=$task_id; 
     } 
     else{ 
      $response["error"]=TRUE; 
      $response["message"]="Failed to create a task. please, try again!!"; 

     } 
     echoRespnse(201,$response); 

    }); 

В вышеуказанных задач я использовал мой AUTHENTICATE function.It означает, что проверить это использование api_key уже зарегистрирован или нет, и если он затем добавляет задачу в мою таблицу задач, иначе она не сгенерирует ключ api.

Вот моя таблица базы данных:

CREATE TABLE IF NOT EXISTS `users` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `name` varchar(250) DEFAULT NULL, 
    `email` varchar(255) NOT NULL, 
    `password_hash` text NOT NULL, 
    `api_key` varchar(32) NOT NULL, 
    `status` int(1) NOT NULL DEFAULT '1', 
    `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `email` (`email`) 
); 

Когда я выполнить эту операцию с помощью клиента Advance API надстройки один он работает, потому что я прошел api_key в это заголовок.

Ii хочу добавить задачу с помощью моего приложения для Android, как добавить заголовок api_key в заголовок, чтобы я мог добавить задачу с помощью приложения для Android?

+0

вы используете какие-либо библиотеки для выполнения запросов в ваше приложение для Android? – droidev

+0

только org.apache. –

ответ

1

Вы можете использовать это:

HttpPost post = new HttpPost("your_api_url"); 
post.addHeader("Auth-Secret-Key" , "your_auth_secret_key"); 

Кроме того, вы можете обратиться this документации для получения дополнительной информации.

+0

http://10.0.2.2/task_manager/v1/tasks это мой url для добавления задачи. –

+0

Пожалуйста, помогите мне. –

+0

Какой метод запроса вы используете? GET, POST или любой другой? – Pehlaj

1

Использование HttpURLConnection следующим образом:

URL myURL = new URL("yoururl"); 
HttpURLConnection myURLConnection = (HttpURLConnection)myURL.openConnection(); 

myURLConnection.setRequestProperty ("Authorization", basicAuth); 
myURLConnection.setRequestMethod("POST");// change as your requested method 
myURLConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); 
myURLConnection.setRequestProperty("Content-Length", "" + postData.getBytes().length); 
myURLConnection.setRequestProperty("Content-Language", "en-US"); 
+0

В чем смысл basicAuth. –

+0

Я четко указываю, что api_key отличается для разных пользователей. Обратитесь к этому URL-адресу –

+0

http: //www.androidhive.info/2014/01/how-to-create-rest-api-for-android-app-use-php-slim-and-mysql-day-23/ –

0

Вы можете попробовать, как это ...

public static JSONObject post(Context mContext, String REQUEST_URL,Map<String, Object> params) { 
    JSONObject jsonObject = null; 
    BufferedReader reader = null; 
    try { 
     URL url = new URL(REQUEST_URL); 
     StringBuilder postData = new StringBuilder(); 

     for (Map.Entry<String, Object> param : params.entrySet()) { 
      if (postData.length() != 0) postData.append('&'); 
      postData.append(URLEncoder.encode(param.getKey(), "UTF-8")); 
      postData.append('='); 
      postData.append(URLEncoder.encode(String.valueOf(param.getValue()), "UTF-8")); 
     } 
     byte[] postDataBytes = postData.toString().getBytes("UTF-8"); 

     HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
     connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); 
     connection.setRequestProperty("auth1", GPLUS_EmailID); 
     connection.setRequestProperty("auth2", GPLUS_AccessToken); 
     connection.setRequestProperty("auth4", GCM_token); 
     connection.setConnectTimeout(8000); 
     connection.setRequestMethod("POST"); 
     connection.setConnectTimeout(8000); 
     connection.setUseCaches(false); 
     connection.setDoOutput(true); 
     connection.getOutputStream().write(postDataBytes); 
     connection.connect(); 
     StringBuilder sb; 
     int statusCode = connection.getResponseCode(); 
     if (statusCode == 200) { 
      sb = new StringBuilder(); 
      reader = new BufferedReader(new InputStreamReader(connection.getInputStream())); 
      String line; 
      while ((line = reader.readLine()) != null) { 
       sb.append(line); 
      } 
      jsonObject = new JSONObject(sb.toString()); 
     } 
     connection.disconnect(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } finally { 
     if (reader != null) { 
      try { 
       reader.close(); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
    return jsonObject; 
} 
0

Использование URLConnection

String credentials = username + ":" + password; 
String basicAuth = "Basic " + new String(new Base64().encode(credentials.getBytes())); 
myURLConnection.setRequestProperty ("Authorization", basicAuth); 
+0

Не понимаю мой вопрос. –

+0

Ссылка на этот URL: http://www.androidhive.info/2014/01/how-to-create-rest-api-for-android-app-using-php-slim-and-mysql-day-23/ –

+0

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

Смежные вопросы