OAuth1的常量401错误(MCM API)

时间:2016-05-07 19:58:58

标签: java android oauth oauth-1.0a

我一直在尝试与API建立连接超过一周,但无济于事。 (Magic Card Market的,身份验证文档herethere)。我应该收到一个XML文件。

我有MCM所谓的“小部件”访问他们的API,这意味着我没有也不需要oauth_token(它应该是一个空字符串)用于授权标头,而且我不应该接收或使用访问令牌/访问密钥。

我唯一拥有的是消费者密钥(他们有时称之为app令牌)和消费者秘密。

以下是我构建授权标头的方法:

private static String buildOAuthAuthorization(String method, String request)
        throws UnsupportedEncodingException, NoSuchAlgorithmException, InvalidKeyException {

    String mkmAppToken = APICredentials.appToken;
    String mkmAppSecret = APICredentials.appSecret;

    String realm = "https://www.mkmapi.eu/ws/v1.1/games";
    String oauthVersion = "1.0";
    String oauthConsumerKey = mkmAppToken;
    String oauthToken = "";
    String oauthSignatureMethod = "HMAC-SHA1";
    String oauthTimestamp = Long.toString(System.currentTimeMillis() / 1000);
    String oauthNonce = Long.toString(System.currentTimeMillis());

    String paramString = "oauth_consumer_key=" + oauthConsumerKey
            + "oauth_nonce=" + oauthNonce
            + "oauth_signature_method=" + oauthSignatureMethod
            + "oauth_timestamp=" + oauthTimestamp
            + "oauth_token=" + oauthToken
            + "oauth_version=" + oauthVersion;

    String baseString = method + "&" + rawUrlEncode(realm) + "&" + rawUrlEncode(paramString);

    String signingKey = rawUrlEncode(mkmAppSecret) + "&";

    Mac mac = Mac.getInstance("HMAC-SHA1");
    SecretKeySpec secret = new SecretKeySpec(signingKey.getBytes(), mac.getAlgorithm());
    mac.init(secret);
    byte[] digest = mac.doFinal(baseString.getBytes());
    byte[] oauthSignature = Base64.encode(digest, Base64.URL_SAFE);

    String authorizationProperty = "OAuth "
            + "realm=\"" + realm + "\", "
            + "oauth_version=\"" + oauthVersion + "\", "
            + "oauth_timestamp=\"" + oauthTimestamp + "\", "
            + "oauth_nonce=\"" + oauthNonce + "\", "
            + "oauth_consumer_key=\"" + oauthConsumerKey + "\", "
            + "oauth_token=\""+ oauthToken + "\", "
            + "oauth_signature_method=\"" + oauthSignatureMethod + "\", "
            + "oauth_signature=\"" + oauthSignature + "\"";

    System.out.println(authorizationProperty);

    return authorizationProperty;
}

实际请求位于AsyncTask中:

public static class oAuthRequest extends AsyncTask<String, Integer, StringReader> {

    private int lastCode;

    @Override
    protected StringReader doInBackground(String... requestURLs) {

        String method = requestURLs[0];
        String url = requestURLs[1];
        StringReader result = null;

        try {

            String authProperty = buildOAuthAuthorization(method, url);
            HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection();
            connection.addRequestProperty("Authorization:", authProperty);

            lastCode = connection.getResponseCode();
            System.out.println("RESPONSE CODE 1 " + lastCode);

            // Get content
            BufferedReader rd = new BufferedReader(new InputStreamReader(lastCode == 200 ? connection.getInputStream() : connection.getErrorStream()));
            StringBuilder sb = new StringBuilder();
            String line;
            while ((line = rd.readLine()) != null) {
                sb.append(line);
            }
            rd.close();
            result = new StringReader(sb.toString());

        } catch (NoSuchAlgorithmException | InvalidKeyException | IOException e) {
            e.printStackTrace();
        }

        return result;
    }
}

似乎无论我改变什么,我总是得到401。

我尝试过的事情:

  • 使用Base64.encodeToString()
  • 将oauthSignature作为字符串
  • 使用SecureRandom生成Nonce
  • 有和没有空oauthToken
  • 另一种时间戳生成方法(不记得是什么)
  • 使用和不使用app令牌签名密钥(理论上我只需要消费者的秘密,但你永远不知道)
  • 使用HttpsURLConnection而不是HttpURLConnection(URI以https开头,所以我想,嘿。但是没有)
  • 至少2-3个其他不同的实现(当然,一个基本上是文档中Java示例的复制/粘贴 - 现在仍然是一个)
  • (可能还有很多我甚至都记得的事情)

此时我想知道问题是否可能来自我的密钥,因为我试图使用Postman应用程序来测试具有相同结果的请求。

0 个答案:

没有答案