2012-07-12 12 views
8

私は、ユーザーごとに異なる権限を付与するともうまくスケールすることOAuth 2.0。セッションはありませんか? (ステートレス)

OAuth 2.0のRESTのAPIを実装するつもりです。

NOファイル、データベース、インメモリベースのセッションがそれでありますので

うまくスケールするには、ステートレスは簡単です。以下は


私はOAuthの2

  1. のOAuthサーバーを理解する方法であるユーザーにアクセストークンを与えます。
  2. ユーザーのアクセストークンはCookieに格納されています。
  3. ユーザーがREST APIにアクセスすると、ユーザーはアクセストークンを送信します。
  4. サーバーはアクセストークンを要求します。
  5. サーバーは、アクセストークンが有効で、ユーザーが要求を行う権限を持っているかどうかを調べます。
  6. ユーザーの権限に基づいて実行または拒否します。

だから私は、セッションストレージを心配する必要はありません。右?

+0

このライブラリを見てくださいhttps://pypi.python.org/pypi/python-oauth2 – DarkAnthey

答えて

8

ここで説明しているのは、OAuth 2 Implicit Grant flowです。 OAuth 2には3つの他のフローも含まれていますが、あなたのリソース所有者(ユーザー)がブラウザ側のJavascript(クッキーについて話していた)を使用してリクエストを開始しているようです。

クライアント側では、保護されたリソースにアクセスするためにはaccess_token(OAuthは有効期限が切れている場合はrefresh_token)を保存する必要があります。access_token

+2

アクセストークンをチェックするには、 dbサーバー側。;) –

+0

もちろん、サーバー側では、ユーザーが代わって発行された各アクセストークンとどのスコープが許可されているかを知る必要があります。オプションで、より良いセキュリティのために許可された 'redirect_uri'を覚えてチェックすることもできます。それが "セッションストレージ"の意味であれば、私は疑問を誤解しました;) –

+1

'redirect_uri'については忘れてしまいました。間違っています。私は寝るべきだ;) –

4

もっと最近の技術革新はJWT - JSONウェブトークンです。 JWT - JSON Web Token

JWTは、ハッシュベースのメッセージ認証コードを表すようなHMACなどのハッシュ方法を使用してハッシュトークンを使用する方法であって、ここで

は仕様へのリンクです。トークンは秘密鍵を使用してハッシュされるため、サーバーはトークンが改ざんされているかどうかを判断できます。ここ

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

は、それが改ざんされなかった保証するために、トークンを復号する例である:ここ

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

でありますより完全な例の記事:Stateless Authentication

関連する問題