ASP.NET Core3.1でアクセストークンが取得できない。
##困っていること
現在、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
まだ、解決できませんか?
今すぐ実際に使用しているLINE WORKSユーザーに質問してみましょう。