2012-07-12 35 views
8

我要去實現的OAuth 2.0REST APIOAuth 2.0。沒有會話? (無國籍)

授予每個用戶不同的權限,並具有良好的伸縮性。

要很好地擴展,無國籍更容易,因爲有一個與它

NO文件,數據庫,內存基於會話。


下面就是我所理解的OAuth 2

  1. 的OAuth服務器給出一個訪問令牌的用戶。
  2. 用戶的訪問令牌存儲在cookie中。
  3. 當用戶訪問REST API時,用戶使用訪問令牌進行發送。
  4. 服務器通過訪問令牌接收請求。
  5. 服務器確定訪問令牌是否有效,並且該用戶有權執行請求。
  6. 根據用戶的權限執行或拒絕。

所以我不擔心會話存儲。對?

+0

看看這個庫https://pypi.python.org/pypi/python-oauth2 – DarkAnthey 2018-01-19 15:15:06

回答

8

你在這裏描述的是OAuth 2 Implicit Grant flow。 OAuth 2還包含三個其他流程,但由於您的資源所有者(用戶)似乎正在使用瀏覽器端Javascript(您正在談論Cookie)發起請求,因此這是您應該使用的流程。

在客戶端,OAuth的只需要你存儲access_token訪問保護ressources(和refresh_token如果你要爲到期access_token)。

+2

要檢查訪問令牌,他將不得不有一個數據庫服務器端。;) – 2012-07-14 22:20:57

+0

當然,在服務器端,他必須知道每個訪問令牌是以哪個用戶的名義發佈的,以及哪些範圍被授予的。可選地,他還可以記住並檢查允許的'redirect_uri'以獲得更好的安全性。如果這就是他所說的「會話存儲」的意思,我誤解了這個問題;) – 2012-07-15 00:45:03

+1

忘記關於'redirect_uri'的部分,這是錯誤的。我應該去睡覺;) – 2012-07-15 00:54:04

4

最近的創新是JWT - JSON Web令牌。

這裏是該規範的鏈接: JWT - JSON Web Token

JWT是使用利用一個散列方法,如HMAC,其代表基於哈希的消息驗證代碼散列令牌的方法。由於令牌是使用密鑰散列的,因此服務器可以確定令牌是否被篡改。

下面是一個例子的方法來創建用於JWT散列令牌:

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

下面是一個:

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

這裏是進行解碼的標記,以確保它的一個例子是沒有被篡改文章更完整的例子:Stateless Authentication