Anforderungssignaturen

In diesem Thema wird beschrieben, wie Oracle Cloud Infrastructure-API-Anforderungen signiert werden.

Für folgende Anwendungsbereiche sind Signaturbeispiele enthalten:

Signaturversion 1

Die hier beschriebene Signatur ist Version 1 der Oracle Cloud Infrastructure-API-Signatur. Wenn Oracle die Methode zum Signieren von Anforderungen ändert, wird in Zukunft die Versionsnummer erhöht, und Ihr Unternehmen wird benachrichtigt.

Erforderliche Zugangsdaten und OCIDs

Sie benötigen einen API-Signaturschlüssel im korrekten Format. Siehe Erforderliche Schlüssel und OCIDs.

Achtung

Client-Clock Skew

Wenn eine Clock Skew des Clients von mehr als 5 Minuten besteht, wird der HTTP-Statuscode 401 (Nicht authentifiziert) zurückgegeben. Dies wirkt sich auf Ihre API-Anforderungen aus. Weitere Informationen finden Sie unter Maximal zulässige Client-Clock Skew.

Außerdem benötigen Sie die OCIDs für Ihren Mandanten und Ihren Benutzer. Siehe Hier erhalten Sie die OCID des Mandanten und des Benutzers.

Zusammenfassung der Signaturschritte

Im Allgemeinen sind zum Signieren einer Anforderung folgende Schritte erforderlich:

  1. Formulieren Sie die HTTPS-Anforderung (SSL-Protokoll TLS 1.2 ist erforderlich).
  2. Erstellen Sie die Signaturzeichenfolge, die auf Teilen der Anforderung basiert.
  3. Erstellen Sie die Signatur aus der Signaturzeichenfolge mit Ihrem Private Key und dem RSA-SHA256-Algorithmus.
  4. Fügen Sie die erstellte Signatur und andere erforderliche Informationen dem Authorization-Header in der Anforderung hinzu.

Weitere Informationen zu diesen Schritten finden Sie in den restlichen Abschnitten in diesem Thema.

Spezifikation, mit der Sie vertraut sein müssen

Weitere Informationen zur Ausführung der Schritte 2-4 im obigen Prozess finden Sie unter draft-cavage-http-signatures-08. Dabei handelt es sich um eine Entwurfsspezifikation, die die Basis für die Verarbeitung von Anforderungssignaturen durch Oracle bildet. Im Allgemeinen wird beschrieben, wie die Signaturzeichenfolge gebildet wird, wie die Signatur erstellt wird und wie die Signatur und die erforderlichen Informationen zur Anforderung hinzugefügt werden. In den restlichen Abschnitten in diesem Thema wird davon ausgegangen, dass Sie mit dem Abschnitt vertraut sind. Wichtige Details zur Oracle Cloud Infrastructure-Implementierung der Referenz werden im nächsten Abschnitt aufgeführt.

Besondere Implementierungsdetails

In den folgenden Abschnitten werden wichtige Elemente beschrieben, die bezüglich der Oracle Cloud Infrastructure-Implementierung der Spezifikation zu beachten sind.

Authorization-Header

Die Oracle Cloud Infrastructure-Signatur verwendet das Signature-Authentifizierungsschema (mit einem Authorization-Header), nicht den Signature-HTTP-Header.

Erforderliche Header

In diesem Abschnitt werden die Header beschrieben, die in der Signaturzeichenfolge enthalten sein müssen.

Hinweis

Fehler, wenn erforderlicher Header fehlt

Wenn ein erforderlicher Header fehlt, erhält Ihr Client die Antwort 401 "Nicht autorisiert".

Bei GET- und DELETE-Anforderungen (wenn kein Inhalt im Anforderungstext vorhanden ist) muss die Signaturzeichenfolge mindestens folgende Header enthalten:

Bei PUT- und POST-Anforderungen (wenn Inhalt im Anforderungstext vorhanden ist) muss die Signaturzeichenfolge mindestens folgende Header enthalten:

  • (request-target)
  • host
  • date oder x-date (wenn beide enthalten sind, verwendet Oracle x-date)
  • x-content-sha256 (mit Ausnahme von Object Storage-PUT-Anforderungen, siehe nächster Abschnitt)
  • content-type
  • content-length
Achtung

