2019/11/22

PHP SMS APIサービスのテスト Twilio送信内容の確認

昨日の投稿の続き

送った内容をコンソールでなく、ブラウザ上で確認したい。
検索等の実装も可能なようだ。
先ずは、一覧を表示できないと話にならないので、サンプルを作成してみる。

PHPサンプル list_messages.php

<?php

require("/autoloadが置いてあるでぃてくとりをフルパスで指定/autoload.php" );
use Twilio\Rest\Client;

//定義
$sid    = "アカウントのSID";
$token  = "アカウントのAUTHTOKEN";
$twilio = new Client($sid, $token);

$messages = $twilio->messages
                   ->read(array(), 20);//取り合えず20個まで

foreach ($messages as $record) {
    print($record->to);//toで送信先の番号
    print($record->body);//送信メッセージの内容
}

?>

送信結果を取りたいのであれば、

body
date_sent
status
to
body

で十分な気がする。
取得できる配列は以下のようだ。
JSON APIの記載があった。


"account_sid": "ACXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
"api_version": "2010-04-01",
"body": "testing",
"date_created": "Fri, 24 May 2019 17:18:27 +0000",
"date_sent": "Fri, 24 May 2019 17:18:28 +0000",
"date_updated": "Fri, 24 May 2019 17:18:28 +0000",
"direction": "outbound-api",
"error_code": 30007,
"error_message": "Carrier violation",
"from": "+12019235161",
"messaging_service_sid": "MGXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
"num_media": "0",
"num_segments": "1",
"price": "-0.00750",
"price_unit": "USD",
"sid": "MMXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
"status": "sent",
"subresource_uris": {
"media": "/2010-04-01/Accounts/ACXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/Messages/SMb7c0a2ce80504485a6f653a7110836f5/Media.json",
"feedback": "/2010-04-01/Accounts/ACXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/Messages/SMb7c0a2ce80504485a6f653a7110836f5/Feedback.json"
},
"to": "+18182008801",
"uri": "/2010-04-01/Accounts/ACXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/Messages/SMb7c0a2ce80504485a6f653a7110836f5.json"

2019/11/21

PHP SMS APIサービスのテスト Twilio 登録から送信テスト完了まで

SMS APIサービスの実装テストにあたりTwilioさんのトライアル版を試してみた。

アカウント取得
ブラウザがchromeでないと上手くいかなかった。
https://jp.twilio.com/try-twilio/kddi-web
2019年に業務提携があったようで、トライアルアカウント取得のページが
複数存在するようだ。ここで、取得できた。

性、名、メールアドレス、パスワード(14文字以上)
を入力してトライアルアカウント作成をすると
ログインする。
その後、2段階式の認証が入り、SMSが有効な電話番号を求めてくるので、
入力して送信すると、認証数列がSMSに届くので、
それを入力して登録完了。

PHPへの実装

composerにてtwilio-phpのライブラリを取得

任意のフォルダにて
$ composer require twilio/sdk
処理されて
 Generating autoload files

サンプルプログラム sms_send.php

<?php

require("/autoloadが置いてあるでぃてくとりをフルパスで指定/autoload.php" );
use Twilio\Rest\Client;

$account_sid = 'ダッシュボードのアカウントSIDを記載';
$auth_token = 'ダッシュボードのAUTH TOKENを記載';
$twilio_number = '+120********';//取得したTwilioの電話番号テストは+120のみ許容

$client = new Client($account_sid, $auth_token);
$client->messages->create(
    '+8190********',//090の場合日本は+81なので090が+8190となる。トライアル時は登録した電話番号のみ許容される。
    [
        'from' => $twilio_number,
        'body' => 'SMS送信テスト'
    ]
);

 ?>

実行してみる
$ php sms_send.php

