2017-08-09 17 views
5

Tôi đang cố truy vấn bộ sưu tập CosmosDB mới của mình thông qua quản lý API. Khi đã được chứng minh, đây sẽ là giao diện người dùng truy cập vào dữ liệu đã đăng nhập. Vì lý do đó, tôi có dữ liệu được phân đoạn theo ID đăng ký. Trong Azure Portal cho bộ sưu tập Nhật ký của WebApi DB của tôi, tôi thấy khóa phân vùng là/api_subscription_key. Tôi có dữ liệu đi vào từ API Mgt. -> Trung tâm sự kiện -> Phân tích luồng -> Cosmos.CosmosDb với DocumentDB API thông qua Quản lý API Azure

Sử dụng thám hiểm truy vấn trong cổng thông tin Azure, tôi có thể thử một truy vấn như:

SELECT * FROM c WHERE c.api_subscription_key = '573a1c65bceb52192c140131' 

tài liệu này mang lại hy vọng tôi đã viết thành công để CosmosDB trong nhiều ngày

[ 
     { 
     "eventenqueuedutctimesecond": "2017-07-27T15:09:02Z", 
     "business_unit_key": null, 
     "user_key": null, 
     "api_message_id": "1718ea66-d225-45ec-b3fc-5daff4c7f426", 
     "api_identifier": "21926e9d-9206-42b0-b4b1-7e7f1eb4e7dd", 
     "api_id": "58d94cc622be39392343d4b6", 
     "api_operation_id": "58e682bde055cd0ba4215d4b", 
     "api_adapter_id": "573a1c64bceb520aac127ee5", 
     "api_subscription_id": "573a1c65bceb52192c140131", 
     "api_policy_id": "64BC4270-54AC-42DA-835C-E285F35BCA81", 
     "basic_username": "", 
     "message_version": "10", 
     "claim_business_unit_key": null, 
     "claim_user_key": null, 
    ... 
     "lasterrorsource": null, 
     "lasterrorreason": null, 
     "lasterrorscope": null, 
     "lasterrorsection": null, 
     "lasterrorpolicyid": null, 
     "id": "7/27/2017 3:09:02 PM", 
     "_rid": "9Fc0ANW4fwAoAAAAAAAADA==", 
     "_self": "dbs/9Fc0AA==/colls/9Fc0ANW4fwA=/docs/9Fc0ANW4fwAoAAAAAAAADA==/", 
     "_etag": "\"0700d90c-0000-0000-0000-597a020e0000\"", 
     "_attachments": "attachments/", 
     "_ts": 1501168140 
     }... 

CosmosDB My Ví dụ là plexconnectcosmos. Qua quản lý API và các chính sách của mình Tôi gửi bài đến

https://plexconnectcosmos.documents.azure.com/dbs/WebApi/colls/Logs/docs 

với các tiêu đề (nhiều tàn tích và hy vọng không có hiệu lực thi hành):

[ 
{ 
name: "Postman-Token", 
value: "756c2c21-ef23-4e5a-a63a-ae6aed961d35" 
}, 
{ 
name: "Ocp-Apim-Subscription-Key", 
value: "a2a05eff128943bc89f62b81a63aa368" 
}, 
{ 
name: "Accept-Charset", 
value: "UTF-8" 
}, 
{ 
name: "Cache-Control", 
value: "no-cache" 
}, 
{ 
name: "Content-Type", 
value: "application/query+json" 
}, 
{ 
name: "Accept", 
value: "application/json;odata=nometadata" 
}, 
{ 
name: "Accept-Encoding", 
value: "gzip,deflate" 
}, 
{ 
name: "Cookie", 
value: "x-ms-gateway-slice=008; stsservicecookie=ests; BIGipServerpmc_rest_webservices_http_prod=1242575370.20480.0000" 
}, 
{ 
name: "User-Agent", 
value: "PostmanRuntime/6.2.5" 
}, 
{ 
name: "x-ms-date", 
value: "Wed, 09 Aug 2017 20:10:09 GMT" 
}, 
{ 
name: "x-ms-version", 
value: "2017-02-22" 
}, 
{ 
name: "MaxDataServiceVersion", 
value: "3.0" 
}, 
{ 
name: "DataServiceVersion", 
value: "1.0;NetFx" 
}, 
{ 
name: "Api-Message-Id", 
value: "12427ae7-7704-44cb-b4af-d7e622898b99" 
}, 
{ 
name: "Api-Identifier", 
value: "461f0c19-8df3-4272-9ac7-c64bb776dd56" 
}, 
{ 
name: "Api-Id", 
value: "58987927bceb5204c4e59168" 
}, 
{ 
name: "Api-Operation-Id", 
value: "598b3c72e055cd14fc3abdd1" 
}, 
{ 
name: "Api-Adapter-Id", 
value: "573a1c64bceb520aac127ee5" 
}, 
{ 
name: "Api-Subscription-Id", 
value: "573a1c65bceb52192c140131" 
}, 
{ 
name: "Api-Policy-Id", 
value: "64BC4270-54AC-42DA-835C-E285F35BCA81" 
}, 
{ 
name: "X-Basic-Username", 
value: "" 
}, 
{ 
name: "x-ms-documentdb-isquery", 
value: "True" 
}, 
{ 
name: "x-ms-documentdb-query-enablecrosspartition", 
value: "False" 
}, 
{ 
name: "x-ms-max-item-count", 
value: "1000" 
}, 
{ 
name: "x-ms-documentdb-partitionkey", 
value: "573a1c65bceb52192c140131" 
}, 
{ 
name: "x-ms-partition-key", 
value: "573a1c65bceb52192c140131" 
}, 
{ 
name: "Authorization", 
value: "type=master&ver=1.0&sig=Ke...Q=" 
}, 
{ 
name: "X-Forwarded-For", 
value: "75.39.38.67" 
} 
] 

Câu trả lời tôi nhận được lại là một trong hai

{ 
    "code": "BadRequest", 
    "message": "Partition key 573a1c65bceb52192c140131 is invalid.\r\nActivityId: 61836599-fe4b-4232-b55b-2c568eecc767" 
} 

hoặc

{ 
    "code": "Unauthorized", 
    "message": "The input authorization token can't serve the request. Please check that the expected payload is built as per the protocol, and check the key being used. Server used the following payload to sign: 'post\ndocs\ndbs/WebApi/colls/Logs\nwed, 09 aug 2017 20:35:41 gmt\n\n'\r\nActivityId: 429....2e2" 
} 

Những điều này dường như cho tôi hai vấn đề cần giải quyết. Ở nơi đầu tiên làm thế nào để tôi đi về xử lý sự cố phân vùng này? Nó có vẻ là từ phân tích của tôi, nó là một phân vùng hợp lệ, xác nhận hợp lệ bởi các truy vấn trong cổng thông tin và các tiêu đề "x-ms-documentdb-partitionkey" và "x-ms-partition-key". (Tôi đã thấy cả hai tên tiêu đề trong tài liệu MS, do đó, tôi bao gồm các căn cứ của tôi với cả hai.)

"Mã thông báo ủy quyền đầu vào không thể phục vụ yêu cầu." thông báo gợi ý cho tôi điều gì đó sai trong truy vấn của tôi. Tôi có thể nghi ngờ giá trị dữ liệu? Chính sách của tôi hơi khác với chính sách tôi sử dụng cho REST API lưu trữ bảng Azure và tôi chưa bao giờ gặp vấn đề đó. Tôi đang sử dụng chỉ đọc khóa chính lấy từ cổng thông tin Azure và lưu trữ trong các giá trị tên quản lý của API của tôi:

<policies> 
    <inbound> 
     <base /> 
     <set-variable name="Content-Type" value="application/query+json" /> 
     <set-variable name="x-ms-documentdb-isquery" value="True" /> 
     <set-variable name="x-ms-documentdb-query-enablecrosspartition" value="False" /> 
     <set-variable name="x-ms-max-item-count" value="1000" /> 
     <set-variable name="x-ms-version" value="2017-02-22" /> 
     <set-header name="Content-Type" exists-action="override"> 
      <value>@((string)context.Variables["Content-Type"])</value> 
     </set-header> 
     <set-header name="x-ms-documentdb-isquery" exists-action="override"> 
      <value>@((string)context.Variables["x-ms-documentdb-isquery"])</value> 
     </set-header> 
     <set-header name="x-ms-documentdb-query-enablecrosspartition" exists-action="override"> 
      <value>@((string)context.Variables["x-ms-documentdb-query-enablecrosspartition"])</value> 
     </set-header> 
     <set-header name="x-ms-max-item-count" exists-action="override"> 
      <value>@((string)context.Variables["x-ms-max-item-count"])</value> 
     </set-header> 
     <set-header name="x-ms-version" exists-action="override"> 
      <value>@((string)context.Variables["x-ms-version"])</value> 
     </set-header> 
     <!-- MS docs may conflict here. Possibly "x-ms-documentdb-partitionkey" req'd and "x-ms-partition-key" not supported --> 
     <set-header name="x-ms-documentdb-partitionkey" exists-action="override"> 
      <value>@(context.Subscription.Id)</value> 
     </set-header> 
     <set-header name="x-ms-partition-key" exists-action="override"> 
      <value>@(context.Subscription.Id)</value> 
     </set-header> 
     <set-variable name="StringToSign" value="@(string.Format("post\ndocs\ndbs/WebApi/colls/Logs\n{0}\n\n", ((string)context.Variables["x-ms-date"]).ToLowerInvariant()))" /> 
     <set-variable name="cosmosreadonlykey" value="{{CosmosReadOnlyKey}}" /> 
     <set-variable name="SharedKey" value="@{ 
     // https://docs.microsoft.com/en-us/rest/api/documentdb/access-control-on-documentdb-resources#constructkeytoken 
     System.Security.Cryptography.HMACSHA256 hasher = new System.Security.Cryptography.HMACSHA256(Convert.FromBase64String((string)context.Variables["cosmosreadonlykey"])); 
     return Convert.ToBase64String(hasher.ComputeHash(System.Text.Encoding.UTF8.GetBytes((string)context.Variables["StringToSign"]))); 
}" /> 
     <set-variable name="Authorization" value="@(string.Format("type=master&ver=1.0&sig={0}", (string)context.Variables["SharedKey"]))" /> 
     <set-header name="Authorization" exists-action="override"> 
      <value>@((string)context.Variables["Authorization"])</value> 
     </set-header> 
     <set-backend-service base-url="https://plexconnectcosmos.documents.azure.com" /> 
     <rewrite-uri template="/dbs/WebApi/colls/Logs/docs" /> 
    </inbound> 

