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)); }