2012-07-12 19 views
8

Zamierzam wdrożyć OAuth 2.0 i reszta API z nimOAuth 2.0. Bez sesji? (Bezpaństwowiec)

udzielenia pozwolenia na różnych użytkowników, a także dobrze skalować.

Aby przeskalować dobrze, bezpaństwowcem jest łatwiejsze, ponieważ nie ma

NO plik, sesja bazy danych, oparte na pamięci o nim.


Poniżej jest jak rozumiem OAuth 2.

  1. OAuth Server dać token dostępu do użytkownika.
  2. Token dostępu użytkownika jest przechowywany w pliku cookie.
  3. Gdy użytkownik uzyskuje dostęp do REST API, użytkownik wysyła z tokenem dostępu.
  4. Serwer odbiera żądanie z tokenem dostępu.
  5. Serwer sprawdza, czy token dostępu jest ważny, a użytkownik ma pozwolenie na wykonanie żądania.
  6. Wykonuj lub odrzuć na podstawie uprawnień użytkownika.

Więc nie trzeba się martwić o przechowywanie sesji. Dobrze?

+0

Spójrz na tę bibliotekę https://pypi.python.org/pypi/python-oauth2 – DarkAnthey

Odpowiedz

8

To, co tutaj opisujesz, to OAuth 2 Implicit Grant flow. OAuth 2 zawiera również trzy inne strumienie, ale wydaje się, że twój właściciel zasobu resSource (użytkownik) inicjuje żądania za pomocą JavaScript w przeglądarce (mówisz o plikach cookie), to jest przepływ, który powinieneś zrobić.

Po stronie klienta OAuth wymaga jedynie przechowywania access_token w celu uzyskania dostępu do chronionych zasobów (oraz refresh_token, jeśli planujesz wygasnąć access_token).

+2

Aby sprawdzić token dostępu, będzie musiał mieć po stronie serwera bazy danych.;) –

+0

Oczywiście po stronie serwera musi wiedzieć, dla każdego tokena dostępu, w którym imieniu użytkownika został wydany i jakie zakresy zostały przyznane. Opcjonalnie mógł także zapamiętać i sprawdzić dozwolony "redirect_uri" dla lepszego bezpieczeństwa. Jeśli tak właśnie miał na myśli "przechowywanie sesji", źle zrozumiałem pytanie;) –

+1

Zapomnij o części o 'redirect_uri', to jest złe. Powinienem iść do łóżka ;) –

4

Nowszą nowością jest JWT - JSON Web Token.

Tu jest link do specyfikacji: JWT - JSON Web Token

JWT jest metodą z użyciem tokenów zakodowane przy użyciu metody haszowania takich jak HMAC który stoi na Hash Message Authentication Code oparte. Ponieważ token jest mieszany za pomocą tajnego klucza, serwer może ustalić, czy token został zmodyfikowany.

Oto przykład sposobu do tworzenia zaszyfrowaną token JWT:

public String createTokenForUser(User user) { 
     byte[] userBytes = toJSON(user); 
     byte[] hash = createHmac(userBytes); 
     final StringBuilder sb = new StringBuilder(170); 
     sb.append(toBase64(userBytes)); 
     sb.append(SEPARATOR); 
     sb.append(toBase64(hash)); 
     return sb.toString(); 
    } 

Oto przykład dekodowania token do zapewnienia, aby nie został naruszony:

public User parseUserFromToken(String token) { 
    final String[] parts = token.split(SEPARATOR_SPLITTER); 
    if (parts.length == 2 && parts[0].length() > 0 && parts[1].length() > 0) { 
     try { 
      final byte[] userBytes = fromBase64(parts[0]); 
      final byte[] hash = fromBase64(parts[1]); 

      boolean validHash = Arrays.equals(createHmac(userBytes), hash); 
      if (validHash) { 
       final User user = fromJSON(userBytes); 
       if (new Date().getTime() < user.getExpires()) { 
        return user; 
       } 
      } 
     } catch (IllegalArgumentException e) { 
      //log tampering attempt here 
     } 
    } 
    return null; 
} 

Oto artykuł z bardziej kompletnym przykładem: Stateless Authentication

Powiązane problemy