Skip to content

Commit 223cebf

Browse files
authored
Update README.md
1 parent 7bb4a60 commit 223cebf

File tree

1 file changed

+97
-0
lines changed

1 file changed

+97
-0
lines changed

README.md

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -530,7 +530,104 @@ var processingReport = await amazonConnection.Feed.GetJsonFeedDocumentProcessing
530530

531531
```
532532

533+
#### Website authorization workflow.
534+
```CSharp
535+
[HttpGet("AuthorizeAmazon")]
536+
public async Task<IActionResult> AuthorizeAmazon()
537+
{
538+
// Step 2-5 of the website authorization workflow.
539+
540+
// Step 2-3: Amazon calls our log-in URI with amazon_callback_uri.
541+
var amazonCallbackUri = Request.Query["amazon_callback_uri"].ToString();
542+
if (!string.IsNullOrEmpty(amazonCallbackUri))
543+
{
544+
var amazonState = Request.Query["amazon_state"].ToString();
545+
var version = configuration["FikaAmazonAPI:AuthorizeVersion"];
546+
var redirectUri = configuration["FikaAmazonAPI:AmazonCallbackUri"];
547+
548+
var generatedState = Guid.NewGuid().ToString("N");
549+
Response.Cookies.Append("amazon_oauth_state", generatedState, new CookieOptions
550+
{
551+
HttpOnly = true,
552+
Secure = true,
553+
SameSite = SameSiteMode.Lax,
554+
Expires = DateTimeOffset.UtcNow.AddMinutes(5)
555+
});
556+
557+
var query = new Dictionary<string, string?>
558+
{
559+
["redirect_uri"] = redirectUri,
560+
["amazon_state"] = amazonState,
561+
["state"] = generatedState
562+
};
563+
564+
if (!string.IsNullOrEmpty(version))
565+
{
566+
query["version"] = version;
567+
}
568+
569+
Response.Headers["Referrer-Policy"] = "no-referrer";
570+
var redirectUrl = QueryHelpers.AddQueryString(amazonCallbackUri, query!);
571+
return Redirect(redirectUrl);
572+
}
573+
574+
// Step 4-5: Amazon redirects back to our redirect_uri with authorization code.
575+
var state = Request.Query["state"].ToString();
576+
var sellingPartnerId = Request.Query["selling_partner_id"].ToString();
577+
var mwsAuthToken = Request.Query["mws_auth_token"].ToString();
578+
var code = Request.Query["spapi_oauth_code"].ToString();
579+
580+
var storedState = Request.Cookies["amazon_oauth_state"];
581+
if (string.IsNullOrEmpty(state) || storedState != state)
582+
{
583+
return BadRequest("Invalid state");
584+
}
585+
586+
Response.Cookies.Delete("amazon_oauth_state");
587+
588+
if (string.IsNullOrEmpty(code))
589+
{
590+
return BadRequest("Missing spapi_oauth_code");
591+
}
533592

593+
var clientId = configuration["FikaAmazonAPI:ClientId"];
594+
var clientSecret = configuration["FikaAmazonAPI:ClientSecret"];
595+
var callbackUri = configuration["FikaAmazonAPI:AmazonCallbackUri"];
596+
597+
using var httpClient = new HttpClient();
598+
var form = new FormUrlEncodedContent(new Dictionary<string, string>
599+
{
600+
["grant_type"] = "authorization_code",
601+
["code"] = code,
602+
["client_id"] = clientId ?? string.Empty,
603+
["client_secret"] = clientSecret ?? string.Empty,
604+
["redirect_uri"] = callbackUri ?? string.Empty
605+
});
606+
607+
using var response = await httpClient.PostAsync("https://api.amazon.com/auth/o2/token", form);
608+
var responseBody = await response.Content.ReadAsStringAsync();
609+
if (!response.IsSuccessStatusCode)
610+
{
611+
return BadRequest(responseBody);
612+
}
613+
614+
using var document = JsonDocument.Parse(responseBody);
615+
var refreshToken = document.RootElement.GetProperty("refresh_token").GetString();
616+
var accessToken = document.RootElement.GetProperty("access_token").GetString();
617+
618+
return Json(new
619+
{
620+
state,
621+
selling_partner_id = sellingPartnerId,
622+
mws_auth_token = mwsAuthToken,
623+
refresh_token = refreshToken,
624+
access_token = accessToken
625+
});
626+
}
627+
628+
```
629+
630+
534631
#### Feed Submit for change Quantity
535632
```CSharp
536633
ConstructFeedService createDocument = new ConstructFeedService("{SellerID}", "1.02");

0 commit comments

Comments
 (0)