17

OAuth2.0RESTAPIを実装します

ユーザーごとに異なる権限を付与し、適切に拡張するため。

うまくスケーリングするには、ステートレスがあります。

ファイル、データベース、メモリ内のセッションはありません。


以下は、私がOAuth2を理解する方法です。

  1. OAuthサーバーはユーザーにアクセストークンを提供します。
  2. ユーザーのアクセストークンはCookieに保存されます。
  3. ユーザーがRESTAPIにアクセスするとき、ユーザーはアクセストークンを使用して送信します。
  4. サーバーはアクセストークンを使用してリクエストを受信します。
  5. サーバーは、アクセストークンが有効であり、ユーザーが要求を実行する権限を持っているかどうかを確認します。
  6. ユーザーの特権に基づいて実行または拒否します。

したがって、セッションストレージについて心配する必要はありません。右?

4

2 に答える 2

11

ここで説明しているのは、OAuth 2 Implicit Grant フローです。OAuth 2 には他にも 3 つのフローが含まれていますが、リソースの所有者 (ユーザー) がブラウザー側の Javascript を使用して要求を開始しているように見えるため (Cookie について話していました)、これはあなたが進むべきフローです。

クライアント側では、OAuth は、access_token保護されたリソースにアクセスするための を保存することのみを要求します (refresh_token期限切れの を使用する場合はaccess_token)。

于 2012-07-12T20:07:32.457 に答える
4

最近のイノベーションは JWT (JSON Web Token) です。

仕様へのリンクは次のとおりです: JWT - JSON Web トークン

JWT は、Hash-based Message Authentication Code を表す 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;
}

より完全な例を含む記事を次に示します: ステートレス認証

于 2015-04-01T20:31:22.797 に答える