【问题标题】:Cosmos db Rest API - Error 401 UnauthorizedCosmos db Rest API - 错误 401 未经授权
【发布时间】:2019-06-28 08:38:19
【问题描述】:

我正在尝试使用 REST API 获取对 db cosmos 的获取请求! azure cosmos db有一个特定的标题,但我认为一切都是正确的

但是,当我使用 Http REST API 时,我收到错误 Unauthorized 401,你能帮帮我吗?

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    n = findViewById(R.id.teste11);
    Button buttonParse = findViewById(R.id.button_parse);
    buttonParse.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            try {
                getwebservice();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
    client = new OkHttpClient();


}

获取webservices方法

 private void getwebservice() throws Exception {

    String headerDate = getDateString();

    String gen = generateAuthHeader("GET", "docs", "dbs/tempdb/colls/tempcoll/docs/WakefieldFamily",
            headerDate, PRIMARY_KEY);
    final Request request = new Request.Builder()
            .url("https://***.documents.azure.com:443/dbs/***/colls/***/docs/WakefieldFamily")
            .get()
            .addHeader("Accept", "application/json")
            .addHeader("x-ms-version", "2017-02-22")
            .addHeader("Authorization", gen)
            .addHeader("x-ms-date", headerDate)
            .addHeader("cache-control", "no-cache")
            .build();

    okhttp3.Response response = null;
    client.newCall(request).enqueue(new Callback() {
        Headers g = request.headers();
        @Override
        public void onFailure(okhttp3.Call call, IOException e) {
             MainActivity.this.runOnUiThread(new Runnable() {
                 @Override
                 public void run() {
                     String g = "oi";

                 }
             });
        }

        @Override
        public void onResponse(okhttp3.Call call, okhttp3.Response response) throws IOException {
            runOnUiThread(new Runnable() {
                @Override
                public void run() {

                    n.setText(String.valueOf(response.code()));
                }
            });
        }
    });

    }

这些是签名和标题日期的辅助方法

 public String getDateString() {
    SimpleDateFormat formatter =
            new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss 'GMT'", Locale.US);
    formatter.setTimeZone(TimeZone.getTimeZone("GMT"));
    return formatter.format(new Date()).toLowerCase();

}

public String generateAuthHeader(String verb, String resourceType, String resourceId, String date, String masterKeyBase64) throws Exception {

    byte[] masterKeyBytes = Base64.decode(masterKeyBase64, Base64.NO_WRAP);
    Mac mac = Mac.getInstance("HMACSHA256");
    mac.init(new SecretKeySpec(masterKeyBytes, "HMACSHA256"));

    //Build the unsigned auth string.
    String stringToSign = verb.toLowerCase() + "\n"
            + resourceType.toLowerCase() + "\n"
            + resourceId + "\n"
            + date.toLowerCase() + "\n"
            + "\n";

    //Sign and encode the auth string.
    String signature = Base64.encodeToString(mac.doFinal(stringToSign.toLowerCase().getBytes("UTF-8")), Base64.NO_WRAP);

    //Generate the auth header.
    String authHeader = URLEncoder.encode("type=master&ver=1.0&sig=" + signature, "UTF-8");

    return authHeader;
}

我仍在尝试弄清楚这是如何工作的。

【问题讨论】:

    标签: android azure-cosmosdb okhttp3 http-status-code-401


    【解决方案1】:

    我认为问题在于您将stringToSign 变量转换为小写。 resourceId 有一些大写字母,在这个过程中会被转换。

    【讨论】:

      猜你喜欢
      • 2021-04-13
      • 2016-02-09
      • 1970-01-01
      • 1970-01-01
      • 2013-11-19
      • 2019-05-06
      • 2019-02-01
      • 1970-01-01
      • 2021-04-07
      相关资源
      最近更新 更多