Things take time

[Flutter] 네이버클라우드플랫폼 사용시 Signature Key얻을 때! 본문

Flutter

[Flutter] 네이버클라우드플랫폼 사용시 Signature Key얻을 때!

겸손할 겸 2020. 8. 6. 13:58

[네이버 클라우드 플랫폼의 SMS API]
https://apidocs.ncloud.com/ko/ai-application-service/sens/sms_v2/

 

SMS API v2 가이드 - API 참조서

기본 정보 API URL https://sens.apigw.ntruss.com/sms/v2 항목 Mandatory 설명 Content-Type Mandatory 요청 Body Content Type을 application/json으로 지정 (POST) x-ncp-apigw-timestamp Mandatory 1970년 1월 1일 00:00:00 협정 세계시(UTC)부��

apidocs.ncloud.com

SMS인증서비스는 네이버 클라우드도 있고, 해외전송까지 유용한 Twillio도 있고 다양한데, 그 중 네이버를 접할일이 있었다. 엄청 자세한건아니지만, 레퍼런스대로 해서 콘솔에서도 보내지고, Swagger에서도 보내지는건 확인했는데, 네이티브 쪽에서 보내지지 않는 문제 발생!!

 

보니, 자주할 수 밖에 없는 실수가 많더라. 단순히 함수 하나로 정리한다.

해당 시그니쳐 키는, SMS 뿐아니라 다른 네이버 클라우드 플랫폼 API에서 공통적으로 사용하니 알아두면 좋을것 같다. 레퍼런스에는 당연히(?) 다트가 없다.

 

 String getSignature(
      String serviceId, String timeStamp, String accessKey, String secretKey) {
    var space = " "; // one space
    var newLine = "\n"; // new line
    var method = "POST"; // method
    var url = "/sms/v2/services/$serviceId/messages";

    var buffer = new StringBuffer();
    buffer.write(method);
    buffer.write(space);
    buffer.write(url);
    buffer.write(newLine);
    buffer.write(timeStamp);
    buffer.write(newLine);
    buffer.write(accessKey);
    print(buffer.toString());

    /// signing key
    var key = utf8.encode(secretKey);
    var signingKey = new Hmac(sha256, key);

    var bytes = utf8.encode(buffer.toString());
    var digest = signingKey.convert(bytes);
    String signatureKey = base64.encode(digest.bytes);
    return signatureKey;
  }

1.  serviceID: 클라우드 플랫폼 콘솔에서 사용할 프로젝트를 생성하면 볼 수 있는 키 값이다.(옆 SecretKey는 사용하지 않으므로, 헷갈리지 말 것)

2. timeStamp : 다트에서는 아래와 같이 사용한다.

(DateTime.now().millisecondsSinceEpoch).toString();

3. accessKey & secretKey : 클라우드 플랫폼 메인에서 로그인 후, 마이페이지 내 API 키 관리에 있는 키 값이다.

 

중요한 것

1. url을 예제 그대로 "/photos/puppy.jpg?query1=&query2"; 이렇게 써버리면.. 안된다. 사용할 api의 주소인데, https://example.apigw.ntruss.com/이 주소 이 후의 값을 넣어야한다. example은 사용 api에 따라 다르며, 난 SMS를 예제로 들어서 POST https://sens.apigw.ntruss.com/sms/v2/services/{serviceId}/messages 이 부분중 com/이후의 값을 쓴 것이다. 즉, "/sms/v2/services/$serviceId/messages"; 

 

2.  method를 보면 GET, POST가 있는데 실제 요청하는 API가 POST면, 시그니처를 얻는 method도 그 값에 맞춰야한다.

 

3. serviceID는 URLEncode를 해야한다. 즉, 저 위의 serviceId는 실제 아래와 같다.

Uri.encodeComponent('ncp:sms:kr:숫자:등록프로젝트명');

 

이 것만 조심하면 다 잘될 것이다!