@@ -530,7 +530,104 @@ var processingReport = await amazonConnection.Feed.GetJsonFeedDocumentProcessing
530
530
531
531
```
532
532
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
+ }
533
592
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
+
534
631
#### Feed Submit for change Quantity
535
632
``` CSharp
536
633
ConstructFeedService createDocument = new ConstructFeedService (" {SellerID}" , " 1.02" );
0 commit comments