Bei PUT- und POST-Anforderungen muss der Client x-content-sha256 berechnen und in die Anforderungs- und Signaturzeichenfolge aufnehmen, selbst wenn der Text eine leere Zeichenfolge ist. Außerdem ist content-length in der Anforderungs- und Signaturzeichenfolge immer erforderlich, selbst wenn der Text leer ist. Einige HTTP-Clients senden content-length nicht, wenn der Text leer ist. Daher müssen Sie unbedingt sicherstellen, dass der Client diese Information sendet. Wenn sowohl date als auch x-date enthalten ist, verwendet Oracle x-date. Mit x-date wird die Wiederverwendung des signierten Teils der Anforderung (Replay-Angriffe) verhindert.

Eine Ausnahme gilt nur für Object Storage-PUT-Anforderungen bei Objekten (siehe nächster Abschnitt).

Spezielle Anweisungen für Object Storage-PUT

Bei Object Storage-PutObject- und UploadPart-PUT-Anforderungen muss die Signaturzeichenfolge mindestens folgende Header enthalten:

  • (request-target)
  • host
  • date oder x-date (wenn beide enthalten sind, verwendet Oracle x-date)

Wenn die Anforderung zudem einen der anderen Header enthält, die normalerweise für PUT-Anforderungen erforderlich sind (siehe Liste oben), müssen diese Header ebenfalls in die Signaturzeichenfolge aufgenommen werden.

Schreibweise und Reihenfolge von Headern

Die Header müssen in der Signaturzeichenfolge ausschließlich in Kleinbuchstaben geschrieben werden.

Die Reihenfolge der Header in der Signaturzeichenfolge spielt keine Rolle. Stellen Sie lediglich sicher, dass Sie die Reihenfolge im Parameter headers im Authorization-Header angeben, wie in draft-cavage-http-signatures-05 beschrieben.

Achtung

(request-target) enthält den Pfad und die Abfragezeichenfolge aus der Anforderung. Oracle erwartet, dass Sie die Signaturzeichenfolge mit den Abfrageparametern in derselben Reihenfolge erstellen, in der sie in der Anforderung erscheinen. Wenn sich die Reihenfolge der Abfrageparameter der Anforderung nach der Signatur ändert, verläuft die Authentifizierung nicht erfolgreich.

URL-Codierung von Pfad und Abfragezeichenfolge

Beim Formulieren der Signaturzeichenfolge müssen Sie alle Parameter im Pfad und in der Abfragezeichenfolge (jedoch nicht die Header) gemäß RFC 3986 mit URL codieren.

Schlüssel-ID

Sie müssen keyId="<TENANCY OCID>/<USER OCID>/<KEY FINGERPRINT>" im Authorization-Header festlegen, den Sie der Anforderung hinzufügen. Diese Werte erhalten Sie unter Hier erhalten Sie die OCID des Mandanten und des Benutzers. Ein Beispiel für keyId sieht wie folgt aus (gekürzt für bessere Anzeige):

ocid1.tenancy.oc1..<unique_ID>/ocid1.user.oc1..<unique_ID>/<key_fingerprint>

Signaturalgorithmus

Der Signaturalgorithmus muss RSA-SHA256 sein, und Sie müssen algorithm="rsa-sha256" im Authorization-Header festlegen (beachten Sie die Anführungszeichen).

Signaturversion

Sie müssen version="1" im Authorization-Header angeben (beachten Sie die Anführungszeichen). Andernfalls wird davon ausgegangen, dass Sie die aktuelle Version verwenden (d.h. Version 1 zu diesem Zeitpunkt).

Beispielheader

Im Folgenden finden Sie ein Beispiel der allgemeinen Syntax des Authorization-Headers (für eine Anforderung mit Inhalt im Text):

Authorization: Signature version="1",keyId="<tenancy_ocid>/<user_ocid>/<key_fingerprint>",algorithm="rsa-sha256",headers="(request-target) date x-content-sha256 content-type content-length",signature="Base64(RSA-SHA256(<signing_string>))"

Testwerte

Im Folgenden finden Sie ein Beispielschlüsselpaar, zwei Beispielanforderungen und den resultierenden Authorization-Header für jedes Paar.

Achtung

Die Beispielsignaturen verwenden die unten aufgeführten RSA-2048-Bit-Schlüssel. Verwenden Sie diese Schlüssel nur zum Testen des Signaturcodes und nicht zum Senden von Produktionsanforderungen.

