API Key を生成する

API Gatewayに登録されたAPIを使用するためにはまずAPI Keyを生成する必要があります。

API Keys メニューを選択します。

API Key を生成をクリックします。

① API Key 生成に必要な値を入力します。

  • 名前: API Keyの名前を入力します。
  • 説明: API Keyの説明を入力します。

保存をクリックします。

① 生成した API Keyを照会できます。

  • 状態: API Keyが有効化されているかが表示されます。無効化されているAPI Keyは使用できません。
  • Primary/Secondary Key: APIを呼び出す際にHeaderを入れなければならない値です。この値は変更できます。

接続されたStageをみるをクリックしてAPI Keyが使用しているAPIの使用量を確認できます。

Product を購読する

Published APIsメニューへ移動して購読しようとする商品を選択します。

Catalogをクリックします。

購読するをクリックします。

  • 商品の購読タイプが 公開 - 自由購読であれば 購読する ボタンは表示されません。別途の手続きなしでAPIを呼び出しできます。
  • 商品の購読タイプが 保護 - 承認が必要であれば 購読する ボタンが表示されます。API呼び出しのためにはAPI Key承認の手続きが必要です。

① 本人が所有したAPI Keyリストを確認できます。

② API Keyを選択して 購読リクエストをクリックすると承認をリクエストします。

API の呼び出し

呼び出ししようとする商品のAPI Documentをご参照ください。

認証のない APIの呼び出し

Header Description
x-ncp-apigw-api-key API Gatewayから発行されたキー (primary keyまたはsecondary key)
API Keyをリクエストする場合のみ追加
curl -i -X GET \
   -H "x-ncp-apigw-api-key:cstWXuw4wqp1EfuqDwZeMz5fh0epaTykRRRuy5Ra" \
 'https://uh7m0wgsis.apigw.ntruss.com/petStore/v1/pets'

IAM 認証が必要なAPIの呼び出し

Header Description
x-ncp-apigw-api-key API Gatewayから発行されたキー(primary keyまたはsecondary key)
API Keyをリクエストする場合のみ追加
x-ncp-apigw-timestamp 1970年1月1日 00:00:00 協定世界時間(UTC)からの経過時間をミリセカンド(millisecond)で表示したものである。
APIGW サーバと時間差が5分以上ある場合は有効でないリクエストとみなす
x-ncp-iam-access-key ポータルまたはsub accountから発行されたAccess Key ID
x-ncp-apigw-signature-v2 Access Key IdとマッピングされるSecretKeyで暗号化した署名
HMAC暗号化アルゴリズムはHmacSHA256を使用
curl -i -X GET \
   -H "x-ncp-apigw-timestamp:1505290625682" \
   -H "x-ncp-apigw-api-key:cstWXuw4wqp1EfuqDwZeMz5fh0epaTykRRRuy5Ra" \
   -H "x-ncp-iam-access-key:D78BB444D6D3C84CA38A" \
   -H "x-ncp-apigw-signature-v2:WTPItrmMIfLUk/UyUIyoQbA/z5hq9o3G8eQMolUzTEo=" \
 'https://uh7m0wgsis.apigw.ntruss.com/petStore/v1/pets'
  • Access Key ID, SecretKeyを確認する

    IAM AccessKeyを生成をご参照ください。

  • Signatureを生成する

リクエスト StringToSign
GET /photos/puppy.jpg?query1=&query2
x-ncp-apigw-timestamp={timestamp}
x-ncp-apigw-api-key={apiKey}
x-ncp-iam-access-key={accesskey}
x-ncp-apigw-signature-v2={signature}
GET /photos/puppy.jpg?query1=&query2
{timeStamp}
{accessKey}

署名に使われるURLにはドメインが含まれません。 改行文字は \nを使用します。

リクエストに沿って StringToSignを生成し、SecretKeyでHmacSHA256 アルゴリズムで暗号化した後、Base64でエンコーディングします。 この値を x-ncp-apigw-signature-v2で使用します。

  • Java サンプルコード
public String makeSignature() {
    String space = " ";                    // one space
    String newLine = "\n";                    // new line
    String method = "GET";                    // method
    String url = "/photos/puppy.jpg?query1=&query2";    // url (include query string)
    String timestamp = "{timestamp}";            // current timestamp (epoch)
    String accessKey = "{accessKey}"            // access key id (from portal or sub account)
    String secretKey = "{secretKey}";

    String message = new StringBuilder()
        .append(method)
        .append(space)
        .append(url)
        .append(newLine)
        .append(timestamp)
        .append(newLine)
        .append(accessKey)
        .toString();

    SecretKeySpec signingKey = new SecretKeySpec(secretKey.getBytes("UTF-8"), "HmacSHA256");
    Mac mac = Mac.getInstance("HmacSHA256");
    mac.init(signingKey);

    byte[] rawHmac = mac.doFinal(message.getBytes("UTF-8"));
    String encodeBase64String = Base64.encodeBase64String(rawHmac);

    return encodeBase64String;
}
  • Java script サンプルコード
/*
https://code.google.com/archive/p/crypto-js/
https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/crypto-js/CryptoJS%20v3.1.2.zip
*/

/*
CryptoJS v3.1.2
code.google.com/p/crypto-js
(c) 2009-2013 by Jeff Mott. All rights reserved.
code.google.com/p/crypto-js/wiki/License
*/
<script type="text/javascript" src="./CryptoJS/rollups/hmac-sha256.js"></script>
<script type="text/javascript" src="./CryptoJS/components/enc-base64.js"></script>

