C#でアクセストークンの取得に失敗します - 問い合わせ - LINE WORKS Developers : コミュニティ

コミュニティ

LINE WORKSのテクニカルエキスパート及び開発者と
コードのサンプル、リソース、Tip等を共有し問題解決への相談が可能です。

??dev_메인_타이틀_모바일_ja_JP??

問い合わせ

C#でアクセストークンの取得に失敗します

naotako

2021.04.20既読 583

下記のようにC#でアクセストークンを取得するプログラムを買いたいのですが「client.UploadValues」の呼び出しで
タイムアウトでエラーになってしまいます。
エラーもタイムアウトということでどこが悪いのかがわかりません。
どなたかご存じの方お教えください。
       /// <summary>
       /// LINE WORKS サーバーAPIのアクセストークン取得結果のJSONデータ取得用クラス
       /// </summary>
       class LineWorksAuthenticationResultToken
       {
           [JsonProperty("access_token")]
           public string AccessToken { get; set; }
           [JsonProperty("token_type")]
           public string TokenType { get; set; }
           [JsonProperty("expires_in")]
           public int ExpiresIn { get; set; }
       }
       public string GetAccessToken(string apiId, string serverId )
       {
           //JWTトークンの作成=======================================================
           string request_jwt = null;
           string privateKey = "C:\\private.key";
           
           //privatekeyをRSAとして使用できるように変換
           //var pkcs8privatekey = Security.opensslkey.DecodePkcs8PrivateKey(File.ReadAllText(privateKey));
           var rsa = Security.opensslkey.DecodePrivateKeyInfo(pkcs8privatekey);
           var key = new Microsoft.IdentityModel.Tokens.RsaSecurityKey(rsa);
           // トークン操作用のクラスを用意
           var handler = new System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler();
           // 署名情報クラスを生成
           var credentials = new Microsoft.IdentityModel.Tokens.SigningCredentials(key, "RS256");
           var descriptor = new Microsoft.IdentityModel.Tokens.SecurityTokenDescriptor
           {
               Issuer = serverId,
               SigningCredentials = credentials,
               IssuedAt = DateTime.UtcNow,
               Expires = (DateTime.UtcNow).AddMinutes(50),
           };
           // トークンの生成
           var token = handler.CreateJwtSecurityToken(descriptor);
           // トークンの文字列表現を取得
           var tokenString = handler.WriteToken(token);
           //アクセストークンの取得=======================================================
           //認証URL
           string TOKEN_ENDPOINT = @"https://auth.worksmobile.com/b/" + apiId + "/server/token";
           var client = new System.Net.WebClient();
           client.Encoding = Encoding.UTF8;
           client.Headers.Add("Content-Type", "application/x-www-form-urlencoded");
           var content = new System.Collections.Specialized.NameValueCollection();
           request_jwt = tokenString;
           content["assertion"] = request_jwt;
           content["grant_type"] = "urn:ietf:params:oauth:grant-type:jwt-bearer";
           //ここでタイムアウトでどうしても失敗してしまう
           string response = Encoding.UTF8.GetString(client.UploadValues(TOKEN_ENDPOINT, "POST", content));
           var result = JsonConvert.DeserializeObject<LineWorksAuthenticationResultToken>(response);
           return result.AccessToken;
           //WebRequest request  = WebRequest.Create(TOKEN_ENDPOINT);
           //var request = new System.Net.WebClient();
       }


コメント1

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

    佐藤正宗

    C# は使っていないので詳しくはわからないのですが、Postman でサンプルコードが出せるので貼り付けときますね。
    ご参考までに。

    var client = new RestClient("https://auth.worksmobile.com/b/xxxxxxx/server/token";);
    client.Timeout = -1;
    var request = new RestRequest(Method.POST);
    request.AddHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
    request.AddHeader("Authorization", "Bearer xxxxxxxxxxxxxxxxxxxxxx");
    request.AddHeader("Cookie", "LC=en_US; language=en_US");
    request.AlwaysMultipartFormData = true;
    request.AddParameter("grant_type", "urn:ietf:params:oauth:grant-type:jwt-bearer");
    request.AddParameter("assertion", "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
    IRestResponse response = client.Execute(request);
    Console.WriteLine(response.Content);

    2021.04.27

    0
前の投稿 PC版でボタンのリンクの色が変えられない
次の投稿認証キーの発行について