-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDCFENGw33yGihy92pDjZQhl0C3
6rPJj+CvfSC8+q28hxA161QFNUd13wuCTUcq0Qd2qsBe/2hFyc2DCJJg0h1L78+6
Z4UMR7EOcpfdUE9Hf3m/hs+FUR45uBJeDK1HSFHD8bHKD6kv8FPGfJTotc+2xjJw
oYi+1hqp1fIekaxsyQIDAQAB
-----END PUBLIC KEY-----
						
-----BEGIN RSA PRIVATE KEY-----
MIICXgIBAAKBgQDCFENGw33yGihy92pDjZQhl0C36rPJj+CvfSC8+q28hxA161QF
NUd13wuCTUcq0Qd2qsBe/2hFyc2DCJJg0h1L78+6Z4UMR7EOcpfdUE9Hf3m/hs+F
UR45uBJeDK1HSFHD8bHKD6kv8FPGfJTotc+2xjJwoYi+1hqp1fIekaxsyQIDAQAB
AoGBAJR8ZkCUvx5kzv+utdl7T5MnordT1TvoXXJGXK7ZZ+UuvMNUCdN2QPc4sBiA
QWvLw1cSKt5DsKZ8UETpYPy8pPYnnDEz2dDYiaew9+xEpubyeW2oH4Zx71wqBtOK
kqwrXa/pzdpiucRRjk6vE6YY7EBBs/g7uanVpGibOVAEsqH1AkEA7DkjVH28WDUg
f1nqvfn2Kj6CT7nIcE3jGJsZZ7zlZmBmHFDONMLUrXR/Zm3pR5m0tCmBqa5RK95u
412jt1dPIwJBANJT3v8pnkth48bQo/fKel6uEYyboRtA5/uHuHkZ6FQF7OUkGogc
mSJluOdc5t6hI1VsLn0QZEjQZMEOWr+wKSMCQQCC4kXJEsHAve77oP6HtG/IiEn7
kpyUXRNvFsDE0czpJJBvL/aRFUJxuRK91jhjC68sA7NsKMGg5OXb5I5Jj36xAkEA
gIT7aFOYBFwGgQAQkWNKLvySgKbAZRTeLBacpHMuQdl1DfdntvAyqpAZ0lY0RKmW
G6aFKaqQfOXKCyWoUiVknQJAXrlgySFci/2ueKlIE1QqIiLSZ8V8OlpFLRnb1pzI
7U1yQXnTAEFYM560yJlzUpOb1V4cScGd365tiSMvxLOvTA==
-----END RSA PRIVATE KEY-----


The public key is stored under keyId:

ocid1.tenancy.oc1..<unique_ID>/ocid1.user.oc1..<unique_ID>/<key_fingerprint>



For the following GET request (line breaks inserted between query parameters for easier reading; also notice the URL encoding as mentioned earlier):
			
GET https://iaas.us-phoenix-1.oraclecloud.com/20160918/instances
?availabilityDomain=Pjwf%3A%20PHX-AD-1
&compartmentId=ocid1.compartment.oc1...<unique_ID>
&displayName=TeamXInstances
&volumeId=ocid1.volume.oc1.phx.<unique_ID>
Date: Thu, 05 Jan 2014 21:31:40 GMT
			
The signing string would be (line breaks inserted into the (request-target) header for easier reading):
			
date: Thu, 05 Jan 2014 21:31:40 GMT
(request-target): get /20160918/instances?availabilityDomain=Pjwf%3A%20PH
X-AD-1&compartmentId=ocid1.compartment.oc1..aaaaaaaam3we6vgnherjq5q2i
dnccdflvjsnog7mlr6rtdb25gilchfeyjxa&displayName=TeamXInstances&
volumeId=ocid1.volume.oc1.phx.abyhqljrgvttnlx73nmrwfaux7kcvzfs3s66izvxf2h
4lgvyndsdsnoiwr5q
host: iaas.us-phoenix-1.oraclecloud.com

The Authorization header would be:
Signature version="1",headers="date (request-target) host",keyId="ocid1.t
enancy.oc1..<unique_ID>/ocid1.user.oc1..<unique_ID>/<key_fingerprint>,algorithm="rsa-sha256
",signature="<your_signature>"

For the following POST request:
			
