Esempio n. 1
0
        public static async Task <HttpResponseMessage> Callback(
            [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = "callback")] HttpRequestMessage req,
            ExecutionContext executionContext,
            ILogger logger)
        {
            try
            {
                var secrets          = Secrets.Get(executionContext);
                var storageAccount   = CloudStorageAccount.Parse(Common.KnownEnvironmentVariables.AzureWebJobsStorage);
                var marketplaceTable = storageAccount.CreateCloudTableClient().GetTableReference("marketplace");

                var stateCookie = req.ReadCookie("state");

                if (string.IsNullOrEmpty(stateCookie))
                {
                    logger.LogError("state cookie is missing");
                    return(Winning(req));
                }

                var qs         = req.RequestUri.ParseQueryString();
                var stateQuery = qs.Get("state");
                var code       = qs.Get("code");

                if (stateQuery != stateCookie)
                {
                    logger.LogError("state mismatch: {StateCookie} !== {StateQuery}", stateCookie, stateQuery);
                    return(Winning(req));
                }

                if (string.IsNullOrEmpty(code))
                {
                    logger.LogError("code is missing");
                    return(Winning(req));
                }

                var tokenResponse = await HttpClient.PostAsJsonAsync("https://github.com/login/oauth/access_token", new
                {
                    client_id     = secrets.ClientId,
                    client_secret = secrets.ClientSecret,
                    code,
                    redirect_uri = secrets.RedirectUri,
                    state        = stateQuery
                });

                var tokenContent = await tokenResponse.Content.ReadAsFormDataAsync();

                if (tokenContent.Get("error") != null)
                {
                    logger.LogError("TokenResponse: " + await tokenResponse.Content.ReadAsStringAsync());
                    return(Winning(req));
                }

                var token = tokenContent.Get("access_token");

                var mktplcRequest = new HttpRequestMessage(HttpMethod.Get, "https://api.github.com/user/marketplace_purchases?access_token=" + token);
                mktplcRequest.Headers.Add("User-Agent", "IMGBOT");
                var mktplcResponse = await HttpClient.SendAsync(mktplcRequest);

                var planDataJson = await mktplcResponse.Content.ReadAsStringAsync();

                var planData = JsonConvert.DeserializeObject <PlanData[]>(planDataJson);
                foreach (var item in planData)
                {
                    var marketplaceRow = new Marketplace(item.account.id, item.account.login)
                    {
                        AccountType = item.account.type,
                        PlanId      = item.plan.id
                    };

                    await marketplaceTable.CreateIfNotExistsAsync();

                    await marketplaceTable.ExecuteAsync(TableOperation.InsertOrMerge(marketplaceRow));
                }

                return(Winning(req, token, stateQuery));
            }
            catch (Exception e)
            {
                logger.LogError(e, "Error processing auth");
            }

            return(Winning(req));
        }