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を使用します。 注意:リクエストヘッダのx-ncp-apigw-timestamp値とStringToSignのtimestampは必ず同じ値がある必要があります。
リクエストに沿って 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" } }