nomurabbitのブログ

nomurabbitのブログはITを中心にした技術ブログです。

nomurabbitのブログ

【AWS】LambdaでLINE notifyのOAuth2トークン発行してみた【LINE】

この記事は
AWS LambdaとServerless Advent Calendar 2021
の7日目です。

6日目は@horit0123さんのこちらの記事でした。
qiita.com
SAMは未経験なのですが、興味がわいてきました。
今度試してみたいと思います!

改めましてこんにちは!nomurabbitです。
LambdaでLINE notifyの第二弾として、
OAuth2を使ってトークン発行する方法を
紹介します。

ユーザーの皆さんが通知を許可する手続きを
簡略化できますね!

OAuth2の処理の流れ

今回の処理の流れはこんな感じです。

f:id:nomurabbit:20211205033445p:plain

ユーザーからの

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をユーザーが叩くと
このような画面が表示されます。

f:id:nomurabbit:20211205033848p:plain


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さんを
トークルームに招待してもらう必要がありますね。

メッセージの送信については
こちらの記事を参考にしてください。

nomurabbit.hatenablog.jp

以上でLambdaから
LINE notifyのOAuth2トークン発行および
メッセージを送信することができました。

よかったら試してみてください。

8日目は@haruharuharubyさんの記事です。
よろしくお願いします!