2013-06-25 21 views
8

Budujemy system, który wymaga danych logowania dla wszystkich stron. aplikacja została zaprojektowana tak, aby była restrykcyjną aplikacją przy użyciu codeigniter jako biblioteka Phil Sturgeon. Ta biblioteka używa klucza API tylko do autoryzowania wywołań interfejsu API poprzez wysyłanie go przy każdym żądaniu za pośrednictwem połączenia HTTPS.REST API Metoda logowania

Nawet jeśli używa uwierzytelniania dwukierunkowego lub tylko klucza API. Co szukam jakiś czas jest następujący scenariusz:

  • żądanie użytkownika aplikacja po raz pierwszy (ex: https://www.xyz.com), a następnie zostanie on przekierowany na stronę logowania do sprawdzenia poświadczenia
  • użytkownika Wprowadź usernam/hasło i wysłał go poprzez POST nad https
  • czek Server, jeżeli informacja jest ważna wtedy:

    • API KEY powinien być udostępniony przez serwer do klienta zidentyfikowanego jako zasób przez tę nazwę użytkownika (Tutaj jest pytanie ??? !!!)

    • Jak wysłać klucz API do klienta w bezpieczny sposób?

      • 1) mogę użyć sesji ciasteczka i przywrócić klucz API w pliku cookie, a następnie za pomocą tego API klucz na każdym nadchodzącym życzenie (to gwałtowne bezstanowy reszty i nie mam pewności, czy wystarczająco bezpiecznie).
      • 2) Właściwie nie wiem, inne opcje :) twoja kolej, jeśli można pomóc

Jeśli mógłbyś podać przykład byłoby bardzo pomocne jak ja znaleziono i przeczytać wiele artykułów

:)

+0

także jeśli użyłem podejścia polegającego na użyciu klucza Api tylko do uwierzytelnienia użytkowników jest wystarczająco bezpieczne, martwię się bezpieczeństwem, ponieważ dane w aplikacji są wrażliwe – ahmedsaber111

Odpowiedz

8

Ponieważ połączenie HTTPS, cokolwiek wyślesz nad drutu jest bezpieczna (teoretycznie oraz pod warunkiem nie są mitm 'd). Nie jestem pewien, czy cały API jest obsługiwany przez HTTPS (nie określono), nawet mimo tego, że możesz zwrócić klucz jako część logowania (gdy wciąż jest pod maską HTTPS), jeśli reszta api nie jest HTTPS, klucz może zostać wciągnięty przy następnym żądaniu.

Sesje i pliki cookie nie są zazwyczaj częścią aplikacji RESTful; REST jest bezpaństwowcem.

Coś w rodzaju klucza obrotowego byłoby lepsze dla nie-HTTPS (działałoby też z HTTPS). Logujesz się przez HTTPS, serwer zwraca klucz API, używasz go przy następnym żądaniu, serwer zwraca nowy klucz API, używasz go na następne żądanie i tak dalej. Chociaż jest lepszy niż pojedynczy klucz API nad non-HTTPS, nie jest doskonały. Jeśli ktoś wyczuje odpowiedź z jednego z kolejnych wniosków i nie zużyje tego klucza, może go użyć. Zmniejsza to wektor ataku do odpowiedzi innej niż HTTPS z serwera do klienta, ponieważ jeśli nastąpi żądanie od klienta do serwera, klucz api zostanie już zużyty przez uzasadnione żądanie. Jednak należy zrobić więcej, aby zabezpieczyć api, jeśli nie obsługujesz go przez HTTPS.

Gdyby to był ja, sprawdziłbym prośbę o podpisanie + https.Jest jakaś rozmowa żądanie podpisania tutaj: https://stackoverflow.com/a/8567909/183254

Istnieje również kilka informacji na strawienia uwierzytelniania w Zabezpieczanie API odcinek http://net.tutsplus.com/tutorials/php/working-with-restful-services-in-codeigniter-2/

Przykładem pseudo kod js funkcji na kliencie

function get_calendar(){ 
    var key = $('#api_key').value(); 
    $.ajax({ 
     type: 'get', 
     url: '/index.php/api/calendar?key=' + key, 
     success: function(response){ 
      // show calendar 
      // ... 
      // set received api key in hidden field with id api_key 
      $('#api_key').value(response.api_key) 
     } 
    }) 
} 

Przykładowy sposób sterowania:

function calendar_get($api_key = ''){ 
    if($api_key_matches){//verify incoming api key 
     $r = array(); 
     $r['calendar'] = $this->some_model->get_calendar(); 
     $r['api_key'] = $this->_generate_api_key();// generate or get api key 
    } 
    $this->response($r); 
} 
+0

moim największym problemem jest jak mogę wysłać API-KEY do użytkownik po udanej próbie zalogowania się, aby móc użyć tego klucza API w następnym żądaniu. – ahmedsaber111

+0

Dodałem i przykład z metodą kalendarza. Zasadniczo po prostu utwórz tablicę i wyślij tam odpowiedź i klucz APi i zwróć ją za pomocą '$ this-> response()' – stormdrain