Một số thins Tôi tự hỏi: những ActivityId trở có thể giúp tôi có thêm bất kỳ chi tiết, một số như thế nào? Ngay cả khi không có nó, là có một số đăng nhập vào Azure tôi đã không tìm thấy rằng sẽ tiết lộ thêm chi tiết.

Nếu có bất kỳ điều gì rõ ràng là sai ở đây mà tôi đang làm, hãy cho ai đó cho tôi biết.

Trả lời

3

Tôi đã chạy nó với một số điều chỉnh nhỏ.

<policies> 
<inbound> 
    <base /> 
    <set-variable name="Content-Type" value="application/query+json" /> 
    <set-variable name="x-ms-documentdb-isquery" value="True" /> 
    <set-variable name="x-ms-documentdb-query-enablecrosspartition" value="False" /> 
    <set-variable name="x-ms-max-item-count" value="1000" /> 
    <set-variable name="x-ms-version" value="2017-02-22" /> 
    <set-variable name="x-ms-date" value="@(DateTime.UtcNow.ToString("R"))" /> 
    <set-header name="Content-Type" exists-action="override"> 
     <value>@((string)context.Variables["Content-Type"])</value> 
    </set-header> 
    <set-header name="x-ms-documentdb-isquery" exists-action="override"> 
     <value>@((string)context.Variables["x-ms-documentdb-isquery"])</value> 
    </set-header> 
    <set-header name="x-ms-documentdb-query-enablecrosspartition" exists-action="override"> 
     <value>@((string)context.Variables["x-ms-documentdb-query-enablecrosspartition"])</value> 
    </set-header> 
    <set-header name="x-ms-max-item-count" exists-action="override"> 
     <value>@((string)context.Variables["x-ms-max-item-count"])</value> 
    </set-header> 
    <set-header name="x-ms-version" exists-action="override"> 
     <value>@((string)context.Variables["x-ms-version"])</value> 
    </set-header> 
    <set-header name="x-ms-documentdb-partitionkey" exists-action="override"> 
     <value>@("[\""+context.Subscription.Id+"\"]")</value> 
    </set-header> 
    <set-header name="x-ms-date" exists-action="override"> 
     <value>@((string)context.Variables["x-ms-date"])</value> 
    </set-header> 
    <set-variable name="StringToSign" value="@(string.Format("post\ndocs\ndbs/WebApi/colls/Logs\n{0}\n\n", ((string)context.Variables["x-ms-date"]).ToLowerInvariant()))" /> 
    <set-variable name="cosmosreadonlykey" value="{{CosmosReadOnlyKey}}" /> 
    <set-variable name="SharedKey" value="@{ 
    // https://docs.microsoft.com/en-us/rest/api/documentdb/access-control-on-documentdb-resources#constructkeytoken 
    System.Security.Cryptography.HMACSHA256 hasher = new System.Security.Cryptography.HMACSHA256(Convert.FromBase64String((string)context.Variables["cosmosreadonlykey"])); 
    return Convert.ToBase64String(hasher.ComputeHash(System.Text.Encoding.UTF8.GetBytes((string)context.Variables["StringToSign"]))); 
}" /> 
    <set-variable name="Authorization" value="@(string.Format("type=master&ver=1.0&sig={0}", ((string)context.Variables["SharedKey"]).Replace("&","%26").Replace("+","%2B").Replace("=","%3D")))" /> 
    <set-header name="Authorization" exists-action="override"> 
     <value>@((string)context.Variables["Authorization"])</value> 
    </set-header> 
    <set-backend-service base-url="https://mycosmosdb.documents.azure.com" /> 
    <rewrite-uri template="/dbs/WebApi/colls/Logs/docs" /> 
</inbound> 
</policies> 
  1. the partition key needs to be formatted as an array
  2. ngày được đưa vào tiêu đề và StringToSign dựa trên cùng một giá trị
  3. did some hacky URL hex encoding - có thể được cải thiện với mã hóa hex đúng
+0

Đây là tuyệt vời. Hãy để tôi xem những gì chúng tôi có thể làm để làm cho công cụ mã hóa dễ dàng hơn. –

+0

Cảm ơn, @KaiWalter Khóa phân vùng đó được định dạng dưới dạng mảng là những gì thực sự có được tôi. –

Các vấn đề liên quan