1

私が取り組んでいるプロジェクトに OAuth 2.0 を実装しようとしています。認証サーバーで認証できますが、リソース サーバーに問題があります。MAC トークン ( spec ) を使用しています。仕様の 3.1 で、以下を含む Authorization リクエスト ヘッダーを送信する必要があることがわかります。意味がわかりません。誰かが私がここで何をすべきかを教えてもらえますか?

credentials = "MAC" [ RWS 1#param ]
param = id /
nonce /
body-hash /
ext /
mac
id = "id" "=" <"> plain-string <">
nonce = "nonce" "=" <"> 1*DIGIT ":" plain-string <">
body-hash = "bodyhash" "=" <"> plain-string <">
ext = "ext" "=" <"> plain-string <">
mac = "mac" "=" <"> plain-string <">
plain-string = 1*( %x20-21 / %x23-5B / %x5D-7E )

アップデート

どこかに到達しているように感じますが、この問題の解決にはまだほど遠いように感じます.

だから私は次のようなものを構築しています

StringBuilder header = new StringBuilder("MAC ").append("id=\"").append(sharedPrefs.getString(Constants.ACCESS_TOKEN, "error")).append("\",nonce=\"").append(createNonce()).
                append("\",bodyhash=\"").append(bodyHash).append("\",mac=\"").append(mac).append("\"");

ボディハッシュを次のように計算します

public static String SHA256(String text) throws  UnsupportedEncodingException  { 
        MessageDigest md = null;
        try {
            md = MessageDigest.getInstance("SHA-256");
        } catch (NoSuchAlgorithmException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        byte[] shahash = new byte[40];
        md.update(text.getBytes("iso-8859-1"), 0, text.length());
        shahash = md.digest();
        return Base64.encodeToString(shahash, Base64.DEFAULT);
}

そして、このようなマック

private String hmacSHA256(String data) throws Exception {
    String key = sharedPrefs.getString(Constants.SECRET, "error");
    SecretKeySpec secretKey = new SecretKeySpec(key.getBytes("UTF-8"), "HmacSHA256");
    Mac mac = Mac.getInstance("HmacSHA256");
    mac.init(secretKey);
    byte[] hmacData = mac.doFinal(data.getBytes("UTF-8"));
    //Log.i(TAG, "BYTE ARRAY TO STRING: " + Base64.encodeToString(hmacData, Base64.DEFAULT));
    String value = Base64.encodeToString(hmacData, Base64.DEFAULT);
    return value;
}

サーバーが応答しないため、問題が発生しています。これは本当に私を夢中にさせています.このドキュメントが誰にとっても明確であるとは想像できません.

4

1 に答える 1

1

MAC アクセス認証スキームは oauth2 プロトコルの拡張であり、 HTTP 基本アクセスに似ていますがオプションであるため、すべてのリソース サーバーにこれを実装する必要はありません。

したがって、認証されていないリクエストを行い、リソース サーバーが次のような応答をした場合:

HTTP/1.1 401 Unauthorized 
WWW-Authenticate: MAC

は、この認証方式の使用MACが許可されていることを意味します。

現在 oauth2 ベースのリソース サーバーに実装されている最も一般的な認証方式は、bearerです。


この仕様を実装する方法についてまだ懸念がある場合は、それを実現するための優れた Android のソースがGithub にあります。おそらく必要な Java クラスはthisです。

楽しむ!

于 2012-04-12T13:42:44.717 に答える