forked from baron/baron-sso
SMS 기능 연동 설정 및 테스트 추가
This commit is contained in:
@@ -25,3 +25,9 @@ COOKIE_SECRET=super-secret-key-must-be-32-bytes!
|
||||
# --- Frontend Configuration ---
|
||||
# Descope Project ID (Required for Auth)
|
||||
DESCOPE_PROJECT_ID=P2t...your_descope_project_id
|
||||
|
||||
# --- Naver Cloud Services ---
|
||||
NAVER_CLOUD_ACCESS_KEY=ncp_iam_...
|
||||
NAVER_CLOUD_SECRET_KEY=ncp_iam_...
|
||||
NAVER_CLOUD_SERVICE_ID=ncp:sms:kr:...:...
|
||||
NAVER_SENDER_PHONE_NUMBER=...
|
||||
|
||||
@@ -6,6 +6,8 @@ services:
|
||||
context: ./backend
|
||||
dockerfile: Dockerfile
|
||||
container_name: baron_backend
|
||||
env_file:
|
||||
- .env
|
||||
environment:
|
||||
- APP_ENV=${APP_ENV:-development}
|
||||
- COOKIE_SECRET=${COOKIE_SECRET}
|
||||
|
||||
110
test/test_sms.py
Normal file
110
test/test_sms.py
Normal file
@@ -0,0 +1,110 @@
|
||||
# python3 test/test_sms.py 01027774695
|
||||
import os
|
||||
import requests
|
||||
import time
|
||||
import hmac
|
||||
import hashlib
|
||||
import base64
|
||||
import json
|
||||
import sys
|
||||
from dotenv import load_dotenv
|
||||
|
||||
def get_env_variable(key, env_file):
|
||||
"""Reads an environment variable from a given .env file."""
|
||||
with open(env_file, 'r') as f:
|
||||
for line in f:
|
||||
line = line.strip()
|
||||
if line and not line.startswith('#'):
|
||||
k, v = line.split('=', 1)
|
||||
if k == key:
|
||||
return v.strip()
|
||||
return None
|
||||
|
||||
def main():
|
||||
if len(sys.argv) < 2:
|
||||
print("Usage: python test/test_sms.py <recipient_phone_number>")
|
||||
sys.exit(1)
|
||||
|
||||
recipient_phone = sys.argv[1]
|
||||
|
||||
# Load environment variables from .env or .env.sample
|
||||
env_path = os.path.join(os.getcwd(), '.env')
|
||||
if not os.path.exists(env_path):
|
||||
print("Info: .env file not found. Using .env.sample as a fallback.")
|
||||
env_path = os.path.join(os.getcwd(), '.env.sample')
|
||||
|
||||
if not os.path.exists(env_path):
|
||||
print("Error: No configuration file found (.env or .env.sample).")
|
||||
sys.exit(1)
|
||||
|
||||
access_key = get_env_variable("NAVER_CLOUD_ACCESS_KEY", env_path)
|
||||
secret_key = get_env_variable("NAVER_CLOUD_SECRET_KEY", env_path)
|
||||
service_id = get_env_variable("NAVER_CLOUD_SERVICE_ID", env_path)
|
||||
sender_phone = get_env_variable("NAVER_SENDER_PHONE_NUMBER", env_path)
|
||||
|
||||
if not all([access_key, secret_key, service_id, sender_phone]):
|
||||
print(f"Error: One or more required environment variables are missing in {env_path}.")
|
||||
sys.exit(1)
|
||||
|
||||
timestamp = str(int(time.time() * 1000))
|
||||
api_path = f"/sms/v2/services/{service_id}/messages"
|
||||
api_url = f"https://sens.apigw.ntruss.com{api_path}"
|
||||
|
||||
# Create the signature for the API request
|
||||
message = f"POST {api_path}\n{timestamp}\n{access_key}"
|
||||
h = hmac.new(bytes(secret_key, 'UTF-8'), bytes(message, 'UTF-8'), hashlib.sha256)
|
||||
signature = base64.b64encode(h.digest()).decode('UTF-8')
|
||||
|
||||
# Construct the JSON request body
|
||||
json_body = {
|
||||
"type": "SMS",
|
||||
"contentType": "COMM",
|
||||
"countryCode": "82",
|
||||
"from": sender_phone,
|
||||
"content": "[Baron SSO] Test message from Python script.",
|
||||
"messages": [
|
||||
{
|
||||
"to": recipient_phone
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
headers = {
|
||||
"Content-Type": "application/json; charset=utf-8",
|
||||
"x-ncp-apigw-timestamp": timestamp,
|
||||
"x-ncp-iam-access-key": access_key,
|
||||
"x-ncp-apigw-signature-v2": signature
|
||||
}
|
||||
|
||||
print("========================================")
|
||||
print(" Attempting to send SMS via SENS API (Python)")
|
||||
print("========================================")
|
||||
print(f" Recipient: {recipient_phone}")
|
||||
print(f" Timestamp: {timestamp}")
|
||||
print(f" Service ID: {service_id}")
|
||||
print("========================================")
|
||||
print()
|
||||
|
||||
try:
|
||||
response = requests.post(api_url, headers=headers, json=json_body)
|
||||
response.raise_for_status() # Raise an exception for HTTP errors
|
||||
print("API Response:")
|
||||
print(json.dumps(response.json(), indent=2, ensure_ascii=False))
|
||||
except requests.exceptions.RequestException as e:
|
||||
print(f"Request failed: {e}")
|
||||
if hasattr(e, 'response') and e.response is not None:
|
||||
print("API Error Response:")
|
||||
try:
|
||||
print(json.dumps(e.response.json(), indent=2, ensure_ascii=False))
|
||||
except json.JSONDecodeError:
|
||||
print(e.response.text)
|
||||
except Exception as e:
|
||||
print(f"An unexpected error occurred: {e}")
|
||||
|
||||
print()
|
||||
print("========================================")
|
||||
print(" Request complete.")
|
||||
print("========================================")
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user