Exemplo n.º 1
0
        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
            }));
        }