public static async Task <HttpResponseMessage> PostTwitterAccessTokenAsync( [HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = "auth/twitter/access_token")] HttpRequestMessage req, [Table("Users")] IQueryable <User> users, [Table("Users")] ICollector <User> outUsers, TraceWriter log) { log.Info("C# HTTP trigger function processed a request."); dynamic data = await req.Content.ReadAsAsync <object>(); string paramOauthToken = data.oauthToken; string paramOauthVerifier = data.oauthVerifier; var authorization = TwitterHelper.BuildAccessAuthorizationHeader(twitterConfig.AccessTokenUrl, paramOauthToken, twitterConfig.ConsumerKey, twitterConfig.ConsumerSecret); var httpClient = new HttpClient(); var requestMsg = new HttpRequestMessage() { Method = HttpMethod.Post, RequestUri = new Uri(twitterConfig.AccessTokenUrl), Content = new StringContent($"oauth_verifier={paramOauthVerifier}") }; requestMsg.Content.Headers.ContentType = new MediaTypeHeaderValue("application/x-www-form-urlencoded"); requestMsg.Headers.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("OAuth", authorization); var response = await httpClient.SendAsync(requestMsg); var responseText = await response.Content.ReadAsStringAsync(); log.Info(responseText); if (!response.IsSuccessStatusCode) { return(req.CreateJsonResponse(response.StatusCode, responseText)); } string oauthToken = null; string oauthTokenSecret = null; var keyValPairs = responseText.Split('&'); for (var i = 0; i < keyValPairs.Length; i++) { var splits = keyValPairs[i].Split('='); switch (splits[0]) { case "oauth_token": oauthToken = splits[1]; break; case "oauth_token_secret": oauthTokenSecret = splits[1]; break; } } var user = await GetTwitterAccountAsync(oauthToken, oauthTokenSecret); if (users.Where(x => x.PartitionKey == "twitter" && x.RowKey == user.RowKey).ToList().Any()) { // とりあえずアップデートは考えない。その辺考えるなら引数にバインドより普通にSDKでI/Oした方が良さそう } else { outUsers.Add(user); } return(req.CreateJsonResponse(HttpStatusCode.OK, new { oauthToken, oauthTokenSecret })); }