Построение хешированной подписи токена для БД космоса - PullRequest
2 голосов
/ 24 мая 2019

Я пытаюсь создать хешированный токен для создания документа в базе данных cosmos db, но я всегда получаю метод 405, не допускающий. Кто-нибудь может сказать мне, что приведенный ниже формат, который я предоставляю, верен?

url = https://cosmos-test-cache.documents.azure.com/dbs/FamilyDB/colls/FamilyCollection/docs/123456
ResourceLink = /dbs/FamilyDB/colls/FamilyCollection/docs/123456
ResourceType = docs
HTTP verb = POST

Response

{
  "code": "MethodNotAllowed",
  "message": "RequestHandler.Post"
}

Ответы [ 2 ]

0 голосов
/ 29 мая 2019

Чтобы добавить к ответу выше, для почтовых звонков создать хеш-токен

Resource method:Post
Resource Id:dbs/{dbs}/colls/{colls}
Resource Type:docs
and the url should be
dbs/{dbs}/colls/{colls}/docs
0 голосов
/ 24 мая 2019

Если вы наблюдаете официальный cosmos db rest api , вы можете обнаружить, что образец URL для создания документа равен https://{databaseaccount}.documents.azure.com/dbs/{db-id}/colls/{coll-id}/docs

enter image description here

Тем не менее, ваш адрес

https://cosmos-test-cache.documents.azure.com/dbs/FamilyDB/colls/FamilyCollection/docs/123456 для Получить документ , а не для создания документа. Таким образом, он идентифицируется как Get запрос, а не POST запрос.

Тогда возникает ошибка 405 "MethodNotAllowed".


Обновление:

Позвольте мне это исправить.

Если вы используете sdk, вы можете установить свойство disableAutomaticIdGeneration, чтобы избежать установки идентификатора. Он будет автоматически генерировать идентификатор для вас.

Как:

enter image description here

Но согласно документу rest api свойство id является обязательным. Поле идентификатора автоматически добавляется при создании документа без указания значения идентификатора.

enter image description here


Пожалуйста, обратитесь к примеру кода отдыха Java:

import com.sun.org.apache.xml.internal.security.utils.Base64;
import org.json.JSONObject;

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.TimeZone;

public class CreateDocumentRest {

    private static final String account = "***";
    private static final String key = "***";


    public static void main(String args[]) throws Exception {

        String urlString = "https://" + account + ".documents.azure.com/dbs/db/colls/coll/docs";

        //prepare for the json body
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("name", "A");
        jsonObject.put("id", "123");

        String jsonStr = jsonObject.toString();
        String encoding = "UTF-8";
        System.out.println(jsonStr);
        byte[] data = jsonStr.getBytes(encoding);

        HttpURLConnection conn = (HttpURLConnection) (new URL(urlString)).openConnection();
        conn.setDoInput(true);
        conn.setDoOutput(true);
        getFileRequest(conn, data);
        OutputStream outStream = conn.getOutputStream();

        outStream.write(data);
        outStream.flush();
        outStream.close();
        System.out.println(conn.getResponseCode());
        System.out.println(conn.getResponseMessage());


        BufferedReader br = null;
        if (conn.getResponseCode() != 200) {
            br = new BufferedReader(new InputStreamReader((conn.getErrorStream())));
        } else {
            br = new BufferedReader(new InputStreamReader((conn.getInputStream())));
        }
        System.out.println("Response body : " + br.readLine());
    }

    public static void getFileRequest(HttpURLConnection request, byte[] data)
            throws Exception {
        SimpleDateFormat fmt = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss");
        fmt.setTimeZone(TimeZone.getTimeZone("GMT"));
        String date = fmt.format(Calendar.getInstance().getTime()) + " GMT";
        String stringToSign = "POST".toLowerCase() + "\n"
                + "docs".toLowerCase() + "\n"
                + "dbs/db/colls/coll" + "\n"
                + date.toLowerCase() + "\n"
                + "" + "\n";
        System.out.println("stringToSign : " + stringToSign);
        String auth = getAuthenticationString(stringToSign);

        request.setRequestMethod("POST");
        request.setRequestProperty("x-ms-date", date);
        request.setRequestProperty("x-ms-version", "2017-02-22");
        request.setRequestProperty("Authorization", auth);
        request.setRequestProperty("Content-Length", String.valueOf(data.length));
        request.setRequestProperty("Content-Type", "application/json");

    }

    private static String getAuthenticationString(String stringToSign) throws Exception {
        Mac mac = Mac.getInstance("HmacSHA256");
        mac.init(new SecretKeySpec(Base64.decode(key), "HmacSHA256"));
        String authKey = Base64.encode(mac.doFinal(stringToSign.getBytes("UTF-8")));
        System.out.println("authkey:" + authKey);
        String auth = "type=master&ver=1.0&sig=" + authKey;
        auth = URLEncoder.encode(auth);
        System.out.println("authString:" + auth);
        return auth;
    }

}

По моим наблюдениям, пожалуйста, настройте ResourceLink как dbs/FamilyDB/colls/FamilyCollection и url как https://cosmos-test-cache.documents.azure.com/dbs/FamilyDB/colls/FamilyCollection/docs

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...