LINE Messaging API에서 X-Line-Signature 서명 확인 (AzureFunctions/Node.js)
12408 단어 LineAzureFunctionsbotAzurelinebot
소개
마지막으로 Azure Functions를 사용하여 LINE Messaging API를 사용하여 bot를 만들었습니다.
Azure Functions를 사용하여 비동기 처리 LINE BOT 만들기
마지막 잔여 작업으로 다음 내용이 남았습니다.
紹介したコードは最小限のロジックのみ実装していてセキュリティやエラー処理などは考慮していません。
例えば、LINEサーバーからのメッセージであることの検証などが不足しています。
이번에는 메시지의 서명 검증을 실시해 보겠습니다.
서명 검증 정보
LINE developers의 API Reference에는 다음과 같은 설명이 있습니다.
Webhook Authentication
X-Line-Signature Request Headerに入っているSignatureを検証することによって、
リクエストがLINE Platformから送信されたものであることを確認する必要があります。
検証は以下の手順で行います。
1. Channel Secretを秘密鍵として、HMAC-SHA256アルゴリズムによりRequest Bodyのダイジェスト値を得る。
2. ダイジェスト値をBASE64エンコードした文字列が、Request Headerに付与されたSignatureと一致することを確認する。
즉, 준비한 Webhook에 대한 액세스가 정말로 LINE의 서버에서 그것인지 확인해야합니다.
검증 순서도 기재되어 있으므로 그대로 구현해 봅니다.
구현
웹을 검색할 때 유사한 구현을 수행하는 예가있었습니다.
【탈 수밖에 없다】 AWS Lambda와 LINE BOT API로 RSS를 통지한다 【이 빅 웨이 ry】 | Developers.IO
옛날 LINE API를 사용할 때 인증을위한 코드처럼 보이지만,하고있는 것은 거의 동일합니다. 위의 사이트를 참고로 구현한 것이 이쪽입니다.
var crypto = require("crypto");
function validate_signature(signature, body)
{
const LINE_CHANNEL_SECRET = process.env.LINE_CHANNEL_SECRET;
return signature == crypto.createHmac('sha256', LINE_CHANNEL_SECRET).update(Buffer.from(JSON.stringify(body))).digest('base64');
}
module.exports = function(context, req) {
context.log('Node.js HTTP trigger function processed a request. RequestUri=%s', req.originalUrl);
if (validate_signature(req.headers['x-line-signature'], req.body)) {
context.bindings.outputQueueItem = req.body;
}
else {
context.log('fail to validate signature');
}
context.res = { body : "" };
context.done();
};
yorifuji/azure-functions-line-signature-bot
개별적으로 살펴 보겠습니다.
module.exports = function(context, req) {
context.log('Node.js HTTP trigger function processed a request. RequestUri=%s', req.originalUrl);
if (validate_signature(req.headers['x-line-signature'], req.body)) {
context.bindings.outputQueueItem = req.body;
}
else {
context.log('fail to validate signature');
}
context.res = { body : "" };
context.done();
};
우선 LINE 서버로부터의 요청이 도착하면, 이 함수가 실행됩니다.
서명 검증을 위해 새로 추가한 것은 이 코드입니다.
if (validate_signature(req.headers['x-line-signature'], req.body)) {
context.bindings.outputQueueItem = req.body;
}
else {
context.log('fail to validate signature');
}
validate_signature에 req.headers['x-line-signature']와 req.body를 전달합니다.
req.headers['x-line-signature']에는 LINE 서버에서 부여한 Signature가 들어 있습니다.
req.body는 Request Body 자체입니다 (JSON).
다음으로 validate_signature의 구현은 여기입니다.
var crypto = require("crypto");
function validate_signature(signature, body) {
const LINE_CHANNEL_SECRET = process.env.LINE_CHANNEL_SECRET;
return signature == crypto.createHmac('sha256', LINE_CHANNEL_SECRET).update(Buffer.from(JSON.stringify(body))).digest('base64');
}
선두의 var crypto... 는 Node.js의 crypto를 이용하기 위한 선언입니다. HMAC-SHA256를 구하는데 이용합니다.
validate_signature의 시작 부분에서 LINE_CHANNEL_SECRET을 환경 변수 (process.env)에서 읽습니다.
const LINE_CHANNEL_SECRET = process.env.LINE_CHANNEL_SECRET;
이것은 HMAC-SHA256의 개인 키로 사용됩니다. LINE_CHANNEL_SECRET의 값은 LINE Developers의 관리 화면에 표시되므로 그곳에서 복사해 둡니다.
환경 변수에서 읽는 이유는 GitHub에서 코드를 관리하고 직접 Azure에 배포하는 작업을 수행하기 때문입니다.
서명 확인 절차는 crypto.createHmac에서 생성한 인스턴스에 대해 update 함수를 사용하여 body 내용을 설정하는 것입니다. 마지막으로 BASE64로 변환한 값을 출력합니다.
출력한 값과 signature가 일치하면 서명 검증에 성공합니다.
샘플 코드
GitHub는 여기입니다. yorifuji/azure-functions-line-signature-bot
이전과 마찬가지로 Azure Functions에서 "계속적 통합 구성"을 설정한 분은 리포지토리를 여기로 전환하면 소스 코드를 통째로 전환할 수 있습니다.
덧붙여 서명 검증을 위해서 다음의 키를 환경 변수에 등록할 필요가 있습니다.
키:
LINE_CHANNEL_SECRET
값:
LINE developers의 Channel Secret 값
요약
LINE Messaging API에서 X-Line-Signature의 서명 검증을 실시했습니다. 내용에 잘못이 있으면 코멘트 받을 수 있으면 다행입니다.
약속
紹介したコードは最小限のロジックのみ実装していてセキュリティやエラー処理などは考慮していません。
例えば、LINEサーバーからのメッセージであることの検証などが不足しています。
LINE developers의 API Reference에는 다음과 같은 설명이 있습니다.
Webhook Authentication
X-Line-Signature Request Headerに入っているSignatureを検証することによって、
リクエストがLINE Platformから送信されたものであることを確認する必要があります。
検証は以下の手順で行います。
1. Channel Secretを秘密鍵として、HMAC-SHA256アルゴリズムによりRequest Bodyのダイジェスト値を得る。
2. ダイジェスト値をBASE64エンコードした文字列が、Request Headerに付与されたSignatureと一致することを確認する。
즉, 준비한 Webhook에 대한 액세스가 정말로 LINE의 서버에서 그것인지 확인해야합니다.
검증 순서도 기재되어 있으므로 그대로 구현해 봅니다.
구현
웹을 검색할 때 유사한 구현을 수행하는 예가있었습니다.
【탈 수밖에 없다】 AWS Lambda와 LINE BOT API로 RSS를 통지한다 【이 빅 웨이 ry】 | Developers.IO
옛날 LINE API를 사용할 때 인증을위한 코드처럼 보이지만,하고있는 것은 거의 동일합니다. 위의 사이트를 참고로 구현한 것이 이쪽입니다.
var crypto = require("crypto");
function validate_signature(signature, body)
{
const LINE_CHANNEL_SECRET = process.env.LINE_CHANNEL_SECRET;
return signature == crypto.createHmac('sha256', LINE_CHANNEL_SECRET).update(Buffer.from(JSON.stringify(body))).digest('base64');
}
module.exports = function(context, req) {
context.log('Node.js HTTP trigger function processed a request. RequestUri=%s', req.originalUrl);
if (validate_signature(req.headers['x-line-signature'], req.body)) {
context.bindings.outputQueueItem = req.body;
}
else {
context.log('fail to validate signature');
}
context.res = { body : "" };
context.done();
};
yorifuji/azure-functions-line-signature-bot
개별적으로 살펴 보겠습니다.
module.exports = function(context, req) {
context.log('Node.js HTTP trigger function processed a request. RequestUri=%s', req.originalUrl);
if (validate_signature(req.headers['x-line-signature'], req.body)) {
context.bindings.outputQueueItem = req.body;
}
else {
context.log('fail to validate signature');
}
context.res = { body : "" };
context.done();
};
우선 LINE 서버로부터의 요청이 도착하면, 이 함수가 실행됩니다.
서명 검증을 위해 새로 추가한 것은 이 코드입니다.
if (validate_signature(req.headers['x-line-signature'], req.body)) {
context.bindings.outputQueueItem = req.body;
}
else {
context.log('fail to validate signature');
}
validate_signature에 req.headers['x-line-signature']와 req.body를 전달합니다.
req.headers['x-line-signature']에는 LINE 서버에서 부여한 Signature가 들어 있습니다.
req.body는 Request Body 자체입니다 (JSON).
다음으로 validate_signature의 구현은 여기입니다.
var crypto = require("crypto");
function validate_signature(signature, body) {
const LINE_CHANNEL_SECRET = process.env.LINE_CHANNEL_SECRET;
return signature == crypto.createHmac('sha256', LINE_CHANNEL_SECRET).update(Buffer.from(JSON.stringify(body))).digest('base64');
}
선두의 var crypto... 는 Node.js의 crypto를 이용하기 위한 선언입니다. HMAC-SHA256를 구하는데 이용합니다.
validate_signature의 시작 부분에서 LINE_CHANNEL_SECRET을 환경 변수 (process.env)에서 읽습니다.
const LINE_CHANNEL_SECRET = process.env.LINE_CHANNEL_SECRET;
이것은 HMAC-SHA256의 개인 키로 사용됩니다. LINE_CHANNEL_SECRET의 값은 LINE Developers의 관리 화면에 표시되므로 그곳에서 복사해 둡니다.
환경 변수에서 읽는 이유는 GitHub에서 코드를 관리하고 직접 Azure에 배포하는 작업을 수행하기 때문입니다.
서명 확인 절차는 crypto.createHmac에서 생성한 인스턴스에 대해 update 함수를 사용하여 body 내용을 설정하는 것입니다. 마지막으로 BASE64로 변환한 값을 출력합니다.
출력한 값과 signature가 일치하면 서명 검증에 성공합니다.
샘플 코드
GitHub는 여기입니다. yorifuji/azure-functions-line-signature-bot
이전과 마찬가지로 Azure Functions에서 "계속적 통합 구성"을 설정한 분은 리포지토리를 여기로 전환하면 소스 코드를 통째로 전환할 수 있습니다.
덧붙여 서명 검증을 위해서 다음의 키를 환경 변수에 등록할 필요가 있습니다.
키:
LINE_CHANNEL_SECRET
값:
LINE developers의 Channel Secret 값
요약
LINE Messaging API에서 X-Line-Signature의 서명 검증을 실시했습니다. 내용에 잘못이 있으면 코멘트 받을 수 있으면 다행입니다.
약속
var crypto = require("crypto");
function validate_signature(signature, body)
{
const LINE_CHANNEL_SECRET = process.env.LINE_CHANNEL_SECRET;
return signature == crypto.createHmac('sha256', LINE_CHANNEL_SECRET).update(Buffer.from(JSON.stringify(body))).digest('base64');
}
module.exports = function(context, req) {
context.log('Node.js HTTP trigger function processed a request. RequestUri=%s', req.originalUrl);
if (validate_signature(req.headers['x-line-signature'], req.body)) {
context.bindings.outputQueueItem = req.body;
}
else {
context.log('fail to validate signature');
}
context.res = { body : "" };
context.done();
};
module.exports = function(context, req) {
context.log('Node.js HTTP trigger function processed a request. RequestUri=%s', req.originalUrl);
if (validate_signature(req.headers['x-line-signature'], req.body)) {
context.bindings.outputQueueItem = req.body;
}
else {
context.log('fail to validate signature');
}
context.res = { body : "" };
context.done();
};
if (validate_signature(req.headers['x-line-signature'], req.body)) {
context.bindings.outputQueueItem = req.body;
}
else {
context.log('fail to validate signature');
}
var crypto = require("crypto");
function validate_signature(signature, body) {
const LINE_CHANNEL_SECRET = process.env.LINE_CHANNEL_SECRET;
return signature == crypto.createHmac('sha256', LINE_CHANNEL_SECRET).update(Buffer.from(JSON.stringify(body))).digest('base64');
}
const LINE_CHANNEL_SECRET = process.env.LINE_CHANNEL_SECRET;
GitHub는 여기입니다. yorifuji/azure-functions-line-signature-bot
이전과 마찬가지로 Azure Functions에서 "계속적 통합 구성"을 설정한 분은 리포지토리를 여기로 전환하면 소스 코드를 통째로 전환할 수 있습니다.
덧붙여 서명 검증을 위해서 다음의 키를 환경 변수에 등록할 필요가 있습니다.
키:
LINE_CHANNEL_SECRET
값:
LINE developers의 Channel Secret 값
요약
LINE Messaging API에서 X-Line-Signature의 서명 검증을 실시했습니다. 내용에 잘못이 있으면 코멘트 받을 수 있으면 다행입니다.
약속
Reference
이 문제에 관하여(LINE Messaging API에서 X-Line-Signature 서명 확인 (AzureFunctions/Node.js)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/yorifuji/items/71e31baf896adb69f567텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)