﻿
{"id":18994,"date":"2020-11-12T11:11:34","date_gmt":"2020-11-12T11:11:34","guid":{"rendered":"https:\/\/www.gencayyildiz.com\/blog\/?p=18994"},"modified":"2020-11-12T11:14:35","modified_gmt":"2020-11-12T11:14:35","slug":"identityserver4-yazi-serisi-14-merkezi-uyelik-sistemi-refresh-token-ile-yeni-access-token-alma","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/identityserver4-yazi-serisi-14-merkezi-uyelik-sistemi-refresh-token-ile-yeni-access-token-alma\/","title":{"rendered":"IdentityServer4 Yaz\u0131 Serisi #14 \u2013 Merkezi \u00dcyelik Sistemi \u2013 Refresh Token \u0130le Yeni Access Token Alma"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Merhaba,<\/p>\n<p><a href=\"https:\/\/www.gencayyildiz.com\/blog\/identityserver4-yazi-serisi\/\" rel=\"noopener noreferrer\" target=\"_blank\">IdentityServer4 Yaz\u0131 Serisinin<\/a> bir \u00f6nceki <a href=\"https:\/\/www.gencayyildiz.com\/blog\/identityserver4-yazi-serisi-13-merkezi-uyelik-sistemi-access-token-ile-apilerle-haberlesme\/\" rel=\"noopener noreferrer\" target=\"_blank\">Merkezi \u00dcyelik Sistemi \u2013 Access Token \u0130le API&#8217;lerle Haberle\u015fme<\/a> ba\u015fl\u0131kl\u0131 makalemizde IdentityServer&#8217;dan elde edilen access token ile API&#8217;lara nas\u0131l istek yap\u0131ld\u0131\u011f\u0131n\u0131 ele alm\u0131\u015ft\u0131k. Bu i\u00e7eri\u011fimizde ise client taraf\u0131nda authentication property&#8217;ler aras\u0131nda elde edilen refresh token&#8217;\u0131 kullanarak nas\u0131l yeni bir access token ve id token&#8217;\u0131n al\u0131nabilece\u011fini ve bunlar\u0131n mevcut authentication propertyler ile  nas\u0131l de\u011fi\u015ftirilebilece\u011fini inceleyece\u011fiz.<\/p>\n<p>Bizler refresh token \u00f6rneklendirmesini, bu ond\u00f6rd\u00fcnc\u00fc makaleye kadar hasbel kader geli\u015ftirdi\u011fimiz <a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/11\/IdentityServer4Example-2.zip\">IdentityServer4Example<\/a> uygulamas\u0131 \u00fczerinden irdeleyece\u011fiz. Geli\u015ftirdi\u011fimiz uygulaman\u0131n son versiyonu zaten mevcudiyette refresh token \u00fcretimi i\u00e7in t\u00fcm alt yap\u0131y\u0131 sa\u011flad\u0131\u011f\u0131ndan dolay\u0131 direkt olarak refresh token ile access token talebini ele alacak ve bu i\u015flemin mant\u0131\u011f\u0131n\u0131 daha net kavrayabilmek i\u00e7in, Postman ve client uygulamas\u0131 olmak \u00fczere iki farkl\u0131 istemcide ayr\u0131 ayr\u0131 \u00f6rneklendirece\u011fiz.<\/p>\n<h3 style=\"color:#e83e8c;\">Postman&#8217;de Refresh Token \u0130le Yeni Token Alma<\/h3>\n<p>\u0130lk olarak client uygulamas\u0131nda bir refresh token elde edelim.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/11\/IdentityServer4-Yazi-Serisi-14-\u2013-Merkezi-Uyelik-Sistemi-\u2013-Refresh-Token-Ile-Yeni-Access-Token-Alma.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/11\/IdentityServer4-Yazi-Serisi-14-\u2013-Merkezi-Uyelik-Sistemi-\u2013-Refresh-Token-Ile-Yeni-Access-Token-Alma.jpg\" alt=\"IdentityServer4 Yaz\u0131 Serisi #14 \u2013 Merkezi \u00dcyelik Sistemi \u2013 Refresh Token \u0130le Yeni Access Token Alma\" width=\"685\" height=\"83\" class=\"aligncenter size-full wp-image-19005\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/11\/IdentityServer4-Yazi-Serisi-14-\u2013-Merkezi-Uyelik-Sistemi-\u2013-Refresh-Token-Ile-Yeni-Access-Token-Alma.jpg 685w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/11\/IdentityServer4-Yazi-Serisi-14-\u2013-Merkezi-Uyelik-Sistemi-\u2013-Refresh-Token-Ile-Yeni-Access-Token-Alma-300x36.jpg 300w\" sizes=\"auto, (max-width: 685px) 100vw, 685px\" \/><\/a><br \/>\nArd\u0131ndan bu refresh token de\u011ferini kullanarak Postman uygulamas\u0131 \u00fczerinden a\u015fa\u011f\u0131daki konfig\u00fcrasyonlar e\u015fli\u011finde yeni bir access token talebinde bulunal\u0131m.<\/p>\n<table>\n<tbody>\n<tr>\n<td style=\"text-align:left;\"><strong style=\"color:purple;\">client_id<\/strong><\/td>\n<td style=\"text-align:left;\">Client id de\u011feri.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align:left;\"><strong style=\"color:purple;\">client_secret<\/strong><\/td>\n<td style=\"text-align:left;\">Client secret de\u011feri.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align:left;\"><strong style=\"color:purple;\">grant_type<\/strong><\/td>\n<td style=\"text-align:left;\">\n\u0130stek t\u00fcr\u00fc. Hangi istek yap\u0131lacaksa ona uygun t\u00fcr bildirilmelidir. Bizler refresh token talebinde bulunaca\u011f\u0131m\u0131zdan dolay\u0131 &#8216;refresh_token&#8217; de\u011ferini verece\u011fiz. Di\u011fer taleplere nazaran alabilece\u011fi de\u011ferleri <a href=\"https:\/\/identityserver4.readthedocs.io\/en\/latest\/endpoints\/token.html\" rel=\"noopener noreferrer\" target=\"_blank\">orjinal kayna\u011f\u0131ndan<\/a> &#8216;grant_type&#8217; ba\u015fl\u0131\u011f\u0131 alt\u0131nda inceleyebilirsiniz.\n<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align:left;\"><strong style=\"color:purple;\">username<\/strong><\/td>\n<td style=\"text-align:left;\">Kullan\u0131c\u0131 ad\u0131.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align:left;\"><strong style=\"color:purple;\">password<\/strong><\/td>\n<td style=\"text-align:left;\">Kullan\u0131c\u0131 \u015fifresi.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align:left;\"><strong style=\"color:purple;\">refresh_token<\/strong><\/td>\n<td style=\"text-align:left;\">Refresh token de\u011feri. Yeni bir access token de\u011feri talep edebilmek i\u00e7in mevcudiyetteki refresh token de\u011ferinin verilmesi gerekmektedir.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/11\/IdentityServer4-Yazi-Serisi-14-\u2013-Merkezi-Uyelik-Sistemi-\u2013-Refresh-Token-Ile-Yeni-Access-Token-Alma.gif\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/11\/IdentityServer4-Yazi-Serisi-14-\u2013-Merkezi-Uyelik-Sistemi-\u2013-Refresh-Token-Ile-Yeni-Access-Token-Alma.gif\" alt=\"IdentityServer4 Yaz\u0131 Serisi #14 \u2013 Merkezi \u00dcyelik Sistemi \u2013 Refresh Token \u0130le Yeni Access Token Alma\" width=\"800\" height=\"529\" class=\"aligncenter size-full wp-image-19006\" \/><\/a><\/p>\n<p>Yukar\u0131daki ekran g\u00f6r\u00fcnt\u00fcs\u00fcnde g\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere her talep neticesinde yeni bir access token ve refresh token \u00fcretilmektedir. Her talepte access token&#8217;\u0131ndan ziyade refresh token&#8217;\u0131n yeniden \u00fcretilme sebebi ise Auth Server&#8217;da ilgili client&#8217;\u0131 tan\u0131mlayan nesnede &#8216;RefreshTokenUsage&#8217; \u00f6zelli\u011fine &#8216;OneTimeOnly&#8217; de\u011ferinin verilmesidir. E\u011fer ki &#8216;ReUse&#8217; de\u011feri verilseydi her talep neticesinde ayn\u0131 refresh token de\u011feri kullan\u0131labilecekti.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/11\/IdentityServer4-Yazi-Serisi-14-\u2013-Merkezi-Uyelik-Sistemi-\u2013-Refresh-Token-Ile-Yeni-Access-Token-Alma-1.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/11\/IdentityServer4-Yazi-Serisi-14-\u2013-Merkezi-Uyelik-Sistemi-\u2013-Refresh-Token-Ile-Yeni-Access-Token-Alma-1.jpg\" alt=\"IdentityServer4 Yaz\u0131 Serisi #14 \u2013 Merkezi \u00dcyelik Sistemi \u2013 Refresh Token \u0130le Yeni Access Token Alma\" width=\"552\" height=\"202\" class=\"aligncenter size-full wp-image-19014\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/11\/IdentityServer4-Yazi-Serisi-14-\u2013-Merkezi-Uyelik-Sistemi-\u2013-Refresh-Token-Ile-Yeni-Access-Token-Alma-1.jpg 552w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/11\/IdentityServer4-Yazi-Serisi-14-\u2013-Merkezi-Uyelik-Sistemi-\u2013-Refresh-Token-Ile-Yeni-Access-Token-Alma-1-300x110.jpg 300w\" sizes=\"auto, (max-width: 552px) 100vw, 552px\" \/><\/a><\/p>\n<h3 style=\"color:#e83e8c;\">Client Uygulamas\u0131nda Refresh Token \u0130le Yeni Token Alma<\/h3>\n<p>Esas itibar\u0131yla refresh token ile client uygulamas\u0131 \u00fczerinden access token talebinde bulunulmas\u0131 gerekecektir. Bu duruma istinaden a\u015fa\u011f\u0131daki \u00f6rne\u011fi irdelemekte fayda vard\u0131r.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class AuthController : Controller\r\n    {\r\n        public async Task&lt;IActionResult&gt; NewAccessToken()\r\n        {\r\n            string refreshToken = await HttpContext.GetTokenAsync(OpenIdConnectParameterNames.RefreshToken);\r\n            HttpClient httpClient = new HttpClient();\r\n            RefreshTokenRequest refreshTokenRequest = new RefreshTokenRequest()\r\n            {\r\n                ClientId = &quot;OnlineBankamatik&quot;,\r\n                ClientSecret = &quot;onlinebankamatik&quot;,\r\n                RefreshToken = refreshToken,\r\n                Address = (await httpClient.GetDiscoveryDocumentAsync(&quot;https:\/\/localhost:1000&quot;)).TokenEndpoint\r\n            };\r\n            TokenResponse tokenResponse = await httpClient.RequestRefreshTokenAsync(refreshTokenRequest);\r\n            AuthenticationProperties properties = (await HttpContext.AuthenticateAsync()).Properties;\r\n\r\n            properties.StoreTokens(\r\n                new List&lt;AuthenticationToken&gt; {\r\n                  new AuthenticationToken\r\n                                         {\r\n                                             Name = OpenIdConnectParameterNames.IdToken,\r\n                                             Value = tokenResponse.IdentityToken\r\n                                         },\r\n                  new AuthenticationToken\r\n                                         {\r\n                                             Name = OpenIdConnectParameterNames.AccessToken,\r\n                                             Value = tokenResponse.AccessToken\r\n                                         },\r\n                  new AuthenticationToken\r\n                                         {\r\n                                             Name = OpenIdConnectParameterNames.RefreshToken,\r\n                                             Value = tokenResponse.RefreshToken\r\n                                         },\r\n                  new AuthenticationToken\r\n                                         {\r\n                                             Name = OpenIdConnectParameterNames.ExpiresIn,\r\n                                             Value = DateTime.UtcNow.AddSeconds(tokenResponse.ExpiresIn).ToString(&quot;O&quot;)\r\n                                         },\r\n                                       });\r\n            await HttpContext.SignInAsync(&quot;OnlineBankamatikCookie&quot;, (await HttpContext.AuthenticateAsync()).Principal, properties);\r\n            return RedirectToAction(nameof(BankamatikController.Index));\r\n        }\r\n        public async Task&lt;IActionResult&gt; Index()\r\n        {\r\n            AuthenticateResult authenticateResult = await HttpContext.AuthenticateAsync();\r\n            IOrderedEnumerable&lt;KeyValuePair&lt;string, string&gt;&gt; properties = authenticateResult.Properties.Items.OrderBy(p =&gt; p.Key);\r\n            return View(properties);\r\n        }\r\n    }\r\n<\/pre>\n<p>Yukar\u0131daki kod blo\u011funun <strong>5<\/strong> ile <strong>14.<\/strong> sat\u0131rlar\u0131 aras\u0131nda refresh token ile yeni bir access token talebinde bulunulmas\u0131, <strong>15<\/strong> ile <strong>41.<\/strong> sat\u0131rlar\u0131 aras\u0131nda ise elde edilen authentication property&#8217;ler ile mevcudiyette bulunanlar\u0131n de\u011fi\u015ftirilmesi ele al\u0131nm\u0131\u015ft\u0131r. Tek tek bu kodlar\u0131 izah etmemiz gerekirse e\u011fer;<\/p>\n<ul>\n<li><strong>5. sat\u0131r<\/strong><br \/>\nAuthentication property&#8217;ler i\u00e7erisinden refresh token de\u011feri elde edilmi\u015ftir.<\/li>\n<li><strong>7 &#8211; 13. sat\u0131r<\/strong><br \/>\nRefresh token ile request yapabilmemiz i\u00e7in ilgili client&#8217;\u0131n bilgilerini tutan nesne olu\u015fturulmu\u015ftur. Burada dikkat ederseniz kullan\u0131c\u0131n\u0131n username ve password bilgileri girilmemektedir. Bunun nedeni, ilgili datalar\u0131n cookie&#8217;de tutuluyor ve talep neticesinde IdentityServer4&#8217;e g\u00f6nderiliyor olmas\u0131d\u0131r. <\/li>\n<li><strong>14. sat\u0131r<\/strong><br \/>\n&#8216;RefreshTokenRequest&#8217; nesnesini kullanarak IdentityServer4 sunucusuna &#8216;grant_type&#8217; de\u011feri &#8216;refresh_token&#8217; olan bir istek g\u00f6nderir ve neticede &#8216;TokenResponse&#8217; olarak yeni access token, id token ve refresh token de\u011ferlerini elde eder.\n<\/li>\n<li><strong>15. sat\u0131r<\/strong><br \/>\nMevcudiyetteki t\u00fcm authentication property&#8217;ler elde edilir.\n<\/li>\n<li><strong>17 &#8211; 39. sat\u0131r<\/strong><br \/>\nMevcudiyette elde edilen authentication property&#8217;ler ile talep neticesinde \u00fcretilen yeni de\u011ferleri &#8216;StoreTokens&#8217; fonksiyonu ile de\u011fi\u015ftirmekteyiz.\n<\/li>\n<li><strong>40. sat\u0131r<\/strong><br \/>\n\u0130lgili kullan\u0131c\u0131 yeni authentication property&#8217;ler ile g\u00fcncellenmekte ve bunun i\u00e7in tekrar ilgili de\u011ferler e\u015fli\u011finde SignIn yapt\u0131r\u0131lmaktad\u0131r.\n<\/li>\n<li><strong>43 &#8211; 47. sat\u0131r<\/strong><br \/>\nAuthentication property&#8217;leri \u00e7ekip, listeleyen bir action tasarlanm\u0131\u015ft\u0131r.\n<\/li>\n<\/ul>\n<p><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/11\/IdentityServer4-Yazi-Serisi-14-\u2013-Merkezi-Uyelik-Sistemi-\u2013-Refresh-Token-Ile-Yeni-Access-Token-Alma-1.gif\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/11\/IdentityServer4-Yazi-Serisi-14-\u2013-Merkezi-Uyelik-Sistemi-\u2013-Refresh-Token-Ile-Yeni-Access-Token-Alma-1.gif\" alt=\"IdentityServer4 Yaz\u0131 Serisi #14 \u2013 Merkezi \u00dcyelik Sistemi \u2013 Refresh Token \u0130le Yeni Access Token Alma\" width=\"800\" height=\"335\" class=\"aligncenter size-full wp-image-19030\" \/><\/a><br \/>\nG\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere refresh token ile yeni bir access token talep edilmekte ve elde edilen t\u00fcm de\u011ferler \u00f6ncekileriyle de\u011fi\u015ftirilmektedir.<\/p>\n<p>\u0130lgilenenlerin faydalanmas\u0131 dile\u011fiyle&#8230;<br \/>\nSonraki yaz\u0131lar\u0131mda g\u00f6r\u00fc\u015fmek \u00fczere&#8230;<br \/>\n\u0130yi \u00e7al\u0131\u015fmalar&#8230;<\/p>\n<p>Not : \u00d6rnek uygulamay\u0131 indirebilmek i\u00e7in <a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/11\/IdentityServer4Example-3.zip\">buraya<\/a> t\u0131klay\u0131n\u0131z.<\/p>\n<!-- AddThis Advanced Settings generic via filter on the_content --><!-- AddThis Share Buttons generic via filter on the_content -->","protected":false},"excerpt":{"rendered":"<p>Merhaba, IdentityServer4 Yaz\u0131 Serisinin bir \u00f6nceki Merkezi \u00dcyelik Sistemi \u2013 Access Token \u0130le API&#8217;lerle Haberle\u015fme ba\u015fl\u0131kl\u0131 makalemizde IdentityServer&#8217;dan elde edilen access token ile API&#8217;lara nas\u0131l istek yap\u0131ld\u0131\u011f\u0131n\u0131 ele alm\u0131\u015ft\u0131k. Bu i\u00e7eri\u011fimizde ise client taraf\u0131nda&#46;&#46;&#46;<!-- AddThis Advanced Settings generic via filter on get_the_excerpt --><!-- AddThis Share Buttons generic via filter on get_the_excerpt --><\/p>\n","protected":false},"author":1,"featured_media":18168,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3826],"tags":[3914,3827,3895,3896],"class_list":["post-18994","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-identityserver4","tag-get-access-token-with-refresh-token","tag-identityserver4","tag-identityserver4-access-token","tag-identityserver4-refresh-token"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/18994","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/comments?post=18994"}],"version-history":[{"count":37,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/18994\/revisions"}],"predecessor-version":[{"id":19039,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/18994\/revisions\/19039"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media\/18168"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=18994"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=18994"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=18994"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}