【问题标题】:Trying to get an Access Token from Dwolla restful api试图从 Dwolla restful api 获取访问令牌
【发布时间】:2017-10-08 09:38:34
【问题描述】:

我无法获取沙盒环境的访问令牌。 我按照本指南进行身份验证:OAuth

因此,当我按照本指南创建请求时,我会从 api 获得以下响应: {"error":"access_denied","error_description":"Invalid application credentials."}

我按照说明使用 mf 客户端 ID 和密码的密钥作为我的客户端密码。

这是我使用的代码:

public static void main(String[] args) {
    try {

        URL url = new URL("https://www.dwolla.com/oauth/v2/token");
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setRequestMethod("POST");

            conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
    conn.setRequestProperty("client_id", "<Key>");
            conn.setRequestProperty("client_secret", "<Secret>");
            conn.setRequestProperty("grant_type", "client_credentials"); 


            conn.setDoInput(true);
            conn.setDoOutput(true);



            System.out.println("Message:" + conn.getResponseMessage());

            BufferedReader br = new BufferedReader(new InputStreamReader(
            (conn.getInputStream())));

    String output;
    System.out.println("Output from Server .... \n");
    while ((output = br.readLine()) != null) {
        System.out.println(output);
    }

    conn.disconnect();
    } catch (MalformedURLException ex) {
        Logger.getLogger(PaymentTest.class.getName()).log(Level.SEVERE, null, ex);
    } catch (IOException ex) {
        Logger.getLogger(PaymentTest.class.getName()).log(Level.SEVERE, null, ex);
    }

}

【问题讨论】:

  • 您是否在测试代码的最后一小时内生成了令牌? token-generator doc 表示短期访问令牌在生成一小时后过期。
  • 另外,请注意不要在公开帖子上发布 API 私钥/秘密。
  • 这些是沙盒中的密钥,但以防万一我删除了它们。好的,我现在很困惑,当您进入 dwolla 仪表板时生成的令牌是我的客户机密吗?在仪表板上,我有一个“钥匙”和一个“秘密”。和一个让我生成令牌的按钮。我一直使用“Key”作为我的客户 ID。和“秘密”作为我的客户秘密
  • 是的,听起来不错,"Overview - Obtaining an application access token" 文档,在 "Request application authorization""Request parameters" 下提到了相同的 client_idclient_secret。我没有使用 Dwolla API,但授权流程与任何其他 API 相同,并遵循The OAuth 2.0 Authorization Framework's Steps to Authorization Code Grant
  • 您使用的那些凭据,如果它们来自沙盒,可能需要指向“沙盒 API 主机”:https://api-sandbox.dwolla.com。我使用您包含的相同凭据运行您的代码,并获得了与您相同的 "error",这表明我们应该使用共享的 Sandox API 端点进行测试。如果我可以让沙盒访问为我工作,我会回复。

标签: java json http http-headers dwolla


【解决方案1】:

我终于能够获得访问令牌。我的问题首先是上面的代码使用 client_id 和 client_secret 作为头参数。这些需要放在请求的正文中。

我的第二个问题是我发送的消息使用了错误的内容类型。

这是对我有用的代码:

URL url = new URL("https://sandbox.dwolla.com/oauth/v2/token");
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setRequestMethod("POST");

        conn.setRequestProperty("Content-Type", "application/json");


        conn.setDoInput(true);
        conn.setDoOutput(true);

        String data = "";


    JSONObject jsonObj = new JSONObject();
    jsonObj.put("client_id", "<Your Client ID>");
    jsonObj.put("client_secret", "<Your Client Secret>");
    jsonObj.put("grant_type", "client_credentials");

    data = jsonObj.toString();

    System.out.println("data = " + data);



    byte[] outputInBytes = data.getBytes("UTF-8");
    OutputStream os = conn.getOutputStream();
    os.write( outputInBytes );    
    os.close();


    System.out.println("Message:" + conn.getResponseMessage());


    BufferedReader br = new BufferedReader(new InputStreamReader((conn.getInputStream())));

    String output;
    System.out.println("Output from Server .... \n");
    while ((output = br.readLine()) != null) {
        System.out.println(output);
    }

    conn.disconnect();

【讨论】:

    猜你喜欢
    • 2023-04-05
    • 2021-01-12
    • 2021-09-02
    • 2021-01-10
    • 1970-01-01
    • 2018-10-10
    • 1970-01-01
    • 1970-01-01
    • 2012-10-08
    相关资源
    最近更新 更多