POST https://iaas.us-phoenix-1.oraclecloud.com/20160918/volumeAttachments
Date: Thu, 05 Jan 2014 21:31:40 GMT
{
   "compartmentId": "ocid1.compartment.oc1..<unique_id>",
   "instanceId": "ocid1.instance.oc1.phx.<unique_id>",
   "volumeId": "ocid1.volume.oc1.phx.<unique_id>"
}

The signing string would be:
			
date: Thu, 05 Jan 2014 21:31:40 GMT
(request-target): post /20160918/volumeAttachments
host: iaas.us-phoenix-1.oraclecloud.com
content-length: 316
content-type: application/json
x-content-sha256: V9Z20UJTvkvpJ50flBzKE32+6m2zJjweHpDMX/U4Uy0=
			
The Authorization header would be:	

Signature version="1",headers="date (request-target) host content-length c
ontent-type x-content-sha256",
keyId="ocid1.tenancy.oc1..<unique_id>/ocid1.user.oc1.<unique_id>/<your_fingerprint>",
algorithm="rsa-sha256",signature="<your_signature>"

Beispielcode

In diesem Abschnitt wird der grundlegende Code zum Signieren von API-Anforderungen angezeigt.

Java

/**
* Copyright (c) 2016, 2020, Oracle and/or its affiliates.  All rights reserved.
* This software is dual-licensed to you under the Universal Permissive License (UPL) 1.0 as shown at https://oss.oracle.com/licenses/upl 
* or Apache License 2.0 as shown at http://www.apache.org/licenses/LICENSE-2.0. You may choose either license.
*/
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;

import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.Invocation;
import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.core.Response;

import com.google.common.net.UrlEscapers;

import com.oracle.bmc.http.signing.RequestSigningFilter;

public class RawRestCallExample {

public static void main(String[] args) throws Exception {
// TODO: fill this out
String instanceId = null;

String configurationFilePath = "~/.oci/config";
String profile = "DEFAULT";

// Pre-Requirement: Allow setting of restricted headers. This is required to allow the SigningFilter
// to set the host header that gets computed during signing of the request.
System.setProperty("sun.net.http.allowRestrictedHeaders", "true");

// 1) Create a request signing filter instance
RequestSigningFilter requestSigningFilter =
RequestSigningFilter.fromConfigFile(configurationFilePath, profile);

// 2) Create a Jersey client and register the request signing filter
Client client = ClientBuilder.newBuilder().build().register(requestSigningFilter);

// 3) Target an endpoint. You must ensure that path arguments and query
// params are escaped correctly yourself
WebTarget target =
client.target("https://iaas.us-phoenix-1.oraclecloud.com")
.path("20160918")
.path("instances")
.path(UrlEscapers.urlPathSegmentEscaper().escape(instanceId));

// 4) Set the expected type and invoke the call
Invocation.Builder ib = target.request();
ib.accept(MediaType.APPLICATION_JSON);
Response response = ib.get();

// 5) Print the response headers and the body (JSON) as a string
MultivaluedMap<String, Object> responseHeaders = response.getHeaders();
System.out.println(responseHeaders);
InputStream responseBody = (InputStream) response.getEntity();
try (final BufferedReader reader =
new BufferedReader(new InputStreamReader(responseBody, StandardCharsets.UTF_8))) {
StringBuilder jsonBody = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
jsonBody.append(line);
}
System.out.println(jsonBody.toString());
}
}
		}

Python

Wichtig

Dieser Python-Beispielcode erfordert TLS 1.2, das nicht im Standard-Python unter Mac OS X enthalten ist.
# coding: utf-8
# Copyright (c) 2016, 2020, Oracle and/or its affiliates.  All rights reserved.
# This software is dual-licensed to you under the Universal Permissive License (UPL) 1.0 as shown at https://oss.oracle.com/licenses/upl 
# or Apache License 2.0 as shown at http://www.apache.org/licenses/LICENSE-2.0. You may choose either license.

import requests
from oci.config import from_file
from oci.signer import Signer

config = from_file()
auth = Signer(
tenancy=config['tenancy'],
user=config['user'],
fingerprint=config['fingerprint'],
private_key_file_location=config['key_file'],
pass_phrase=config['pass_phrase']
)

endpoint = 'https://identity.us-phoenix-1.oraclecloud.com/20160918/users/'

body = {
'compartmentId': config['tenancy'],  # root compartment
'name': 'TestUser',
'description': 'Created with a raw request'
}

response = requests.post(endpoint, json=body, auth=auth)
response.raise_for_status()

print(response.json()['id'])