function makeSignature() {
    var space = " ";                // one space
    var newLine = "\n";                // new line
    var method = "GET";                // method
    var url = "/photos/puppy.jpg?query1=&query2";    // url (include query string)
    var timestamp = "{timestamp}";            // current timestamp (epoch)
    var accessKey = "{accessKey}"            // access key id (from portal or sub account)
    var secretKey = "{secretKey}";            // secret key (from portal or sub account)

    var hmac = CryptoJS.algo.HMAC.create(CryptoJS.algo.SHA256, secretKey);
    hmac.update(method);
    hmac.update(space);
    hmac.update(url);
    hmac.update(newLine);
    hmac.update(timestamp);
    hmac.update(newLine);
    hmac.update(accessKey);

    var hash = hmac.finalize();

    return hash.toString(CryptoJS.enc.Base64);
}
  • Python 3 サンプルコード
import sys
import os
import hashlib
import hmac
import base64
import requests
import time

def    make_signature():
    timestamp = int(time.time() * 1000)
    timestamp = str(timestamp)

    access_key = "{accessKey}"                # access key id (from portal or sub account)
    secret_key = "{secretKey}"                # secret key (from portal or sub account)
    secret_key = bytes(secret_key, 'UTF-8')

    method = "GET"
    uri = "/photos/puppy.jpg?query1=&query2"

    message = method + " " + uri + "\n" + timestamp + "\n" + access_key
    message = bytes(message, 'UTF-8')
    signingKey = base64.b64encode(hmac.new(secret_key, message, digestmod=hashlib.sha256).digest())
    return signingKey
  • Bash サンプルコード
function makeSignature() {
    nl=$'\\n'

    TIMESTAMP=$(echo $(($(date +%s%N)/1000000)))
    ACCESSKEY="{accessKey}"                # access key id (from portal or sub account)
    SECRETKEY="{secretKey}"                # secret key (from portal or sub account)

    METHOD="GET"
    URI="/photos/puppy.jpg?query1=&query2"

    SIG="$METHOD"' '"$URI"${nl}
    SIG+="$TIMESTAMP"${nl}
    SIG+="$ACCESSKEY"

    SIGNATURE=$(echo -n -e "$SIG"|iconv -t utf8 |openssl dgst -sha256 -hmac $SECRETKEY -binary|openssl enc -base64)
}
  • Objective-C サンプルコード
#include <CommonCrypto/CommonDigest.h>
#include <CommonCrypto/CommonHMAC.h>

- (NSString*) makeSignature
{
    NSString* space = @" ";
    NSString* newLine = @"\n";
    NSString* method = @"GET";
    NSString* url = @"/photos/puppy.jpg?query1=&query2";
    NSString* timestamp = @"{timestamp}"
    NSString* accessKey = @"{accessKey}";
    NSString* secretKey = @"{secretKey}";

    NSString* message = [[NSString alloc] init];
    message = [message stringByAppendingString:method];
    message = [message stringByAppendingString:space];
    message = [message stringByAppendingString:url];
    message = [message stringByAppendingString:newLine];
    message = [message stringByAppendingString:timestamp];
    message = [message stringByAppendingString:newLine];
    message = [message stringByAppendingString:accessKey];

    const char *cKey = [secretKey cStringUsingEncoding:NSASCIIStringEncoding];
    const char *cData = [message StringUsingEncoding:NSASCIIStringEncoding];
    unsigned char cHMAC[CC_SHA256_DIGEST_LENGTH];
    CCHmac(kCCHmacAlgSHA256, cKey, strlen(cKey), cData, strlen(cData), cHMAC);
    NSData *hash = [[NSData alloc] initWithBytes:cHMAC length:sizeof(cHMAC)];

    const uint8_t* input = (const uint8_t*)[hash bytes];
    NSInteger length = [theData length];

    static char table[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";

    NSMutableData* data = [NSMutableData dataWithLength:((length + 2) / 3) * 4];
    uint8_t* output = (uint8_t*)data.mutableBytes;

    NSInteger i;
    for (i=0; i < length; i += 3) {

        NSInteger value = 0;
        NSInteger j;

        for (j = i; j < (i + 3); j++) {
            value <<= 8;

            if (j < length) {
                value |= (0xFF & input[j]);
            }
        }

        NSInteger theIndex = (i / 3) * 4;
        output[theIndex + 0] = table[(value >> 18) & 0x3F];
        output[theIndex + 1] = table[(value >> 12) & 0x3F];
        output[theIndex + 2] = (i + 1) < length ? table[(value >> 6) & 0x3F] : '=';
        output[theIndex + 3] = (i + 2) < length ? table[(value >> 0) & 0x3F] : '=';
    }

    return [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];
}

エラーコード

HttpStatusCode ErrorCode ErrorMessage 説明
400 100 Bad Request Exception protocol(https), endocing(UTF-8) など request エラー
401 200 Authentication Failed 認証失敗
401 210 Permission Denied 権限なし
404 300 Not Found Exception Not found
429 400 Quota Exceeded Quota超過
429 410 Throttle Limited Rate超過
429 420 Rate Limited Rate超過
413 430 Request Entity Too Large リクエストエンティティサイズの超過
503 500 Endpoint Error エンドポイント接続エラー
504 510 Endpoint Timeout エンドポイント接続時間の超過
500 900 Unexpected Error 例外処理されていないエラー

エラーレスポンス形式

  • リクエストContent-Typeがapplication/xmlの場合

    <?xml version='1.0' encoding='UTF-8' ?>
    <Message>
      <error>
          <errorCode>210</errorCode>
          <message>Permission Denied</message>
      </error>
    </Message>
    
  • その他

    {
     "error":{
        "errorCode":"210",
        "message":"Permission Denied"
     }
    }
    

に対する検索結果は~件です。 ""

    に対する検索結果がありません。 ""

    処理中...