代码之家  ›  专栏  ›  技术社区  ›  Ievgen

Cosmos DB emulator原始授权值格式

  •  1
  • Ievgen  · 技术社区  · 6 年前

    我必须从3party应用程序访问cosmos DB存储过程,该应用程序只允许以原始HTTP格式配置和发送请求。

    Cosmos DB默认模拟器密钥为 C2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw/Jw==

        POST https://localhost:8081/dbs/Orders/colls/volcano1/sprocs/GetDocumentsAndTransform  HTTP/1.1  
    x-ms-date: Wed, 09 Dec 2015 18:05:07 GMT  
    Cache-Control: no-cache  
    authorization: type%3dmaster%26ver%3d1.0%26sig%3dkOU%2bC2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw/Jw==%3d   
    User-Agent: contoso/1.0  
    x-ms-version: 2015-08-06  
    Accept: application/json  
    Content-Type: application/json  
    Host: localhost:8081
    Content-Length: 9  
    Expect: 100-continue  
    
    ["World"]  
    

    授权失败了。如何将密钥转换为HTTPs请求的适当授权值?

    1 回复  |  直到 6 年前
        1
  •  2
  •   Alex AIT    6 年前

    你可以看看Java SDK,它是开源的。 例如。 https://github.com/Azure/azure-cosmosdb-java/blob/master/sdk/src/main/java/com/microsoft/azure/cosmosdb/internal/BaseAuthorizationTokenProvider.java

    /**
     * This class is used internally by both client (for generating the auth header with master/system key) and by the Gateway when
    * verifying the auth header in the Azure Cosmos DB database service.
     */
    public class BaseAuthorizationTokenProvider implements AuthorizationTokenProvider {
    
    private final String masterKey;
    private final Mac macInstance;
    
    public BaseAuthorizationTokenProvider(String masterKey) {
        this.masterKey = masterKey;
        byte[] masterKeyDecodedBytes = Utils.Base64Decoder.decode(this.masterKey.getBytes());
        SecretKey signingKey = new SecretKeySpec(masterKeyDecodedBytes, "HMACSHA256");
        try {
            this.macInstance = Mac.getInstance("HMACSHA256");
            this.macInstance.init(signingKey);
        } catch (NoSuchAlgorithmException | InvalidKeyException e) {
            throw new IllegalStateException(e);
        }
    }
    
    /**
     * This API is a helper method to create auth header based on client request using masterkey.
     *
     * @param verb                 the verb
     * @param resourceIdOrFullName the resource id or full name
     * @param  resourceSegment     the resource segment
     * @param headers              the request headers
     * @return the key authorization signature
     */
    public String generateKeyAuthorizationSignature(String verb,
            String resourceIdOrFullName,
            String resourceSegment,
            Map<String, String> headers) {
        if (verb == null || verb.isEmpty()) {
            throw new IllegalArgumentException("verb");
        }
    
        if (resourceIdOrFullName == null) {
            resourceIdOrFullName = "";
        }
    
        if (resourceSegment == null) {
            throw new IllegalArgumentException("resourceSegment");
        }
    
        if (headers == null) {
            throw new IllegalArgumentException("headers");
        }
    
        if (this.masterKey == null || this.masterKey.isEmpty()) {
            throw new IllegalArgumentException("masterKey");
        }
    
        if(!PathsHelper.isNameBased(resourceIdOrFullName)) {
            resourceIdOrFullName = resourceIdOrFullName.toLowerCase(Locale.ROOT);
        }
    
        // Skipping lower casing of resourceId since it may now contain "ID" of the resource as part of the FullName
        String body = String.format("%s\n%s\n%s\n",
                verb.toLowerCase(),
                resourceSegment,
                resourceIdOrFullName);
    
        if (headers.containsKey(HttpConstants.HttpHeaders.X_DATE)) {
            body += headers.get(HttpConstants.HttpHeaders.X_DATE).toLowerCase();
        }
    
        body += '\n';
    
        if (headers.containsKey(HttpConstants.HttpHeaders.HTTP_DATE)) {
            body += headers.get(HttpConstants.HttpHeaders.HTTP_DATE).toLowerCase();
        }
    
        body += '\n';
    
        Mac mac = null;
        try {
            mac = (Mac) this.macInstance.clone();
        } catch (CloneNotSupportedException e) {
            throw new IllegalStateException(e);
        }
    
        byte[] digest = mac.doFinal(body.getBytes());
    
        String auth = Utils.encodeBase64String(digest);
    
        String authtoken = "type=master&ver=1.0&sig=" + auth;
    
        return authtoken;
    }