TypeScript

/**
 * Copyright (c) 2020, Oracle and/or its affiliates.  All rights reserved.
 * This software is dual-licensed to you under the Universal Permissive License (UPL) 1.0 as shown at https://oss.oracle.com/licenses/upl 
 * or Apache License 2.0 as shown at http://www.apache.org/licenses/LICENSE-2.0. You may choose either license.
 */

import { DefaultRequestSigner, HttpRequest } from "oci-common";
import { provider } from "./authentication";
import * as promise from "es6-promise";
import "isomorphic-fetch";
promise.polyfill();

const userID = "Add User OCID here";
(async () => {
  // 1. Create Request Signing instance
  const signer = new DefaultRequestSigner(provider);

  // 2. Create HttpRequest to be signed
  const httpRequest: HttpRequest = {
    uri: `https://identity.us-phoenix-1.oraclecloud.com/20160918/users/${userID}`,
    headers: new Headers(),
    method: "GET"
  };

  // 3. sign request
  await signer.signHttpRequest(httpRequest);

  // 4. Make the call
  const response = await fetch(
    new Request(httpRequest.uri, {
      method: httpRequest.method,
      headers: httpRequest.headers,
      body: httpRequest.body
    })
  );
  // 5. Print response
  console.log(await response.json());
})();

JavaScript

/**
 * Copyright (c) 2020, Oracle and/or its affiliates.  All rights reserved.
 * This software is dual-licensed to you under the Universal Permissive License (UPL) 1.0 as shown at https://oss.oracle.com/licenses/upl 
 * or Apache License 2.0 as shown at http://www.apache.org/licenses/LICENSE-2.0. You may choose either license.
 */

const common = require("oci-common");
const promise = require("es6-promise");
require("isomorphic-fetch");
promise.polyfill();

const configurationFilePath = "~/.oci/config";
const configProfile = "DEFAULT";

const provider = new common.ConfigFileAuthenticationDetailsProvider(
  configurationFilePath,
  configProfile
);

const userID = "<INSERT_SAMPLE_USER_OCID_HERE>";
(async () => {
  // 1. Create Request Signing instance
  const signer = new common.DefaultRequestSigner(provider);

  // 2. Create HttpRequest to be signed
  const httpRequest = {
    uri: `https://identity.us-phoenix-1.oraclecloud.com/20160918/users/${userID}`,
    headers: new Headers(),
    method: "GET"
  };

  // 3. sign request
  await signer.signHttpRequest(httpRequest);

  // 4. Make the call
  const response = await fetch(
    new Request(httpRequest.uri, {
      method: httpRequest.method,
      headers: httpRequest.headers,
      body: httpRequest.body
    })
  );
  // 5. Print response
  console.log(await response.json());
})();

Ruby


# Copyright (c) 2016, 2020, Oracle and/or its affiliates.  All rights reserved.
# This software is dual-licensed to you under the Universal Permissive License (UPL) 1.0 as shown at https://oss.oracle.com/licenses/upl or 
# Apache License 2.0 as shown at http://www.apache.org/licenses/LICENSE-2.0. You may choose either license.

require 'oci'
require 'net/http'

config = OCI::ConfigFileLoader.load_config(config_file_location:my_config_file_location)
endpoint = OCI::Regions.get_service_endpoint(config.region, :IdentityClient)

uri = URI(endpoint + '/20160918/users/' + config.user)
request = Net::HTTP::Get.new(uri)

signer = OCI::Signer.new(config.user, config.fingerprint, config.tenancy, config.key_file, pass_phrase:my_private_key_pass_phrase)
signer.sign(:get, uri.to_s, request, nil)

result = Net::HTTP.start(uri.hostname, uri.port, :use_ssl => true) {|http|
http.request(request)
}

puts result.body

Go

Das folgende Beispiel zeigt, wie ein Standardsignaturgeber erstellt wird.

Hinweis

Das SDK für Go enthält einen Standalone-Signaturgeber, mit dem Sie benutzerdefinierte Anforderungen signieren können. Sie finden den zugehörigen Code unter http_signer.go.
// Copyright (c) 2016, 2018, 2020, Oracle and/or its affiliates.  All rights reserved.
// This software is dual-licensed to you under the Universal Permissive License (UPL) 1.0 as shown at https://oss.oracle.com/licenses/upl or 
// Apache License 2.0 as shown at http://www.apache.org/licenses/LICENSE-2.0. You may choose either license.

