ASP.NET Core3.1でアクセストークンが取得できない。

kekeke

2023.04.11既読 1007

##困っていること

現在、ASP.NET Core3.1で「Service Account認証 (JWT)」のアクセストークンが取得できなくて困っています。

API2.0を使用しており、同様のパラメータでPostmanからは問題なくアクセストークンを取得できています。

##現象

下記ソースのwc.UploadValues()で「Bad Request:400」が返ってきます。
##原因
["assertion"]に渡しているJWTの値が問題なようで、Postmanで作成したJWTの値を渡すとアクセストークンが取得できます。

PrivateKeyは、「Developer Console」の認証キーでヘッダ「-----BEGIN PRIVATE KEY-----」とフッタ「-----END PRIVATE KEY-----」を除いて全ての改行を除いて1行にしたものを渡していますが、この認証キーの扱いに問題あるのではと考えています。

ご教授の程、お願いいたします。

---ソース---

           // RSA クラスを利用して認証キーから署名情報を作成する

           using RSA rsa = RSA.Create();
           rsa.ImportPkcs8PrivateKey(Convert.FromBase64String(PrivateKey), out _);
           var signingCredentials = new SigningCredentials(new RsaSecurityKey(rsa), SecurityAlgorithms.RsaSha256);
           // トークン文字列の作成の生成
           var descriptor = new SecurityTokenDescriptor
           {
               Issuer = ClientId,
               Claims = new Dictionary<string, object>() { ["sub"] = ServiceAccount },
               IssuedAt = DateTime.UtcNow,
               Expires = (DateTime.UtcNow).AddMinutes(60),
               SigningCredentials = signingCredentials
           };
           var handler = new System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler();
           var pv = new NameValueCollection()
           {
               ["assertion"] = handler.WriteToken(handler.CreateJwtSecurityToken(descriptor)),
               ["grant_type"] = GRANT_TYPE,
               ["client_id"] = ClientId,
               ["client_secret"] = ClientSecret,
               ["scope"] = "bot, user.read"
           };
           using var wc = new WebClient() { Encoding = Encoding.UTF8 };
           wc.Headers.Add("Content-Type", "application/x-www-form-urlencoded");
           var resText = Encoding.UTF8.GetString(wc.UploadValues(_authenticationUrl, pv)); ←ここでBad Request
           return System.Text.Json.JsonSerializer.Deserialize<Dictionary<string, string>>(resText);
---ここまで---

コメント1

  • 업데이트 된 답글입니다.

    kekeke 投稿者

    自己解決しました。
    解決方法は、「SecurityTokenDescriptor」でトークン文字列を作成していましたが、
    「JwtSecurityToken」に変更することで、解決しました。

    2023.04.17

    0
前の投稿API1.0⇒API2.0への移行時、同時に連携できるか
次の投稿外部サイト(自社開発)とLINE Worksを連携し個人LINEへの連絡をする方法について教えてください。
リスト

まだ、解決できませんか?
今すぐ実際に使用しているLINE WORKSユーザーに質問してみましょう。