PHP로 Archive Storage API 인증 토큰 생성하는 방법
개요
네이버 클라우드(Ncloud) Archive Storage API를 이용하려고 할 때 먼저 인증 토큰을 생성하고 생성된 토큰을 이용해서 API로 Archive Storage에 접근해야 합니다. 여기서는 PHP로 API 인증 토큰을 생성하는 방법에 대해 우선 전체 소스코드를 살펴보고 다음으로 주요 코드를 상세하게 살펴보겠습니다.
API 정보
- OpenStack Swift API : 2.15.1 (Pike)
- OpenStack Keystone V3 API : v3.8
인증 토큰 생성 코드
<?php
// 전송해야 할 설정값
$ncloud_accesskey = "네이버 클라우드 AccessKey";
$ncloud_secretkey = "네이버 클라우드 SecretKey";
$ncloud_domain_id = "Archive Storage 도메인 ID";
$ncloud_project_id = "Archive Storage 프로젝트 ID";
$api_server = "https://kr.archive.ncloudstorage.com:5000";
$api_url = "/v3/auth/tokens";
// http 호출 헤더값 설정
$http_header = array();
$http_header[0] = "Content-Type: application/json";
// 전송할 값들을 배열 형태로 저장한다
$postvars = [
"auth"=> [
"identity"=> [
"methods"=> [
"password"
],
"password"=> [
"user"=> [
"name"=> $ncloud_accesskey,
"password"=> $ncloud_secretkey,
"domain"=> [
"id"=> $ncloud_domain_id
]
]
]
],
"scope"=> [
"project"=> [
"id"=> $ncloud_project_id
]
]
]
];
// 배열 형태로 저장한 값들을 json 형태로 변환해서 전송
$json_portvars = json_encode($postvars);
// api 호출
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $api_server.$api_url);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_POST, TRUE); //POST 방식으로 호출
curl_setopt($ch, CURLOPT_HTTPHEADER, $http_header);
curl_setopt($ch, CURLOPT_HEADER, TRUE); //response에 header 값도 수신
curl_setopt($ch,CURLOPT_POSTFIELDS, $json_portvars);
$response = curl_exec($ch);
curl_close($ch);
if ($response)
{
// X-Subject-Token 토큰 값은 request body가 아닌 header로 전달되므로
// header를 분리해서 배열에 저장한다
$headers = array();
$header_text = substr($response, 0, strpos($response, "\r\n\r\n"));
foreach (explode("\r\n", $header_text) as $i => $line)
{
if ($i === 0)
{
$headers["http_code"] = $line;
}
else
{
list ($key, $value) = explode(": ", $line);
$headers[$key] = $value;
}
}
// 인증 토큰 확인
$x_auth_token = $headers["X-Subject-Token"];
echo($x_auth_token);
//var_dump($headers);
//echo("<hr>");
//var_dump($response);
}
else
{
echo "Curl error: " . curl_error($ch);
}
?>
코드 상세 설명
API 인증 Key 생성
네이버 클라우드 API 인증키는 [콘솔] - [서브 계정] - [서브 계정 세부 정보] - [Access Key]탭에서 Access Key ID와 Secret Key를 가져오셔야 하며, 아직 만들어진 Key가 없다면 새로 만드셔야 합니다.
API 인증키를 서브 계정으로 생성해야 하는 이유: 메인 계정은 클라우드 서비스의 최대 권한을 가지기 때문에 메인 계정으로 생성한 API도 메인 계정과 동일한 최대 권한을 가지게 됩니다. 그러므로 메인 계정으로 API 인증키를 생성하게 되면 이 Key가 유출되었을 때 심각한 문제가 생기기 때문에 반드시 서브 계정에서 API 인증키를 생성해야 합니다.
Archive Storage API 이용 정보
$ncloud_domain_id = "Archive Storage 도메인 ID";
$ncloud_project_id = "Archive Storage 프로젝트 ID";
Archive Storage API 이용을 위한 Domain ID와 Project ID는 [네이버 클라우드 포탈] - [Archive Storage]에서 [API 이용 정보 확인] 버튼을 클릭하면 확인할 수 있습니다.
[API 이용 정보 확인] 창에서 Domain ID와 Project ID를 확인하고, PHP 소스코드에 입력합니다.
API 서버와 URL 설정
$api_server = "https://kr.archive.ncloudstorage.com:5000";
$api_url = "/v3/auth/tokens";
Archive Storage API 서버와 토큰 생성을 위한 URL 정보는 위와 같습니다.
HTTP 호출 header 값 설정
$http_header = array();
$http_header[0] = "Content-Type: application/json";
HTTP header에는 json 형태로 호출한다는 것을 설정합니다.
전송할 값 설정
// 전송할 값들을 배열 형태로 저장
$postvars = [
"auth"=> [
"identity"=> [
"methods"=> [
"password"
],
"password"=> [
"user"=> [
"name"=> $ncloud_accesskey,
"password"=> $ncloud_secretkey,
"domain"=> [
"id"=> $ncloud_domain_id
]
]
]
],
"scope"=> [
"project"=> [
"id"=> $ncloud_project_id
]
]
]
];
// 배열 형태로 저장한 값들을 json 형태로 변환해서 전송
$json_portvars = json_encode($postvars);
네이버 클라우드 AccessKey, SecretKey, Archive Storage 도메인 ID, 프로젝트 ID를 전송하기 위해 지정된 형태의 배열로 저장한 후에 json 형태로 변환합니다. 물론 처음부터 json 형태로 저장해도 됩니다.
API 호출
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $api_server.$api_url);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_POST, TRUE); //POST 방식으로 호출
curl_setopt($ch, CURLOPT_HTTPHEADER, $http_header);
curl_setopt($ch, CURLOPT_HEADER, TRUE); //response에 header 값도 수신
curl_setopt($ch,CURLOPT_POSTFIELDS, $json_portvars);
$response = curl_exec($ch);
curl_close($ch);
이제 위에서 준비한 값들을 사용해서 API를 호출합니다.
curl_setopt($ch, CURLOPT_HEADER, TRUE); 는 Response에 body 뿐만 아니라 header 값도 수신하기 위해 설정합니다.
API 인증 토큰 분리
if ($response)
{
$headers = array();
$header_text = substr($response, 0, strpos($response, "\r\n\r\n"));
foreach (explode("\r\n", $header_text) as $i => $line)
{
if ($i === 0)
{
$headers["http_code"] = $line;
}
else
{
list ($key, $value) = explode(": ", $line);
$headers[$key] = $value;
}
}
// 인증 토큰 확인
$x_auth_token = $headers["X-Subject-Token"];
echo($x_auth_token);
//var_dump($headers);
//echo("<hr>");
//var_dump($response);
}
API 인증 토큰값은 X-Subject-Token이라는 이름으로 request body가 아닌 header로 전달되므로 header를 분리해서 배열에 저장합니다. 실제 전송되는 header 값은 아래와 같은 형태입니다.
HTTP/1.1 201 Created
Date: Thu, 11 Nov 2021 07:59:32 GMT
Server: Apache/2.4.6 (CentOS) OpenSSL/1.0.2k-fips mod_wsgi/3.4 Python/2.7.5
X-Subject-Token: gAAAAABhjM1lbeTW3Vq......중간 생략 ......txWYsWGrC1siPt8CE0rs_KgNMTQ
Vary: X-Auth-Token
x-openstack-request-id: req-1ce......중간 생략 ......a85eb5b
Content-Length: 1762
Content-Type: application/json
인증 토큰 유효 시간
API 인증 토큰의 유효 시간은 24시간이고 삭제 요청을 호출하면 삭제할 수 있습니다.
참고 URL
-
Archive Storage API 기본 가이드
https://api.ncloud-docs.com/docs/common-archivestorageapi-archivestorageapi -
OpenStack Keystone V3 API 가이드
https://docs.openstack.org/api-ref/identity/v3/
문서 업데이트 내역
날짜 | 내용 |
---|---|
2021-11-11 | 문서 최초 생성 |
2024-01-31 | API 인증키 생성 방법 안내 변경 |
2024-08-12 | API 인증키 생성 방법 안내 업데이트 |