// Example code for sending raw request to  Service API

package example

import (
"fmt"
"io/ioutil"
"log"
"net/http"
"time"

"github.com/oracle/oci-go-sdk/common"
"github.com/oracle/oci-go-sdk/example/helpers"
)

// ExampleRawRequest compose a request, sign it and send to server
func ExampleListUsers_RawRequest() {
// build the url
url := "https://identity.us-phoenix-1.oraclecloud.com/20160918/users/?compartmentId=" + *helpers.RootCompartmentID()

// create request
request, err := http.NewRequest("GET", url, nil)
helpers.FatalIfError(err)

// Set the Date header
request.Header.Set("Date", time.Now().UTC().Format(http.TimeFormat))

// And a provider of cryptographic keys
provider := common.DefaultConfigProvider()

// Build the signer
signer := common.DefaultRequestSigner(provider)

// Sign the request
signer.Sign(request)

client := http.Client{}

fmt.Println("send request")

// Execute the request
resp, err := client.Do(request)
helpers.FatalIfError(err)

defer resp.Body.Close()

log.Println("response Status:", resp.Status)
log.Println("response Headers:", resp.Header)

body, _ := ioutil.ReadAll(resp.Body)
log.Println("response Body:", string(body))

fmt.Println("receive response")

// Output:
// send request
// receive response
}

Bash

Bash-Beispiel zur besseren Lesbarkeit im Vollbildmodus anzeigen



#!/bin/bash
# Copyright (c) 2016, 2020, Oracle and/or its affiliates.  All rights reserved.
# This software is dual-licensed to you under the Universal Permissive License (UPL) 1.0 as shown at https://oss.oracle.com/licenses/upl or Apache License 2.0 as shown at http://www.apache.org/licenses/LICENSE-2.0. You may choose either license.

set -e

if [[ -z "$COMPARTMENT_ID" ]];then
    echo "COMPARTMENT_ID must be defined in the environment. "
    exit 1
fi

USER_NAME="TestUser"
USER_DESCRIPTION="User created by raw request"
TARGET_URI='https://identity.us-phoenix-1.oraclecloud.com/20160918/users/'
HTTP_METHOD='POST'
PROFILE='ADMIN'
REQUEST_BODY="{\"compartmentId\": \"$COMPARTMENT_ID\", \"name\": \"$USER_NAME\", \"description\": \"$USER_DESCRIPTION\"}"


echo "oci raw-request --profile ${PROFILE} --target-uri ${TARGET_URI} --http-method ${HTTP_METHOD} --request-body "${REQUEST_BODY}" | jq -r '.data.id'"
USER_OCID=$(oci raw-request --profile ${PROFILE} --target-uri ${TARGET_URI} --http-method ${HTTP_METHOD} --request-body "${REQUEST_BODY}" | jq -r '.data.id')

echo "Created user OCID: $USER_OCID"

C#


/*
 * Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved.
 * This software is dual-licensed to you under the Universal Permissive License (UPL) 1.0 as shown at https://oss.oracle.com/licenses/upl or 
 * Apache License 2.0 as shown at http://www.apache.org/licenses/LICENSE-2.0. You may choose either license.
 */

using System;
using System.Net.Http;
using System.Threading.Tasks;
using Oci.Common.Http.Signing;

namespace Oci.Examples
{
    public class RawRestCallExample
    {
        private static NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger();

        public static async Task MainRaw()
        {
            var namespaceName = Environment.GetEnvironmentVariable("NAMESPACE_NAME");
            var compartmentId = Environment.GetEnvironmentVariable("COMPARTMENT_ID");

            var httpClientHandler = OciHttpClientHandler.FromConfigFile("~/.oci/config", "DEFAULT");
            var GET_BUCKETS_URL = $"https://objectstorage.us-phoenix-1.oraclecloud.com/n/{namespaceName}/b/?compartmentId={compartmentId}";
            var client = new HttpClient(httpClientHandler);
            var requestMessage = new HttpRequestMessage(HttpMethod.Get, new Uri(GET_BUCKETS_URL));

            var response = await client.SendAsync(requestMessage);

            logger.Info($"Is rest call successful: {response.IsSuccessStatusCode}");
            var responseJson = await response.Content.ReadAsStringAsync();
            logger.Info($"Parsed Response: {responseJson}");
        }
    }
}