xin9le.net

Microsoft の製品/技術が大好きな Microsoft MVP な管理人の技術ブログです。

LINE Profile+ に対応した LINE ログイン Provider ライブラリを作りました

業務で LINE ログインを実装することになり、合わせて LINE Profile+ から情報を取得する必要が出ました。ということで LINE Profile+ をサポートした OAuth2 ライブラリを作りました

弊社メンバーで Microsoft MVP for Azure の吉野くんが以前 .NET Core 2.x 世代向けに LINE ログインのライブラリを作っていたので、そこに相乗りさせてもらいました。

Getting Started

このライブラリは ASP.NET Core における外部プロバイダー認証の実装に準拠しています。なので、以下のような感じで始められます。

dotnet add package LineAuthentication
services
    .AddAuthentication()
    .AddLine(options =>
    {
        options.ClientId = Configuration["Authentication:Line:ChannelId"];
        options.ClientSecret = Configuration["Authentication:Line:ChannelSecret"];
    });

LINE Profile+ の情報取得

LineAuthentication-AspNetCore を利用すれば、OAuth の認可スコープを指定することでユーザーの LINE Profile+ から以下の情報を取得できるようになります。会員登録などで利用したいですね。

  • 姓 / 名
  • 姓 / 名 (カナ)
  • 性別
  • 生年月日
  • 住所
  • 電話番号
  • E-mail アドレス

ちょこっと注意が必要なのは、LINE Profile+ にアクセスするためには LINE 側への利用申請が必要な点です。個人情報を扱うのでこればっかりは致し方ない感じはあります。詳細は LINE Developers のドキュメントをご参照ください。

こんな感じで利用します。なんてことはなく、標準に準拠してるので他の外部ログインを実装したことがある方にとってはメッチャ簡単です。

services
    .AddAuthentication()
    .AddLine(options =>
    {
        options.ClientId = Configuration["Authentication:Line:ChannelId"];
        options.ClientSecret = Configuration["Authentication:Line:ChannelSecret"];

        // 認可スコープを追加
        options.Scope.Add("real_name");
        options.Scope.Add("gender");
        options.Scope.Add("birthdate");
        options.Scope.Add("address");
        options.Scope.Add("phone");
        options.Scope.Add("email");

        // JSON ペイロードとの Claim 情報のマッピング
        options.ClaimActions.MapJsonKey(ClaimTypes.Email, "email");

        // JSON ペイロードに丸ッとアクセス
        options.Events.OnCreatingTicket = context =>
        {
            // context.User に JsonElement 形式で入ってます
            var json = context.User.GetRawText();
            return Task.CompletedTask;
        };
    });

なぜ作ったか

ASP.NET Core で OAuth2 による認証 / 認可を実装しようと思ったら、大半の実装は AspNet.Security.OAuth.Providers にあります。この中にも LINE Provider のライブラリは当然あるのですが、

  • LINE Profile+ に対応していない
  • Pull-Request を出してもスピーディ NuGet 化されない
  • .NET 5 のみのサポート

という部分が気掛かりでした。特に最初の 2 点が今回ビジネス的に大変困るということで、別ライブラリとして実装することにしたという感じです。

実際をのところは AspNet.Security.OAuth.Line で LINE Profile+ に対する拡張ポイントが全くないのかと言うとそうではないんですが、ライブラリ規模が非常に小さいのもあって「作り直しするのとほぼ変わらないなぁ」という肌感だったというのが正直なところです。