【驚愕】めちゃめちゃ簡単にSMS認証（電話番号認証）ができるAPIを発見したので作ってみた

## SMS認証って難しいものだと思ってた
LineやInstagramで利用開始するときに、自分の電話番号を入力するとSMSが送信されて、そこに書いてあるパスワードを入力するとサービスが利用できるようになるが、それがSMS認証。
なんか複雑そうだから興味は前からあったものの、トライするのを躊躇してた。

1,SMS送信機能
2,パスワード生成機能
3,認証機能
を作らなきゃいけない。

優秀エンジニアじゃない自分には無理


## 簡単にSMS認証ができるAPIを発見
以前書いた記事でCM.comという会社のAPIが結構簡単で、単価が安いという話をしたんだが

https://qiita.com/TomTomoya/items/586dd4f5a48ce29d53f1
[CM.comのSMS送信APIでSMSを送信してみた]

その会社のサイトをみていたら、SMS OTPというサービスがあってどうやら一つのAPIで丸っとSMS認証ができるらしい。
これなら自分にもいけると思って、実際作ってみた

価格も通常のSMS配信と同じで8円ほど。価格も安いし、会社もオランダのサッカー一部リーグのオフィシャルスポンサーをしているようなので安心感があるので、サクッと自社サービスにSMS認証を取り入れたい方にはかなり重宝する感じだ。
また、後述するが支払いもクレジットカードでOKなのも魅力の一つ。導入実装までの時間が本当にかからないのはありがたい。

CM.com website: https://www.cm.com/ja-jp/sms/sms-gateway-api/

## 事前準備 (2022年11月更新）

1.CM.comのサイトからアカウント作る　https://www.cm.com/ja-jp/sms/sms-gateway-api/
（９/2更新※現在自由にアカウントは作れない。問い合わせしてアカウントを作ってもらう事になる）
(2022年11月更新* 右上の今すぐ利用するボタンから企業名など登録できる様になった）
 　　フリーメールで登録だとトークンが発行されないので、企業名でやるとよし
2.クレジットカードでチャージ（後払いも対応してくれるそうだが、別途連絡が必要）
3.プロダクトトークンを取得（管理画面のメッセージングゲートウェイをクリック）
4.いざ開発

2022年11月更新
かなり利用しやすくなった印象。営業の人を介さず自分で利用開始できるのが
エンジニアにとっては嬉しい。
自分で登録して企業名、アドレスなど必要な情報を登録すると
アカウントを作成できる。ログインをしてトークンを取得するだけでもう始められる環境が整っている。
後払いは引き続き連絡が必要だが、まずは少額のクレジットカードで始めるのが早くておすすめ

##サンプルコード

```cs
using (var client = new HttpClient())
{
    // プロダクトトークンはここから確認する: https://gateway.cmtelecom.com
    client.DefaultRequestHeaders.Add("X-CM-ProductToken", "ここにプロダクトトークンを入力");

    var request = JsonConvert.SerializeObject(new {
            length = 5,　//パスワードの長さを設定
            expiry = 120,//パスワードの制限時間を設定
            sender = "送信者名をここに入力",// 送信者名に関しては下記＊１を確認
            recipient = "ここに電話番号",
　　　　　　//+81と、頭の0をのぞいた電話番号　例+819011112222
            message = "パスコードは {code} です。",
        }
   );

   var content = new StringContent(request, Encoding.UTF8, "application/json");
   var response = await client.PostAsync("https://api.cmtelecom.com/v1.0/otp/generate", content);
   response.EnsureSuccessStatusCode();
   var generateOtpResponse = JsonConvert.DeserializeObject<GenerateOtpResponse>(await response.Content.ReadAsStringAsync());

```

認証用のリクエスト


```cs
Console.Write("Please enter the received code: ");
var code = Console.ReadLine();

request = JsonConvert.SerializeObject(new {generateOtpResponse.id, code});
content = new StringContent(request, Encoding.UTF8, "application/json");
response = await client.PostAsync("https://api.cmtelecom.com/v1.0/otp/verify", content);
response.EnsureSuccessStatusCode();

var verifyOtpResponse = JsonConvert.DeserializeObject<VerifyOtpResponse>(await response.Content.ReadAsStringAsync());
if (verifyOtpResponse.valid)
{
    Console.WriteLine("Code is OK.");
}
else
{
    Console.WriteLine("Code is invalid!");
}
    
```
##Github

ここのを参考にした。
https://github.com/cmdotcom/text-api-publications/tree/master/Qiita-2018/OtpSample

##仕様書
https://docs.cmtelecom.com/one-time-passwords-otp/v1.0
これを参考にした。
仕様書がオープンになっているのも便利
仕様書にサンプルもあるので、わからなくても大丈夫

##感想
実際やってみて、パスワード生成や認証の部分が本当にAPIに含まれているのでとっても便利だった。
別の記事でも書いたが、送信者名がアルファベットから始まる英数字に設定するのと、送信先の電話番号を国番号から入力(+81に電話番号の最初の０をのぞいた番号を入れる）するのに少し手間がかかったが、
わからない場合でも電話やメールで質問するとすぐに連絡をくれ、丁寧に教えてくれるのであまり得意ではない自分にもわかりやすかった。


##2019/1/21追加
このCM.comのサービスは基本的には企業向けらしいが、個人利用でもサポートに問い合わせると利用ができるらしいので、個人で利用したい人はサポートに連絡するのをおすすめする

##2019/5/29追加
以前は自由にウェブサイトからアカウントが作れたが、現在はウェブサイトから問い合わせをして、アカウントを作成してもらう形式に変更されている。スパム対策なのではないかと思うが、興味ある人は問い合わせを。
→2022/11 自分でアカウントを作って始められる形に修正されていた。すぐに始めたい人や面倒な営業とのコミュニケーションを省きたい人には非常に便利。
ウェブページ右の「今から利用する」から始める

##2021/7/6追加
送信者名をアルファベットか電話番号か選べるらしく、サービスによって使い分けた。
それぞれのメリットデメリットは
アルファベット：とにかくわかりやすいのがメリット、ユーザーから電話がかかってこないのもいい。ただ若干到達率は落ちる模様
電話番号：メリットは到達率が２,3パーセント高い印象。デメリットはソフトバンクだけ好きな電話番号に設定できないので統一感がない