繁体   English   中英

通过Volley POST请求获取Twitter身份验证令牌

[英]Getting Twitter auth token with Volley POST request

我正在尝试使用Volley POST请求为仅适用于Twitter应用程序的授权令牌生成适当的请求,但是我一直收到Http 400响应(错误请求)。

这是我尝试的:

网址

private static final String TWITTER_API_AUTH_URL = "https://api.twitter.com/oauth2/token";

编码消费者密钥和消费者秘密

try {
    byte[] data = (URLEncoder.encode(TWITTER_CONSUMER_KEY, "UTF-8") + ":" + URLEncoder.encode(TWITTER_CONSUMER_SECRET, "UTF-8")).getBytes("UTF-8");
    mEncodedKeyAndSecret = Base64.encodeToString(data, Base64.DEFAULT);
} catch (UnsupportedEncodingException e) {
    //handleError
}

自定义齐射StringRequest

private class TokenRequestWithAuthHeader extends StringRequest{

    public TokenRequestWithAuthHeader (int method, String url, Response.Listener listener, Response.ErrorListener errorListener)
    {
        super(method, url, listener, errorListener);
    }

    @Override
    public Map getHeaders() throws AuthFailureError {
        Map headers = new HashMap();
        headers.put("Content-Length", String.valueOf(getBody().length));
        headers.put("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8");
        headers.put("Authorization", "Basic " + mEncodedKeyAndSecret);
        return headers;
    }

    @Override
    public byte[] getBody() {
        return ("grant_type=client_credentials").getBytes();
    }
}

正在发送请求

tokenRequest = new TokenRequestWithAuthHeader 
                (Request.Method.POST, TWITTER_API_AUTH_URL,  mCallback.getTokenResponseListener(), mCallback);
requestQueue.add(tokenRequest);

dev.twitter.com上有关仅应用程序身份验证的文档

我也尝试扩展JsonObjectRequestJsonRequest而不是StringRequest ,结果相同。

有人可以帮助您确定请求的问题吗?

我刚刚用您在评论中提供的凭据进行了测试。 它与下面的logcat输出一起使用(我截断了实际访问令牌的内容)

I/onResponse: {"access_token":"AAAAAAAAAAAAAAAAAAAAAIwbjgAAAAAAGVMKCDU9taD0ke3sStAyA2WKszs%3DA4nfnpLTF31YuE.............JFtKjrTQC1K","token_type":"bearer"}

我的代码:

            final RequestQueue queue = Volley.newRequestQueue(this);
            final String url = "https://api.twitter.com/oauth2/token";
            final String requestBody = "grant_type=client_credentials";
            JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.POST, url, requestBody, new Response.Listener<JSONObject>() {
                @Override
                public void onResponse(JSONObject response) {
                    Log.i("onResponse", response.toString());
                }
            }, new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    Log.e("onErrorResponse", error.toString());
                }
            }) {
                @Override
                public Map<String, String> getHeaders() throws AuthFailureError {
                    Map<String, String> headers = new HashMap<>();
                    // Basic Authentication
                    //String auth = "Basic " + Base64.encodeToString(CONSUMER_KEY_AND_SECRET.getBytes(), Base64.NO_WRAP);
                    String auth = "Basic cjMzZXVWeG5ZSDN3NjJ1RUdhV1NtcDAzYzpDa0h5Q3N1ZXF5ZXVobTExWURnTmpKMUZWRFN6OEk5TDFXWXJVUTFQWTNPZTcxcWlGdQ==";
                    headers.put("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
                    headers.put("Authorization", auth);
                    return headers;
                }
            };
            queue.add(jsonObjectRequest);
private void fetchAccessTokens() {
        final String requestBody = "grant_type=client_credentials";

        JsonObjectRequest req1 = new JsonObjectRequest(Request.Method.POST,
                TwitterTokenURL,
                null,
                new Response.Listener<JSONObject>() {
                    @Override
                    public void onResponse(JSONObject response) {
                        Log.i("Response: ", response.toString());

                        fetchTweets(response.toString());

                    }
                },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {

                    }
                }){
            @Override
            public Map<String, String> getHeaders() throws AuthFailureError {
                Map<String, String> headers = new HashMap<>();

                // URL encode the consumer key and secret
                String urlApiKey = null;
                String urlApiSecret = null;
                try {
                    urlApiKey = URLEncoder.encode(CONSUMER_KEY, "UTF-8");
                    urlApiSecret = URLEncoder.encode(CONSUMER_SECRET, "UTF-8");
                } catch (UnsupportedEncodingException e) {
                    e.printStackTrace();
                }

                // Concatenate the encoded consumer key, a colon character, and the
                // encoded consumer secret
                String credentials = urlApiKey + ":" + urlApiSecret;

                String auth = "Basic "
                        + Base64.encodeToString(credentials.getBytes(), Base64.NO_WRAP);
                headers.put("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8");
                headers.put("Authorization", auth);
                return headers;
            }

            @Override
            public byte[] getBody() {
                return requestBody.getBytes();
            }
        };
        AppController.getInstance().addToRequestQueue(req1, tag_json_arry);

    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM