【AWS】LambdaでLINE notifyのOAuth2トークン発行してみた【LINE】
この記事は
AWS LambdaとServerless Advent Calendar 2021
の7日目です。
6日目は@horit0123さんのこちらの記事でした。
qiita.com
SAMは未経験なのですが、興味がわいてきました。
今度試してみたいと思います!
改めましてこんにちは!nomurabbitです。
LambdaでLINE notifyの第二弾として、
OAuth2を使ってトークン発行する方法を
紹介します。
ユーザーの皆さんが通知を許可する手続きを
簡略化できますね!
OAuth2の処理の流れ
今回の処理の流れはこんな感じです。
ユーザーからの
LINEに通知してよ!
というHTTPリクエストをトリガーとして、
それを受けたAPIその1が
じゃあLINEにリダイレクトするから
認証&認可よろしく!
という手続きから処理が始まります。
リダイレクトの際にLINE notify APIとの間で
パラメータをやりとりするところがポイントです。
パラメータの詳細は公式ドキュメントをどうぞ!
notify-bot.line.me
ソースコード
APIその1、その2それぞれについて、
ソースコードのポイントを紹介します。
APIその1
private string LineNotifyRedirect() { try { string returnString = ""; string client_id = "管理画面から取得してね!"; string redirect_uri = "API2のURLを指定してね!"; string state = "LINE notify APIからAPI2にリダイレクトされるときに渡してくれるパラメータだよ。送信元の認証に使えるかも!"; var parameters = new Dictionary<string, string>() { { "response_type", "code" }, { "client_id" , client_id }, { "redirect_uri" , redirect_uri }, { "scope" , "notify" }, { "state" , state }, }; string lineNotifyRequestString = new FormUrlEncodedContent(parameters).ReadAsStringAsync().Result; returnString = "https://notify-bot.line.me/oauth/authorize?" + lineNotifyRequestString; return returnString; } catch (System.Exception e) { throw e; }
APIその1にアクセスしてくれたユーザーに
LINE notify APIへリダイレクトしてもらう必要があります。
そのため、APIその1のレスポンスコードは
302(リダイレクト)です。
また、レスポンスヘッダーにLocationキーの値として
上記LineNotifyRedirect()の戻り値を
指定する必要があります。
実際に作成したAPIをユーザーが叩くと
このような画面が表示されます。
APIその2
private async Task<string> LineNotifyRedirect(string code) { try { string responseContent = ""; HttpRequestMessage request = new HttpRequestMessage(); request.RequestUri = new Uri("https://notify-bot.line.me/oauth/token"); request.Method = HttpMethod.Post; string redirect_uri = "API2のURLを指定してね!"; string client_id = "管理画面から取得してね!"; string client_secret = "管理画面から取得してね!"; var parameters = new Dictionary<string, string>() { { "grant_type" , "authorization_code" }, { "code" , code }, { "redirect_uri" , redirect_uri }, { "client_id" , client_id }, { "client_secret", client_secret }, }; string lineNotifyRequestString = new FormUrlEncodedContent(parameters).ReadAsStringAsync().Result; request.Content = new System.Net.Http.StringContent(lineNotifyRequestString, Encoding.UTF8, "application/x-www-form-urlencoded"); using (var client = new HttpClient()) { HttpResponseMessage response = await client.SendAsync(request); responseContent = response.Content.ReadAsStringAsync().Result; } LineNotifyResponse lineNotifyResponse = JsonSerializer.Deserialize<LineNotifyResponse>(responseContent, ApiUtil.GetJsonSerializerOptionsDefault()); // lineNotifyResponse から access_token を取り出して、システム側で保管する return lineNotifyResponse.Message; } catch (System.Exception e) { throw e; } }
ユーザーが認証を行うと
APIその2にリダイレクトされます。
その際、クエリ文字列に
codeというパラメータが含まれます。
取得したcodeと
管理画面で確認できるclient_id、client_secretを
LINE notify APIに投げてトークンを取得します。
GitHubにソースコードを載せていますので、
よろしければ参考にしてください。
APIその1
github.com
APIその2
github.com
メッセージの送信
トークンが発行されたら
実際にメッセージを送信してみましょう!
ユーザーの皆さんには
メッセージを送る前にLINE notifyさんを
トークルームに招待してもらう必要がありますね。
メッセージの送信については
こちらの記事を参考にしてください。
以上でLambdaから
LINE notifyのOAuth2トークン発行および
メッセージを送信することができました。
よかったら試してみてください。
8日目は@haruharuharubyさんの記事です。
よろしくお願いします!