2012-07-12 41 views
8

tôi sẽ thực hiện OAuth 2.0REST API với nóOAuth 2.0. Không có phiên nào? (Stateless)

để cấp quyền truy cập khác nhau cho mỗi người dùng và cũng để mở rộng quy mô tốt.

Để mở rộng quy mô tốt, stateless là dễ dàng hơn vì có

NO tập tin, cơ sở dữ liệu, trong bộ nhớ dựa phiên với nó.


Dưới đây là cách tôi hiểu OAuth 2.

  1. OAuth máy chủ cung cấp cho một thẻ truy cập cho người dùng.
  2. Mã thông báo truy cập của người dùng được lưu trữ trong cookie.
  3. Khi người dùng truy cập vào REST API, người dùng gửi kèm theo mã thông báo truy cập.
  4. Máy chủ nhận được yêu cầu có mã thông báo truy cập.
  5. Máy chủ tìm hiểu xem mã thông báo truy cập có hợp lệ hay không và người dùng có quyền yêu cầu.
  6. Thực hiện hoặc từ chối dựa trên đặc quyền của người dùng.

Vì vậy, tôi không phải lo lắng về dung lượng phiên. Đúng?

+0

Hãy xem thư viện này https://pypi.python.org/pypi/python-oauth2 – DarkAnthey

Trả lời

8

Những gì bạn mô tả ở đây, là OAuth 2 Implicit Grant flow. OAuth 2 cũng bao gồm ba luồng khác, nhưng dường như chủ sở hữu nguồn cấp dữ liệu của bạn (người dùng) đang bắt đầu yêu cầu bằng cách sử dụng Javascript bên trình duyệt (bạn đang nói về cookie), đây là luồng bạn nên đi.

Ở phía máy khách, OAuth chỉ yêu cầu bạn lưu trữ access_token để truy cập vào các tài nguyên được bảo vệ (và refresh_token nếu bạn sắp hết hạn access_token).

+2

Để kiểm tra mã thông báo truy cập, anh ấy sẽ phải có phía máy chủ db.;) –

+0

Chắc chắn, về phía máy chủ, anh ta phải biết cho mỗi mã thông báo truy cập mà thay mặt người dùng đã được cấp và phạm vi nào được cấp. Tùy chọn, anh ta cũng có thể nhớ và kiểm tra 'redirect_uri' được cho phép để bảo mật tốt hơn. Nếu đó là những gì ông có nghĩa là với "phiên lưu trữ", tôi hiểu lầm câu hỏi;) –

+1

Quên một phần về 'redirect_uri', đó là sai. Tôi nên đi ngủ ;) –

4

Một cải tiến gần đây hơn là JWT - Mã thông báo web JSON.

Dưới đây là một liên kết đến spec: JWT - JSON Web Token

JWT là một phương pháp của việc sử dụng thẻ băm sử dụng một phương pháp băm như HMAC viết tắt của một tin nhắn Hash-based Authentication Code. Vì mã thông báo được băm bằng khóa bí mật, máy chủ có thể xác định xem mã thông báo có bị giả mạo hay không.

Dưới đây là một phương pháp dụ để tạo ra một thẻ băm cho 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(); 
    } 

Dưới đây là một ví dụ về giải mã một mã thông báo để đảm bảo nó không được can thiệp vào:

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; 
} 

Dưới đây là một bài viết có ví dụ hoàn chỉnh hơn: Stateless Authentication

Các vấn đề liên quan