Flickr API签名请求获得" oauth_problem = signature_invalid"

时间:2015-07-22 18:07:00

标签: android encoding utf-8

我正在尝试改进API连接,我想我会给Flickr一个去。我收到错误" oauth_problem = signature_invalid"我不完全确定错误是什么。我认为错误可能是什么; Flickr需要UTF-8编码,而我正在使用Base64,如果问题是,我不完全确定如何进行UTF-8编码。另一种可能性是我的" oauth_callback"我只是添加他们的例子,因为我没有网站。如果您可以查看一下,并就可能导致的问题给我一些反馈" signature_invalid"。

https://www.flickr.com/services/api/

  

Flickr API期望所有数据都是UTF-8编码。

结果

  

Flickr示例:将具有如下所示的基本字符串:

GET&https%3A%2F%2Fwww.flickr.com%2Fservices%2Foauth%2Frequest_token&oauth_callback%3Dhttp%253A%252F%252Fwww.example.com%26oauth_consumer_key%3D653e7a6ecc1d528c516cc8f92cf98611%26oauth_nonce%3D95613465%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1305586162%26oauth_version%3D1.0
  

我得到的是什么:

GET&https%3A%2F%2Fwww.flickr.com%2Fservices%2Foauth%2Frequest_token&oauth_callback%3Dhttp%253A%252F%252Fwww.example.com%26oauth_consumer_key%3D3eec949a9a557a25fdea939f765f49d4%26oauth_nonce%3D112111102120104%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1437587991%26oauth_version%3D1.0
  

浏览器中显示的是什么:

oauth_problem=signature_invalid&debug_sbs=GET&https%3A%2F%2Fwww.flickr.com%2Fservices%2Foauth%2Frequest_token&oauth_callback%3Dhttp%253A%252F%252Fwww.example.com%26oauth_consumer_key%3D3eec949a9a557a25fdea939f765f49d4%26oauth_nonce%3D98115%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1437587180%26oauth_version%3D1.0

实施

public class SigningRequests {

    public static void getSigningRequests() {
        List<String> params = new ArrayList<>(Arrays.asList(generateOauthParams()));
        String[] template = new String[0];
        params.add("oauth_signature=" + sign(Constants.METHOD_GET, Constants.METHOD_REQUEST_TOKEN, params.toArray(template)));
        try {
            URL url = new URL(Constants.METHOD_REQUEST_TOKEN + "?" + paramify(params.toArray(template)));
            URLConnection api = url.openConnection();
            String line;
            StringBuilder builder = new StringBuilder();
            BufferedReader reader = new BufferedReader(new InputStreamReader(api.getInputStream()));
            while ((line = reader.readLine()) != null) builder.append(line);
            Log.e("Respinse", line.toString());
        } catch (Exception e) {
            Log.e("ERROR", e.toString());
            e.printStackTrace();
        }
    }

    private static String[] generateOauthParams() {
        return new String[]{
                "oauth_nonce=" + nonce(),
                "oauth_timestamp=" + time_stamp,
                "oauth_consumer_key=" + Constants.METHOD_KEY,
                "oauth_signature_method=HMAC-SHA1",
                "oauth_version=1.0",
                "oauth_callback=http%3A%2F%2Fwww.example.com"};
    }


    private static String sign(String method, String uri, String[] params) {
        String[] p = {method, Uri.encode(uri), Uri.encode(paramify(params))};
        String s = join(p, "&");
        SecretKey sk = new SecretKeySpec(Constants.METHOD_SECRET.getBytes(), "HmacSHA1");
        try {
            Mac m = Mac.getInstance("HmacSHA1");
            m.init(sk);
            return Uri.encode(new String(Base64.encode(m.doFinal(s.getBytes()), Base64.DEFAULT)).trim());
        } catch (java.security.NoSuchAlgorithmException e) {
            Log.w("FAIL_ALG", e.getMessage());
            return null;
        } catch (java.security.InvalidKeyException e) {
            Log.w("FAIL_INVALID_KEY", e.getMessage());
            return null;
        }
    }

    private static int time_stamp = (int) (new Date().getTime() / 1000);

    private static String nonce() {
        Random r = new Random();
        StringBuilder n = new StringBuilder();
        for (int i = 0; i < r.nextInt(8) + 2; i++)
            n.append(r.nextInt(26) + 'a');
        return n.toString();
    }

    private static String paramify(String[] params) {
        String[] p = Arrays.copyOf(params, params.length);
        Arrays.sort(p);
        return join(p, "&");
    }

    private static String join(String[] array, String separator) {
        StringBuilder b = new StringBuilder();
        for (int i = 0; i < array.length; i++) {
            if (i > 0)
                b.append(separator);
            b.append(array[i]);
        }
        return b.toString();
    }
}

0 个答案:

没有答案