PHP Fatal error:  Uncaught exception 'Twilio\Exceptions\RestException' with message '[HTTP 426] Unable to create record: Upgrade Required' in /var/www/html/vendor/twilio/sdk/Twilio/Version.php:85
Stack trace:
#0 /var/www/html/vendor/twilio/sdk/Twilio/Version.php(219): Twilio\Version->exception(Object(Twilio\Http\Response), 'Unable to creat...')
#1 /var/www/html/vendor/twilio/sdk/Twilio/Rest/Api/V2010/Account/MessageList.php(70): Twilio\Version->create('POST', '/Accounts/AC5c4...', Array, Array)
#2 /var/www/html/maildistributer/test/twilio_test.php(20): Twilio\Rest\Api\V2010\Account\MessageList->create('+8190********', Array)
#3 {main}
  thrown in /var/www/html/vendor/twilio/sdk/Twilio/Version.php on line 85

ん?

426エラーが返ってきたので、
twilioの仕様を確認したところ、tls1.2を強要とのこと
 
phpinfoで知らべたところ稼働中のサーバは
opensslは1.2対応していたが、
cURLのNSSが/3.15でTLS1.2に対応していなかった。(3.283.19.1-6以降以上を要求らしい)

手っとり早い方法を探したところ、NSS/3.28以上のパッケージをインストールしてから
curlをアップデートするのが最速とのことだったので、

# yum install -y https://rpms.southbridge.ru/rhel7/stable/x86_64/southbridge-stable-release-1.0-el7.southbridge.noarch.rpm
 
# yum update curl
依存処理に結構時間がかかったが、何とか処理完了

# systemctl restart httpd.service
phpを再起動
 これも、壊したか?と不安になる位 えらく時間がかかった・・・。

再度テスト
$ php sms_send.php

届いた!

登録から送信完了まで作業時間が約1時間半だった。

2018-9月にTLS1.3がリリースされたので、
近いうちにTLS1.3(openssl 1.1.1)にアップデートが必要になるものと
推測される。
なにやら攻撃を受ける可能性があるなどの情報もありもう少し様子見しようかな
と思っているが、そろそろ、PHPも7.2に引き上げが必要だろう。
動作確認とか大変だなぁ

2019/11/14

CSPRでの乱数生成 (暗号論的疑似乱数生成関数)

この度、セキュリティポリシーの高い
パスワードの自動生成が必要になり、
疑似乱数生成(PR)によりパスワードの生成をしようとしたころ、
安全な乱数でないと駄目です。とNGをもらった。
安全な乱数なんて量子コンピュータでもないと出来ないよ~~
とか、
エントロピーの無駄使いだ!!
とか言っても解決しないので、簡単な方向を模索してみる。

稼働サーバのPHPが5.4なので、当初randメソッドやmt_randメソッドを
SHA256で包括して、SEEDをハッシュ値で生成するから
疑似じゃないでしょ?で行こう思っていたが、
駄目っぽい雰囲気だったので、もう少し調べてみたところ、
PHP5.4でもライブラリを実装するとPHP7からの
CSPRNGである「random_int」メソッドが使えたので、オボエガキ。

ライブラリは、いつものGitHub様から取得
公式からもリンクされるという素晴らしさ!!
https://github.com/paragonie/random_compat

適宜配置

実際のソース
<?php
//ライブラリ読み込み
require_once "./php_lib/random.php";
// 利用可能な文字列の指定
$chars = 'ABCDEFGHIJLKMNOPQRSTUVWXYZ0123456789';
// 変数初期化
$passwd = '';
// ランダムに文字列を生成(12文字)
for ($i = 0; $i < 12; $i++) {
  $passwd .= $chars[random_int(0, 35)];//$charsの文字数を修正時は、必ず揃え、35を修正する。
  }
//無限ループ注意!! 数字のみ英大文字のみを許容しない
  while ( (preg_match('/^[0-9]+$/', $passwd) || preg_match('/^[A-Z]+$/', $passwd)) ){
      $passwd = '';//一旦 $passwd をまっさらにする
    for ($i = 0; $i < 12; $i++) {
     $passwd .= $chars[random_int(0, 35)];//条件充足までループ
      }
  }
//文字列表示
echo $passwd;
?>

こんな感じ

やっぱり、困ったら一人で頑張らないで、公式サイトのメソッドを見るべきだ
と感じた。