﻿
{"id":18269,"date":"2020-10-17T11:42:50","date_gmt":"2020-10-17T11:42:50","guid":{"rendered":"https:\/\/www.gencayyildiz.com\/blog\/?p=18269"},"modified":"2020-10-17T11:42:50","modified_gmt":"2020-10-17T11:42:50","slug":"identityserver4-yazi-serisi-3-client-credentials","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/identityserver4-yazi-serisi-3-client-credentials\/","title":{"rendered":"IdentityServer4 Yaz\u0131 Serisi #3 &#8211; Client Credentials"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Merhaba,<\/p>\n<div id=\"attachment_18352\" style=\"width: 810px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/10\/IdentityServer4-Yazi-Serisi-3-Client-Credentials-2.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-18352\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/10\/IdentityServer4-Yazi-Serisi-3-Client-Credentials-2.png\" alt=\"IdentityServer4 Yaz\u0131 Serisi #3 - Client Credentials\" width=\"800\" height=\"447\" class=\"size-full wp-image-18352\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/10\/IdentityServer4-Yazi-Serisi-3-Client-Credentials-2.png 800w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/10\/IdentityServer4-Yazi-Serisi-3-Client-Credentials-2-300x168.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/10\/IdentityServer4-Yazi-Serisi-3-Client-Credentials-2-768x429.png 768w\" sizes=\"auto, (max-width: 800px) 100vw, 800px\" \/><\/a><p id=\"caption-attachment-18352\" class=\"wp-caption-text\">Temsili Client Credentials diyagram\u0131&#8230;<\/p><\/div>\n<p><a href=\"https:\/\/www.gencayyildiz.com\/blog\/identityserver4-yazi-serisi\/\" rel=\"noopener noreferrer\" target=\"_blank\">IdentityServer4 Yaz\u0131 Serisi<\/a>nin bu \u00fc\u00e7\u00fcnc\u00fc makalesinde Client Credential yetki tipi ile gerekli konfig\u00fcrasyonlar e\u015fli\u011finde IdentityServer4 uygulamas\u0131 geli\u015ftirecek ve aya\u011fa kald\u0131raca\u011f\u0131z. Client Credential; machine to machine kimliklendirme dedi\u011fimiz iki uygulama aras\u0131ndaki etkile\u015fime istinaden kullan\u0131lan bir ak\u0131\u015f t\u00fcr\u00fcd\u00fcr. Kullan\u0131c\u0131(User) kimlik do\u011frulamas\u0131ndan ziyade sadece client&#8217;\u0131n do\u011frulanmas\u0131 \u00f6nemliyse(authorization) tercih edilmektedir.<\/p>\n<blockquote><p><em style=\"color:purple;\">Client Credentials, resource server&#8217;lar\u0131 korumak i\u00e7in IdentityServer4&#8217;\u0131 kullanman\u0131n en temel senaryosunu sunar.<\/em><\/p><\/blockquote>\n<h3 style=\"color:#e83e8c;\">Client Credentials Stratejisi<\/h3>\n<p><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/10\/IdentityServer4-Yazi-Serisi-3-Client-Credentials.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/10\/IdentityServer4-Yazi-Serisi-3-Client-Credentials-300x192.jpg\" alt=\"IdentityServer4 Yaz\u0131 Serisi #3 - Client Credentials\" width=\"300\" height=\"192\" class=\"alignleft size-medium wp-image-18275\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/10\/IdentityServer4-Yazi-Serisi-3-Client-Credentials-300x192.jpg 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/10\/IdentityServer4-Yazi-Serisi-3-Client-Credentials-1024x656.jpg 1024w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/10\/IdentityServer4-Yazi-Serisi-3-Client-Credentials-768x492.jpg 768w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/10\/IdentityServer4-Yazi-Serisi-3-Client-Credentials.jpg 1290w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a>Client Credentials yetki tipinde Auth Server sadece client&#8217;lara, sistemde tan\u0131ml\u0131 olan API&#8217;lara(resources) eri\u015fim yetkisi vermektedir. Yandaki g\u00f6r\u00fcnt\u00fcde de g\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere sistemdeki t\u00fcm client&#8217;lar(her ne kadar tekil \u00f6rneklendirilmi\u015f olsada) Auth Server taraf\u0131ndan tan\u0131mlanmaktad\u0131r. Bu tan\u0131mlamada t\u00fcm client&#8217;lara, birbirlerinden ay\u0131rmak ve o anki iste\u011fin hangi client&#8217;tan geldi\u011fini anlayabilmek i\u00e7in Auth Server taraf\u0131ndan <strong><em style=\"color:darkred;\">Client ID<\/em><\/strong> ve <strong><em style=\"color:darkred;\">Client Secret<\/em><\/strong> de\u011ferleri atanmaktad\u0131r. Bu de\u011ferleri kullanarak Auth Server&#8217;dan token elde eden client, ilgili token&#8217;\u0131 kullanarak API&#8217;lara istekte bulunacakt\u0131r. API&#8217;lar ise gelen token&#8217;\u0131 kontrol edecek ve sistemdeki Auth Server taraf\u0131ndan da\u011f\u0131t\u0131lm\u0131\u015f oldu\u011funu anlad\u0131\u011f\u0131 taktirde onaylayarak veri eri\u015fimine izin verecektir&#8230;<\/p>\n<blockquote><p><em style=\"color:purple;\">Client Credentials, kullan\u0131c\u0131dan ziyade client&#8217;\u0131n do\u011frulanmas\u0131n\u0131 baz al\u0131r.<\/em><\/p><\/blockquote>\n<p>Client Credentials, client do\u011frulanmas\u0131 temelli oldu\u011fundan dolay\u0131 kullan\u0131c\u0131 ile ilgili i\u015flemlerin(\u00fcyelik sistemi, kullan\u0131c\u0131 do\u011frulama vs.) olmad\u0131\u011f\u0131 durumlarda tercih edilmektedir. Client&#8217;\u0131n do\u011frulanmas\u0131, client ile API&#8217;lar aras\u0131ndaki etkile\u015fimin\/ileti\u015fimin\/konu\u015fturman\u0131n bir gere\u011fi olaca\u011f\u0131 i\u00e7in makalemizin ilk paragraflar\u0131nda de\u011finildi\u011fi gibi machine to machine tarifiyle nitelendirilmektedir. Dolay\u0131s\u0131yla iki uygulaman\u0131n(client &#8211; API) kendi aralar\u0131nda ileti\u015fim i\u00e7in yetkilendirmesi durumunu Client Credentials ile ger\u00e7ekle\u015ftirmekteyiz. <em><strong>Peki hocam, user ile ilgili yetkilendirme durumunu nas\u0131l ger\u00e7ekle\u015ftirmekteyiz?<\/strong><\/em> \u015feklinde sorunuzu duyar gibiyim&#8230; User ve daha nice durumlarla ilgili i\u015flemlerde kullanaca\u011f\u0131m\u0131z izin tiplerini yaz\u0131 serimizin devam\u0131ndaki makalelerde tek tek ele alaca\u011f\u0131m\u0131z\u0131 bildiririm. O y\u00fczden acele etmeksizin konumuzda kalmaya \u00f6zen g\u00f6sterelim \ud83d\ude42<\/p>\n<blockquote><p><em style=\"color:purple;\">Client Credentials&#8217;da kullan\u0131c\u0131 \u00fcyelik sistemi vs. gibi kullan\u0131c\u0131ya dair operasyonlar bulunmamaktad\u0131r. Sistemdeki yap\u0131lar\u0131n(client &#8211; API) birbirleriyle haberle\u015fmesine dayal\u0131 bir yetkilendirme y\u00f6ntemidir.<\/em><\/p><\/blockquote>\n<h3 style=\"color:#e83e8c;\">IdentityServer4 &#8211; Client Credentials \u0130le Machine to Machine Kimliklendirme \u00d6rne\u011fi<\/h3>\n<p>Evet, i\u00e7eri\u011fimizin bu noktas\u0131ndan itibaren art\u0131k bir IdentityServer4 uygulamas\u0131 aya\u011fa kald\u0131racak ve Client Credentials yetki tipiyle machine to machine yetkilendirmenin nas\u0131l yap\u0131ld\u0131\u011f\u0131n\u0131 t\u00fcm detaylar\u0131yla pratikte inceleyece\u011fiz.<\/p>\n<p>Tabi her prati\u011fin k\u00fc\u00e7\u00fckte olsa bir teorisi vard\u0131r. \u015eu ana kadar att\u0131\u011f\u0131m\u0131z teorik temellerin d\u0131\u015f\u0131nda IdentityServer4 yap\u0131lanmas\u0131n\u0131n da temel kavramlar\u0131 olan &#8220;API Resource&#8221; ve &#8220;API Scope&#8221; terimlerini tan\u0131mlamadan uygulamaya giri\u015fmek, pratikte performans\u0131m\u0131z\u0131 olumsuz etkileyecektir. <\/p>\n<ul>\n<li><strong>API Resource<\/strong><br \/>\nAuth Server uygulamas\u0131n\u0131n sorumlu oldu\u011fu resource&#8217;leri yani API&#8217;leri ifade eder.\n<\/li>\n<li><strong>API Scope<\/strong><br \/>\n\u00dcretilecek token de\u011ferinin API \u00fczerindeki yetki alan\u0131n\u0131 ifade eder. Client, Auth Service \u00fczerinden elde etti\u011fi token&#8217;da hangi scope de\u011ferlerine sahipse ancak o scope de\u011ferlerine sahip olan API&#8217;lara istekte bulunabilir.\n<\/li>\n<\/ul>\n<p>Bu a\u00e7\u0131klamalardan sonra art\u0131k uygulamam\u0131za ba\u015flayabiliriz. Uygulamam\u0131z bir banka senaryosu \u00fczerinden i\u015flevsellik g\u00f6sterecektir. IdentityServer4 uygulamas\u0131 i\u00e7in &#8216;AuthServer&#8217; isimli bir API projesi, Resource Servers i\u00e7in ise &#8216;GarantiAPI&#8217; ve &#8216;HalkBankAPI&#8217; isimli iki adet API projesi olu\u015fturaca\u011f\u0131z. S\u00fcre\u00e7te client olarak Postman&#8217;i kullanaca\u011f\u0131z.<\/p>\n<p><code><strong style=\"color:red;\">dotnet new webapi --name AuthServer <span style=\"color:blue;\">Port : 1000<\/span><\/strong><\/code><br \/>\n<code><strong style=\"color:red;\">dotnet new webapi --name GarantiAPI <span style=\"color:blue;\">Port : 2000<\/span><\/strong><\/code><br \/>\n<code><strong style=\"color:red;\">dotnet new webapi --name HalkBankAPI <span style=\"color:blue;\">Port : 3000<\/span><\/strong><\/code><\/p>\n<p>Hadi kodlayal\u0131m&#8230;<\/p>\n<ul>\n<li><strong>1. Ad\u0131m &#8211; IdentityServer4(AuthServer) Uygulamas\u0131n\u0131 Geli\u015ftirme<\/strong><br \/>\nHer\u015feyden \u00f6nce uygulamam\u0131zda IdentityServer4 konfig\u00fcrasyonunu ger\u00e7ekle\u015ftirebilmek i\u00e7in ilk olarak projeye <a href=\"https:\/\/www.nuget.org\/packages\/identityserver4\/\" rel=\"noopener noreferrer\" target=\"_blank\">IdentityServer4<\/a> k\u00fct\u00fcphanesinin y\u00fcklenmesi gerekmektedir.<\/p>\n<div style=\"text-align:center;\">\n<code>dotnet add package IdentityServer4 --version 4.1.1<\/code>\n<\/div>\n<p>\u0130lgili k\u00fct\u00fcphaneyi y\u00fckledikten sonra art\u0131k IdentityServer4 konfig\u00fcrasyonuna ge\u00e7ebiliriz.<\/p>\n<p>IdentityServer4; hangi client&#8217;\u0131n, hangi yetkilerle(scope), hangi API&#8217;lere(resource) eri\u015fmek istedi\u011fini bilmek ister. Bu y\u00fczden temel konfig\u00fcrasyon olarak bu olgular\u0131 tan\u0131tmam\u0131z gerekmektedir. Bunun i\u00e7in &#8216;AuthServer&#8217; uygulamas\u0131nda &#8216;Config&#8217; ad\u0131nda bir class tasarlayarak gerekli konfig\u00fcrasyonu i\u00e7erisinde ger\u00e7ekle\u015ftirebiliriz.<span style=\"font-size:11px;\">(\u0130nternetteki t\u00fcm kaynaklarda benzer \u00e7al\u0131\u015fma ger\u00e7ekle\u015ftirildi\u011fi i\u00e7in gelene\u011fe riayet ediyor, bizde Config dosyas\u0131 \u00fczerinden \u00e7al\u0131\u015fmam\u0131z\u0131 ger\u00e7ekle\u015ftiriyoruz \ud83d\ude42 )<\/span><\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    static public class Config\r\n    {\r\n        #region Scopes\r\n        \/\/API'larda kullan\u0131lacak izinleri tan\u0131mlar.\r\n        public static IEnumerable&lt;ApiScope&gt; GetApiScopes()\r\n        {\r\n            return new List&lt;ApiScope&gt;\r\n            {\r\n                new ApiScope(&quot;Garanti.Write&quot;,&quot;Garanti bankas\u0131 yazma izni&quot;),\r\n                new ApiScope(&quot;Garanti.Read&quot;,&quot;Garanti bankas\u0131 okuma izni&quot;),\r\n                new ApiScope(&quot;HalkBank.Write&quot;,&quot;HalkBank bankas\u0131 yazma izni&quot;),\r\n                new ApiScope(&quot;HalkBank.Read&quot;,&quot;HalkBank bankas\u0131 okuma izni&quot;),\r\n            };\r\n        }\r\n        #endregion\r\n        #region Resources\r\n        \/\/API'lar tan\u0131mlan\u0131r.\r\n        public static IEnumerable&lt;ApiResource&gt; GetApiResources()\r\n        {\r\n            return new List&lt;ApiResource&gt;\r\n            {\r\n                new ApiResource(&quot;Garanti&quot;){ Scopes = { &quot;Garanti.Write&quot;, &quot;Garanti.Read&quot; } },\r\n                new ApiResource(&quot;HalkBank&quot;){ Scopes = { &quot;HalkBank.Write&quot;, &quot;HalkBank.Read&quot; } }\r\n            };\r\n        }\r\n        #endregion\r\n        #region Clients\r\n        \/\/API'lar\u0131 kullanacak client'lar tan\u0131mlan\u0131r.\r\n        public static IEnumerable&lt;Client&gt; GetClients()\r\n        {\r\n            return new List&lt;Client&gt;\r\n            {\r\n                new Client\r\n                        {\r\n                            ClientId = &quot;GarantiBankasi&quot;,\r\n                            ClientName = &quot;GarantiBankasi&quot;,\r\n                            ClientSecrets = { new Secret(&quot;garanti&quot;.Sha256()) },\r\n                            AllowedGrantTypes = { GrantType.ClientCredentials },\r\n                            AllowedScopes = { &quot;Garanti.Write&quot;, &quot;Garanti.Read&quot; }\r\n                        },\r\n                new Client\r\n                        {\r\n                            ClientId = &quot;HalkBankasi&quot;,\r\n                            ClientName = &quot;HalkBankasi&quot;,\r\n                            ClientSecrets = { new Secret(&quot;halkbank&quot;.Sha256()) },\r\n                            AllowedGrantTypes = { GrantType.ClientCredentials },\r\n                            AllowedScopes = { &quot;HalkBank.Write&quot;, &quot;HalkBank.Read&quot; }\r\n                        }\r\n            };\r\n        }\r\n        #endregion\r\n    }\r\n<\/pre>\n<p>Yukar\u0131daki kaynak koddaki tan\u0131mlanan metotlar\u0131 s\u0131ras\u0131yla ele alal\u0131m; <em><strong>5.<\/strong><\/em> sat\u0131rdaki &#8216;GetApiScopes&#8217; metodu i\u00e7erisinde API&#8217;lar da kullan\u0131lacak olan yetkileri bar\u0131nd\u0131rmaktad\u0131r. <em><strong>18.<\/strong><\/em> sat\u0131rdaki &#8216;GetApiResources&#8217; metodu ise sistemdeki API&#8217;lar\u0131 tan\u0131mlamakta ve dikkat ederseniz yetki alanlar\u0131 &#8216;Scopes&#8217; propertysi ile verilmektedir. <em><strong>29.<\/strong><\/em> sat\u0131rda ise API&#8217;lar\u0131 t\u00fcketecek olan client&#8217;lar tan\u0131mlanmaktad\u0131r. Her bir client&#8217;\u0131n &#8216;CliendId&#8217; ve &#8216;ClientName&#8217; de\u011feri verilmekte ve bununla birlikte &#8216;ClientSecrets&#8217;a verilen de\u011fer &#8216;Sha256&#8217; ile \u015fifrelenerek set edilmektedir. &#8216;AllowedGrantTypes&#8217; propertysi ile bu client&#8217;lar\u0131n yetki tipinin ne oldu\u011fu bildirilmekte ve &#8216;AllowedScopes&#8217; ile de yetkileri bildirilmektedir.<\/p>\n<p>Konfig\u00fcrasyon ayarlar\u0131 bu \u015fekilde tasarland\u0131ktan sonra uygulamaya dahil edilmesi gerekmektedir. Bunun i\u00e7in &#8216;Startup.cs&#8217; dosyas\u0131 \u00fczerindeki &#8216;ConfigureServices&#8217; metodu i\u00e7erisinde a\u015fa\u011f\u0131daki \u00e7al\u0131\u015fman\u0131n yap\u0131lmas\u0131 gerekmektedir.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class Startup\r\n    {\r\n        public void ConfigureServices(IServiceCollection services)\r\n        {\r\n            services.AddIdentityServer()\r\n                .AddInMemoryApiResources(Config.GetApiResources())\r\n                .AddInMemoryApiScopes(Config.GetApiScopes())\r\n                .AddInMemoryClients(Config.GetClients())\r\n                .AddDeveloperSigningCredential();\r\n        }\r\n        .\r\n        .\r\n        .\r\n    }\r\n<\/pre>\n<p>Dikkat ederseniz &#8216;Config&#8217; s\u0131n\u0131f\u0131 i\u00e7erisinde tan\u0131mlanan t\u00fcm konfig\u00fcrasyonlar ilgili alanlarda \u00e7a\u011fr\u0131larak uygulamaya eklenmi\u015ftir. Burada &#8216;AddDeveloperSigningCredential&#8217; metoduna dikkatinizi \u00e7ekmek istiyorum. Asl\u0131nda bu metodun muadili olan &#8216;AddSigningCredential&#8217; metoduda mevcuttur.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/10\/IdentityServer4-Yazi-Serisi-3-Client-Credentials-1.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/10\/IdentityServer4-Yazi-Serisi-3-Client-Credentials-1.jpg\" alt=\"IdentityServer4 Yaz\u0131 Serisi #3 - Client Credentials\" width=\"347\" height=\"148\" class=\"aligncenter size-full wp-image-18317\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/10\/IdentityServer4-Yazi-Serisi-3-Client-Credentials-1.jpg 347w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/10\/IdentityServer4-Yazi-Serisi-3-Client-Credentials-1-300x128.jpg 300w\" sizes=\"auto, (max-width: 347px) 100vw, 347px\" \/><\/a><\/p>\n<p>\u0130kisi aras\u0131ndaki temel fark\u0131 anlayabilmek i\u00e7in JWT imzalama stratejileri hakk\u0131nda k\u00fc\u00e7\u00fckte olsa bilgi sahibi olunmas\u0131 gerekmektedir. Bu stratejiler temelde <em>Simetrik<\/em> yahut <em>Asimetrik<\/em> \u015fifreleme algoritmalar\u0131d\u0131r. JWT, i\u00e7erdi\u011fi bilgileri sald\u0131rganlara kar\u015f\u0131 koruyabilmek i\u00e7in <em>Simetrik<\/em> yahut <em>Asimetrik<\/em> \u015fifreleme algoritmalar\u0131 kullanmaktad\u0131r. <\/p>\n<p><em>Simetrik \u015eifreleme<\/em>; \u015eifrelenecek olan bilgiyi de\u015fifre edebilmek i\u00e7in gizli anahtar kullanan ve kriptografi teknikleri i\u00e7erisinde bilinen en eski lakin bir o kadar da basit bir \u015fifreleme t\u00fcr\u00fcd\u00fcr. \u015eifrelenen veri g\u00f6nderen ve al\u0131c\u0131 taraf\u0131nda bulunmas\u0131 gereken gizli anahtar de\u011fer arac\u0131l\u0131\u011f\u0131yla \u00e7\u00f6z\u00fclebilmektedir. H\u0131zl\u0131 ve efektif bir i\u015flem s\u00fcresinin olmas\u0131ndan dolay\u0131 avantajl\u0131d\u0131r. JWT de\u011feri imzalan\u0131rken kullan\u0131lan de\u011ferin ayn\u0131 zamanda do\u011frulamak i\u00e7in kullan\u0131lmas\u0131 durumudur.<br \/>\n<div id=\"attachment_18320\" style=\"width: 310px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/10\/IdentityServer4-Yazi-Serisi-3-Client-Credentials.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-18320\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/10\/IdentityServer4-Yazi-Serisi-3-Client-Credentials-300x92.png\" alt=\"IdentityServer4 Yaz\u0131 Serisi #3 - Client Credentials\" width=\"300\" height=\"92\" class=\"size-medium wp-image-18320\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/10\/IdentityServer4-Yazi-Serisi-3-Client-Credentials-300x92.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/10\/IdentityServer4-Yazi-Serisi-3-Client-Credentials.png 700w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><p id=\"caption-attachment-18320\" class=\"wp-caption-text\">Simetrik \u015eifreleme<\/p><\/div><\/p>\n<p><em>Asimetrik \u015eifreleme<\/em>; \u015eifre ve de\u015fifre mant\u0131\u011f\u0131n\u0131 kullanan bir \u015fifreleme y\u00f6ntemidir. Haberle\u015fen taraflardan her birinde, birbiriyle matematiksel ba\u011f\u0131 olan ve biri gizli(private-secret) ve bir di\u011feri a\u00e7\u0131k(public) olan birer anahtar bulunmaktad\u0131r. Bu anahtarlardan herhangi biriyle \u015fifreleme yap\u0131l\u0131rken, di\u011feriyle \u015fifre \u00e7\u00f6zme i\u015flemi ger\u00e7ekle\u015ftirilmektedir. Gizli anahtar haberle\u015fen taraflardan sadece birinde bulunmaktad\u0131r ve di\u011fer taraftaki a\u00e7\u0131k anahtar ile do\u011frulan\u0131r. B\u00f6ylece \u015fifre \u00e7\u00f6z\u00fclm\u00fc\u015f olur. A\u00e7\u0131k anahtar herkes taraf\u0131ndan eri\u015filebilirdir, dolay\u0131s\u0131yla i\u00e7eri\u011fi \u00e7ok rahat incelenebilir. Bu durum bir tehlike arz etmemekte, m\u00fchim olan gizli anahtar\u0131n de\u015fifre edilemez olmas\u0131 g\u00fcvenceyi sa\u011flamaktad\u0131r. Yani anlayaca\u011f\u0131n\u0131z bilgiler sadece gizli anahtar\u0131n sahibi taraf\u0131ndan \u00e7\u00f6z\u00fclebilecek \u015fekilde \u015fifrelenmektedir.<\/p>\n<blockquote style=\"color:purple;\"><p><em>Asitmetrik \u015eifreleme, kap\u0131(public key) ve kilit(private key) modeline uygun bir tasar\u0131ma sahiptir.<\/em><\/p><\/blockquote>\n<p><div id=\"attachment_18327\" style=\"width: 310px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/10\/IdentityServer4-Yazi-Serisi-3-Client-Credentials-1.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-18327\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/10\/IdentityServer4-Yazi-Serisi-3-Client-Credentials-1-300x165.png\" alt=\"IdentityServer4 Yaz\u0131 Serisi #3 - Client Credentials\" width=\"300\" height=\"165\" class=\"size-medium wp-image-18327\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/10\/IdentityServer4-Yazi-Serisi-3-Client-Credentials-1-300x165.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/10\/IdentityServer4-Yazi-Serisi-3-Client-Credentials-1.png 700w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><p id=\"caption-attachment-18327\" class=\"wp-caption-text\">Asimetrik \u015eifreleme<\/p><\/div><br \/>\nIdentityServer4 framework&#8217;\u00fc JWT&#8217;leri imzalamak i\u00e7in Asimetrik \u015eifreleme&#8217;yi kullanmaktad\u0131r. A\u015fa\u011f\u0131daki \u015femada oldu\u011fu gibi &#8216;AuthServer&#8217; client&#8217;tan gelen talep neticesinde token da\u011f\u0131tmadan \u00f6nce ilgili token&#8217;\u0131 private key ile \u015fifreler ve ard\u0131ndan ilgili client&#8217;a g\u00f6nderir. Client bu \u015fifrelenmi\u015f token de\u011feri ile API&#8217;a istekte bulunacak ve API&#8217;nda bu iste\u011fi do\u011frulamas\u0131 gerekecektir. Bunun i\u00e7in public key&#8217;e ihtiyac\u0131 vard\u0131r. Dolay\u0131s\u0131yla API&#8217;da &#8216;AuthServer&#8217;dan public key&#8217;i al\u0131r. Velhas\u0131l, gelen istekteki private key ile API&#8217;da ki public key uyumu kontrol edilir ve do\u011frulama neticesinde istek ba\u015far\u0131yla sonu\u00e7lan\u0131r.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/10\/IdentityServer4-Yazi-Serisi-3-Client-Credentials-2.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/10\/IdentityServer4-Yazi-Serisi-3-Client-Credentials-2.jpg\" alt=\"IdentityServer4 Yaz\u0131 Serisi #3 - Client Credentials\" width=\"1162\" height=\"615\" class=\"aligncenter size-full wp-image-18330\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/10\/IdentityServer4-Yazi-Serisi-3-Client-Credentials-2.jpg 1162w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/10\/IdentityServer4-Yazi-Serisi-3-Client-Credentials-2-300x159.jpg 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/10\/IdentityServer4-Yazi-Serisi-3-Client-Credentials-2-1024x542.jpg 1024w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/10\/IdentityServer4-Yazi-Serisi-3-Client-Credentials-2-768x406.jpg 768w\" sizes=\"auto, (max-width: 1162px) 100vw, 1162px\" \/><\/a><br \/>\nAPI bu \u015fekilde bir algoritmayla, gelen istekteki token de\u011ferinin &#8216;AuthServer&#8217;da \u00fcretilen token olup olmad\u0131\u011f\u0131n\u0131 do\u011frulam\u0131\u015f olmaktad\u0131r.<\/p>\n<p>Nihai olarak; &#8216;AddDeveloperSigningCredential&#8217; metodu development esnas\u0131nda private ve public keyleri kendisinin otomatik olu\u015fturaca\u011f\u0131n\u0131 ifade eder. &#8216;AddSigningCredential&#8217; metodu ise production&#8217;a \u00e7\u0131kt\u0131\u011f\u0131nda(\u00f6rne\u011fin Azure) kullan\u0131lacak olan bir se\u00e7enektir.<\/p>\n<p>T\u00fcm bu \u00e7al\u0131\u015fmadan sonra yap\u0131lmas\u0131 gereken son i\u015flem &#8216;UseIdentityServer&#8217; middleware&#8217;ini &#8216;UseAuthorization&#8217; middleware&#8217;inden \u00f6nce \u00e7a\u011f\u0131rmakt\u0131r.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class Startup\r\n    {\r\n        .\r\n        .\r\n        .\r\n        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)\r\n        {\r\n            .\r\n            .\r\n            .\r\n            app.UseIdentityServer();\r\n            app.UseAuthorization();\r\n            .\r\n            .\r\n            .\r\n        }\r\n    }\r\n<\/pre>\n<\/li>\n<li><strong>2. Ad\u0131m &#8211; Geli\u015ftirilen IdentityServer4(AuthServer) Uygulamas\u0131n\u0131 Aya\u011fa Kald\u0131rma<\/strong><br \/>\nGeli\u015ftirilen &#8216;AuthServer&#8217; projesinin token \u00fcretip \u00fcretmedi\u011fini denetleyebilmek i\u00e7in test ama\u00e7l\u0131 aya\u011fa kald\u0131rmam\u0131z gerekmektedir.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/10\/IdentityServer4-Yazi-Serisi-3-Client-Credentials-3.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/10\/IdentityServer4-Yazi-Serisi-3-Client-Credentials-3.jpg\" alt=\"IdentityServer4 Yaz\u0131 Serisi #3 - Client Credentials\" width=\"684\" height=\"321\" class=\"aligncenter size-full wp-image-18341\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/10\/IdentityServer4-Yazi-Serisi-3-Client-Credentials-3.jpg 684w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/10\/IdentityServer4-Yazi-Serisi-3-Client-Credentials-3-300x141.jpg 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/10\/IdentityServer4-Yazi-Serisi-3-Client-Credentials-3-520x245.jpg 520w\" sizes=\"auto, (max-width: 684px) 100vw, 684px\" \/><\/a><br \/>\nIdentityServer4 i\u015flevsel a\u00e7\u0131dan i\u015fe yarar baz\u0131 endpointleri hali haz\u0131rda b\u00fcnyesinde bar\u0131nd\u0131rmaktad\u0131r. Bunlardan token talebinde bulunabilmek i\u00e7in <code style=\"color:gray;\"><strong>\/connect\/token<\/strong><\/code> endpoint&#8217;ini kullanabiliriz.<\/p>\n<p>\u0130lgili endpoint&#8217;e a\u015fa\u011f\u0131daki body bilgilerini bar\u0131nd\u0131ran POST iste\u011finde bulunulmas\u0131 yeterlidir.<\/p>\n<table>\n<tr>\n<td><strong>client_id<\/strong><\/td>\n<td>Hangi client&#8217;tan talep geldi\u011fini ifade eder.<\/td>\n<\/tr>\n<tr>\n<td><strong>client_secret<\/strong><\/td>\n<td>Client&#8217;a ait secret de\u011ferini ifade eder.<\/td>\n<\/tr>\n<tr>\n<td><strong>grant_type<\/strong><\/td>\n<td>Yetki tipini ifade eder.<\/td>\n<\/tr>\n<\/table>\n<p><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/10\/IdentityServer4-Yazi-Serisi-3-Client-Credentials-4.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/10\/IdentityServer4-Yazi-Serisi-3-Client-Credentials-4.jpg\" alt=\"IdentityServer4 Yaz\u0131 Serisi #3 - Client Credentials\" width=\"843\" height=\"506\" class=\"aligncenter size-full wp-image-18346\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/10\/IdentityServer4-Yazi-Serisi-3-Client-Credentials-4.jpg 843w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/10\/IdentityServer4-Yazi-Serisi-3-Client-Credentials-4-300x180.jpg 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/10\/IdentityServer4-Yazi-Serisi-3-Client-Credentials-4-768x461.jpg 768w\" sizes=\"auto, (max-width: 843px) 100vw, 843px\" \/><\/a><br \/>\nG\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere ilgili alanlara &#8216;Config&#8217; dosyas\u0131nda belirtilen konfig\u00fcrasyonlardaki de\u011ferler girilerek istekte bulunuldu\u011funda ilgili client&#8217;a ait token de\u011feri ba\u015far\u0131yla \u00fcretilip, d\u00f6nd\u00fcr\u00fclmektedir.<\/p>\n<p>Burada k\u00fc\u00e7\u00fck bir noktaya temas etmek istiyorum. IdentityServer4(AuthServer) uygulamas\u0131n\u0131 aya\u011fa kald\u0131rd\u0131\u011f\u0131m\u0131z zaman uygulama i\u00e7erisinde otomatik olarak &#8216;tempkey.jwk&#8217; dosyas\u0131 olu\u015fturulmaktad\u0131r. Bu dosyan\u0131n korunmaya ihtiyac\u0131 yoktur. Silindi\u011fi taktirde yine tekrardan otomatik olu\u015fturulmaktad\u0131r. \u0130\u015flevsel a\u00e7\u0131dan &#8216;AddDeveloperSigningCredential&#8217; metodunun olu\u015fturaca\u011f\u0131 keyleri tutmaktad\u0131r. \u0130\u00e7eri\u011fi a\u015fa\u011f\u0131daki gibidir;<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/10\/IdentityServer4-Yazi-Serisi-3-Client-Credentials-5.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/10\/IdentityServer4-Yazi-Serisi-3-Client-Credentials-5-300x47.jpg\" alt=\"IdentityServer4 Yaz\u0131 Serisi #3 - Client Credentials\" width=\"300\" height=\"47\" class=\"aligncenter size-medium wp-image-18350\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/10\/IdentityServer4-Yazi-Serisi-3-Client-Credentials-5-300x47.jpg 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/10\/IdentityServer4-Yazi-Serisi-3-Client-Credentials-5-1024x161.jpg 1024w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/10\/IdentityServer4-Yazi-Serisi-3-Client-Credentials-5-768x120.jpg 768w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/10\/IdentityServer4-Yazi-Serisi-3-Client-Credentials-5-1536x241.jpg 1536w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/10\/IdentityServer4-Yazi-Serisi-3-Client-Credentials-5.jpg 1721w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>B\u00f6ylece IdentityServer4 uygulamas\u0131n\u0131n ba\u015far\u0131yla \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 test etmi\u015f olduk. \u015eimdi s\u0131ra API&#8217;lar\u0131 geli\u015ftirmeye gelmi\u015ftir&#8230;\n<\/li>\n<li><strong>3. Ad\u0131m &#8211; API&#8217;lar\u0131n Geli\u015ftirilmesi<\/strong><br \/>\n&#8216;AuthServer&#8217; uygulamas\u0131n\u0131n koruyaca\u011f\u0131 API&#8217;lerin i\u00e7eri\u011fini sembolik olarak a\u015fa\u011f\u0131daki gibi geli\u015ftirmemiz yeterli olacakt\u0131r. Nihayetinde burada API&#8217;lar\u0131n verecekleri hizmetlerden ziyade geli\u015fimsel \u00f6zellikleri \u00f6nplanda olacakt\u0131r.<br \/>\n<u>GarantiAPI;<\/u><\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    &#x5B;Route(&quot;api\/&#x5B;controller]\/&#x5B;action]&quot;)]\r\n    &#x5B;ApiController]\r\n    &#x5B;Authorize]\r\n    public class GarantiBankController : ControllerBase\r\n    {\r\n        &#x5B;HttpGet(&quot;{musteriId}&quot;)]\r\n        public double Bakiye(int musteriId)\r\n        {\r\n            \/\/....\r\n            return 1000;\r\n        }\r\n        &#x5B;HttpGet(&quot;{musteriId}&quot;)]\r\n        public List&lt;string&gt; TumHesaplar(int musteriId)\r\n        {\r\n            \/\/....\r\n            return new()\r\n            {\r\n                &quot;123456789&quot;,\r\n                &quot;987654321&quot;,\r\n                &quot;564738291&quot;\r\n            };\r\n        }\r\n    }\r\n<\/pre>\n<p><u>HalkBankAPI;<\/u><\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    &#x5B;Route(&quot;api\/&#x5B;controller]\/&#x5B;action]&quot;)]\r\n    &#x5B;ApiController]\r\n    &#x5B;Authorize]\r\n    public class HalkBankController : ControllerBase\r\n    {\r\n        &#x5B;HttpGet(&quot;{musteriID}&quot;)]\r\n        public double Bakiye(int musteriId)\r\n        {\r\n            \/\/....\r\n            return 500.15;\r\n        }\r\n        &#x5B;HttpGet(&quot;{musteriID}&quot;)]\r\n        public List&lt;string&gt; TumHesaplar(int musteriId)\r\n        {\r\n            \/\/....\r\n            return new()\r\n            {\r\n                &quot;135792468&quot;,\r\n                &quot;019283745&quot;,\r\n                &quot;085261060&quot;\r\n            };\r\n        }\r\n    }\r\n<\/pre>\n<p>Burada as\u0131l \u00f6nemli olan nokta, API&#8217;lar\u0131n client&#8217;tan gelen request&#8217;te ki token&#8217;\u0131 nas\u0131l do\u011frulayacaklar\u0131n\u0131 \u00f6\u011frenmeleri gerekmektedir. Yukar\u0131daki sat\u0131rlardan da biliyoruz ki token(access_token) private key ile imzalanmaktad\u0131r. \u0130\u015fte imzalanm\u0131\u015f bu token API&#8217;lar da public key ile do\u011frulanmal\u0131d\u0131r.<\/p>\n<p>API&#8217;lar da gelecek token de\u011ferlerini do\u011frulayabilmek i\u00e7in \u00f6ncelikle ilgili API&#8217;lara <a href=\"https:\/\/www.nuget.org\/packages\/Microsoft.AspNetCore.Authentication.JwtBearer\" rel=\"noopener noreferrer\" target=\"_blank\">Microsoft.AspNetCore.Authentication.JwtBearer<\/a> k\u00fct\u00fcphanesinin y\u00fcklenmesi gerekmektedir. Ard\u0131ndan t\u00fcm\u00fcnde a\u015fa\u011f\u0131daki \u00e7al\u0131\u015fma ger\u00e7ekle\u015ftirilmelidir.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class Startup\r\n    {\r\n\r\n        public void ConfigureServices(IServiceCollection services)\r\n        {\r\n            .\r\n            .\r\n            .\r\n            services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)\r\n                    .AddJwtBearer(JwtBearerDefaults.AuthenticationScheme, options =&gt;\r\n                    {\r\n                        \/\/Token'\u0131 yay\u0131nlayan Auth Server adresi bildiriliyor. Yani yetkiyi da\u011f\u0131tan mekanizman\u0131n adresi bildirilerek ilgili API ile ili\u015fkilendiriliyor.\r\n                        options.Authority = &quot;https:\/\/localhost:1000&quot;;\r\n                        \/\/Auth Server uygulamas\u0131ndaki 'Garanti' isimli resource ile bu API ili\u015fkilendiriliyor.\r\n                        options.Audience = &quot;Garanti&quot;;\r\n                    });\r\n            .\r\n            .\r\n            .\r\n        }\r\n        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)\r\n        {\r\n            .\r\n            .\r\n            .\r\n            app.UseAuthentication();\r\n            app.UseAuthorization();\r\n            .\r\n            .\r\n            .\r\n        }\r\n    }\r\n<\/pre>\n<p>Yukar\u0131daki kaynak kodda &#8216;GarantiAPI&#8217; uygulamas\u0131n\u0131n konfig\u00fcrasyonu bulunmaktad\u0131r. Benzer uygulamay\u0131 &#8216;HalkBankAPI&#8217; uygulamas\u0131 i\u00e7inde ger\u00e7ekle\u015ftirmemiz gerekmektedir. Tabi ki de \u00f6rneklendirmemizdeki &#8216;HalkBankAPI&#8217;a kar\u015f\u0131l\u0131k geli\u015ftirmeyi her ne kadar sizlere b\u0131rakm\u0131\u015f olsamda, yaz\u0131lm\u0131\u015f halini makalemizin nihayetinde payla\u015faca\u011f\u0131m \u00f6rnek projede somut olarak inceleyebilirsiniz. Velhas\u0131l, \u015fimdi biz yukar\u0131daki kaynak kodun mealine odaklan\u0131rsak e\u011fer; <strong><em>9.<\/em><\/strong> sat\u0131rda &#8216;AddAuthentication&#8217; servisinin uygulamaya dahil edildi\u011fini g\u00f6rmekteyiz ve \u015fema ad\u0131 olarak &#8216;JwtBearerDefaults.AuthenticationScheme&#8217; sabitinin ta\u015f\u0131d\u0131\u011f\u0131 &#8216;Bearer&#8217; de\u011feri verilmektedir. Bu de\u011fer(\u015fema ad\u0131) uygulamada authentication instance&#8217;\u0131n\u0131 tutan bir nitelik kazanmaktad\u0131r. \u0130stek do\u011frultusunda farkl\u0131 bir isimde verilebilmektedir. <strong><em>10.<\/em><\/strong> sat\u0131r\u0131 incelersek e\u011fer &#8216;AddJwtBearer&#8217; servisi eklenerek uygulamada JWT entegrasyonu sa\u011flanm\u0131\u015ft\u0131r. \u0130\u00e7erik olarak yine ayn\u0131 \u015fema ad\u0131 bildirilmekte ve b\u00f6ylece uygulamadaki bir \u00f6nceki metotta eklenen ayn\u0131 \u015fema ad\u0131ndaki authentication mekanizmas\u0131 JWT ile ba\u011fda\u015ft\u0131r\u0131lmaktad\u0131r. Konfig\u00fcrasyon a\u00e7\u0131s\u0131ndan olay\u0131 de\u011ferlendirirsek e\u011fer <strong><em>13.<\/em><\/strong> sat\u0131rda &#8216;Authority&#8217; bilgisi verilerek bu API&#8217;\u0131n hangi Auth Server taraf\u0131ndan korundu\u011fu, ba\u015fka bir deyi\u015fle yetkilisinin kim oldu\u011fu bildirilmektedir. <strong><em>15.<\/em><\/strong> sat\u0131rda ise &#8216;Audience&#8217; ile Auth Server&#8217;da ki hangi resource&#8217;e kar\u015f\u0131l\u0131k geldi\u011fi bildirilmekte ve b\u00f6ylece API ile ili\u015fkilendirilmektedir. Son olarak <strong><em>26.<\/em><\/strong> sat\u0131rda &#8216;UseAuthentication&#8217; ve pe\u015finen &#8216;UseAuthorization&#8217; middleware&#8217;leri \u00e7a\u011fr\u0131larak uygulama kimlik do\u011frulamaya  genel hatlar\u0131yla haz\u0131r hale getirilmektedir.<\/p>\n<p>Art\u0131k bu API&#8217;a bir istek gelince &#8216;Authority&#8217;de tan\u0131mlanm\u0131\u015f olan ilgili Auth Server&#8217;a gidecek ve public key&#8217;i alacakt\u0131r. Ard\u0131ndan private key ile imzalanm\u0131\u015f olan access token de\u011ferini bu public key ile do\u011frulayacak ve b\u00f6ylece token&#8217;\u0131n ger\u00e7ek bir token oldu\u011funu anlam\u0131\u015f olacakt\u0131r.<\/p>\n<p>Ayriyetten IdentityServer4 k\u00fct\u00fcphanesinin konfig\u00fcrasyon kolayl\u0131\u011f\u0131na dair dikkatinizi \u00e7ekmek istiyorum. Normalde <a href=\"https:\/\/www.gencayyildiz.com\/blog\/asp-net-core-3-1-ile-token-bazli-kimlik-dogrulamasi-ve-refresh-token-kullanimijwt\/\" rel=\"noopener noreferrer\" target=\"_blank\">Token Bazl\u0131 Kimlik Do\u011frulama(JWT)<\/a> makalemi incelerseniz e\u011fer bir API&#8217;da ki gelen token&#8217;\u0131 do\u011frulayabilmek i\u00e7in &#8216;SymmetricSecurityKey&#8217; vs. gibi \u00f6zellikleri belirlememiz gerekmektedir. Halbuki g\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere IdentityServer4 ile API&#8217;lar da bu gibi konfig\u00fcrasyonlara gerek duyulmamaktad\u0131r.\n<\/li>\n<\/ul>\n<h3 style=\"color:#e83e8c;\">Test Edelim<\/h3>\n<p>\u015eimdi geli\u015ftirilen t\u00fcm uygulamalar\u0131 aya\u011fa kald\u0131rarak test edelim.<\/p>\n<table>\n<tbody>\n<tr>\n<td style=\"text-align:left;\"><em>Uygulamalar\u0131n aya\u011fa kald\u0131r\u0131lmas\u0131<\/em><\/td>\n<td style=\"text-align:left;\"><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/10\/IdentityServer4-Yazi-Serisi-3-Client-Credentials-6.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/10\/IdentityServer4-Yazi-Serisi-3-Client-Credentials-6-300x172.jpg\" alt=\"IdentityServer4 Yaz\u0131 Serisi #3 - Client Credentials\" width=\"300\" height=\"172\" class=\"aligncenter size-medium wp-image-18380\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/10\/IdentityServer4-Yazi-Serisi-3-Client-Credentials-6-300x172.jpg 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/10\/IdentityServer4-Yazi-Serisi-3-Client-Credentials-6-1024x588.jpg 1024w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/10\/IdentityServer4-Yazi-Serisi-3-Client-Credentials-6-768x441.jpg 768w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/10\/IdentityServer4-Yazi-Serisi-3-Client-Credentials-6-1536x883.jpg 1536w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/10\/IdentityServer4-Yazi-Serisi-3-Client-Credentials-6.jpg 1848w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/td>\n<\/tr>\n<tr>\n<td style=\"text-align:left;\"><em>Postman ile API&#8217;a istek g\u00f6nderme<\/em><\/td>\n<td style=\"text-align:left;\"><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/10\/IdentityServer4-Yazi-Serisi-3-Client-Credentials-7.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/10\/IdentityServer4-Yazi-Serisi-3-Client-Credentials-7-300x105.jpg\" alt=\"IdentityServer4 Yaz\u0131 Serisi #3 - Client Credentials\" width=\"300\" height=\"105\" class=\"aligncenter size-medium wp-image-18382\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/10\/IdentityServer4-Yazi-Serisi-3-Client-Credentials-7-300x105.jpg 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/10\/IdentityServer4-Yazi-Serisi-3-Client-Credentials-7-768x270.jpg 768w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/10\/IdentityServer4-Yazi-Serisi-3-Client-Credentials-7.jpg 846w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><br \/>\nG\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere client direkt olarak API&#8217;a istek g\u00f6nderdi\u011finde 401(Unauthorized) hata kodu almaktad\u0131r. \u015eimdi yapmas\u0131 gereken Auth Server&#8217;a gidip bir token talebinde bulunmakt\u0131r.\n<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align:left;\"><em>Auth Server&#8217;dan token talebinde bulunma<\/em><\/td>\n<td style=\"text-align:left;\"><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/10\/IdentityServer4-Yazi-Serisi-3-Client-Credentials-8.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/10\/IdentityServer4-Yazi-Serisi-3-Client-Credentials-8-300x200.jpg\" alt=\"IdentityServer4 Yaz\u0131 Serisi #3 - Client Credentials\" width=\"300\" height=\"200\" class=\"aligncenter size-medium wp-image-18387\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/10\/IdentityServer4-Yazi-Serisi-3-Client-Credentials-8-300x200.jpg 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/10\/IdentityServer4-Yazi-Serisi-3-Client-Credentials-8.jpg 759w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><br \/>\nToken talebi yap\u0131l\u0131rken body&#8217;den &#8216;client_id&#8217;, &#8216;client_secret&#8217; ve &#8216;grant_type&#8217; de\u011ferlerinin verildi\u011fine dikkatinizi \u00e7ekerim. Bu de\u011ferler makale seyrimiz boyunca de\u011findi\u011fimiz Auth Server&#8217;da ki client kar\u015f\u0131l\u0131klar\u0131d\u0131r.\n<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align:left;\"><em>Token ile API&#8217;a talepte bulunma<\/em><\/td>\n<td style=\"text-align:left;\"><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/10\/IdentityServer4-Yazi-Serisi-3-Client-Credentials-9.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/10\/IdentityServer4-Yazi-Serisi-3-Client-Credentials-9-300x144.jpg\" alt=\"IdentityServer4 Yaz\u0131 Serisi #3 - Client Credentials\" width=\"300\" height=\"144\" class=\"aligncenter size-medium wp-image-18389\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/10\/IdentityServer4-Yazi-Serisi-3-Client-Credentials-9-300x144.jpg 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/10\/IdentityServer4-Yazi-Serisi-3-Client-Credentials-9-768x370.jpg 768w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/10\/IdentityServer4-Yazi-Serisi-3-Client-Credentials-9.jpg 848w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><br \/>\nToken ile API&#8217;a talepte bulunabilmek i\u00e7in &#8216;Authorization&#8217; sekmesinden &#8216;OAuth 2.0&#8217; type&#8217;\u0131n\u0131 se\u00e7erek, &#8216;Header Prefix&#8217; &#8216;Bearer&#8217; kar\u015f\u0131l\u0131\u011f\u0131nda, &#8216;Access Token&#8217; alan\u0131na elde edilen token de\u011feri verilmeli ve o \u015fekilde istek g\u00f6nderilmelidir. G\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere istek ba\u015far\u0131l\u0131 bir \u015fekilde sonu\u00e7lanacakt\u0131r.<\/p>\n<p>Lakin elde edilen token ile &#8216;HalkBankAPI&#8217;a istek yapmak istersek e\u011fer;<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/10\/IdentityServer4-Yazi-Serisi-3-Client-Credentials-10.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/10\/IdentityServer4-Yazi-Serisi-3-Client-Credentials-10-300x122.jpg\" alt=\"IdentityServer4 Yaz\u0131 Serisi #3 - Client Credentials\" width=\"300\" height=\"122\" class=\"aligncenter size-medium wp-image-18394\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/10\/IdentityServer4-Yazi-Serisi-3-Client-Credentials-10-300x122.jpg 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/10\/IdentityServer4-Yazi-Serisi-3-Client-Credentials-10-768x312.jpg 768w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/10\/IdentityServer4-Yazi-Serisi-3-Client-Credentials-10.jpg 839w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><br \/>\n401 durum koduyla kar\u015f\u0131la\u015f\u0131lacakt\u0131r. Bunun nedeni ilgili token&#8217;\u0131n sadece &#8216;GarantiAPI&#8217;a eri\u015fim sa\u011flayabilmesidir. &#8216;HalkBankAPI&#8217;a talep yap\u0131labilmesi i\u00e7in client&#8217;\u0131n Auth Server&#8217;dan ilgili API&#8217;a ait bir token de\u011feri istemesi ve elde edece\u011fi token ile talepte bulunmas\u0131 gerekmektedir;<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/10\/IdentityServer4-Yazi-Serisi-3-Client-Credentials-11.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/10\/IdentityServer4-Yazi-Serisi-3-Client-Credentials-11-300x178.jpg\" alt=\"IdentityServer4 Yaz\u0131 Serisi #3 - Client Credentials\" width=\"300\" height=\"178\" class=\"aligncenter size-medium wp-image-18396\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/10\/IdentityServer4-Yazi-Serisi-3-Client-Credentials-11-300x178.jpg 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/10\/IdentityServer4-Yazi-Serisi-3-Client-Credentials-11-768x455.jpg 768w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/10\/IdentityServer4-Yazi-Serisi-3-Client-Credentials-11.jpg 838w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/10\/IdentityServer4-Yazi-Serisi-3-Client-Credentials-12.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/10\/IdentityServer4-Yazi-Serisi-3-Client-Credentials-12-300x132.jpg\" alt=\"IdentityServer4 Yaz\u0131 Serisi #3 - Client Credentials\" width=\"300\" height=\"132\" class=\"aligncenter size-medium wp-image-18397\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/10\/IdentityServer4-Yazi-Serisi-3-Client-Credentials-12-300x132.jpg 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/10\/IdentityServer4-Yazi-Serisi-3-Client-Credentials-12-768x337.jpg 768w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/10\/IdentityServer4-Yazi-Serisi-3-Client-Credentials-12.jpg 844w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>G\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere IdentityServer4 uygulamam\u0131z\u0131n testi ba\u015far\u0131yla sonu\u00e7lanm\u0131\u015ft\u0131r. \u015eimdi son olarak \u00fcretilen JWT yap\u0131lanmas\u0131n\u0131n nas\u0131l bir i\u00e7eri\u011fe sahip oldu\u011funu inceleyerek makalemizi noktalayal\u0131m.<\/p>\n<h3 style=\"color:#e83e8c;\">JWT \u0130ncelemesi<\/h3>\n<p>\u00dcretilen JWT de\u011ferini a\u00e7abilmek ve \u00fczerinde tutulan de\u011ferleri(Payload) inceleyebilmek i\u00e7in decode etmemiz gerekmektedir. Bunun i\u00e7in <a href=\"https:\/\/jwt.io\/\" rel=\"noopener noreferrer\" target=\"_blank\">jwt.io<\/a> adresini kullanabilirsiniz. \u0130lgili adreste a\u00e7\u0131lan forma elinizdeki JWT de\u011ferini verirseniz e\u011fer decode edip, ta\u015f\u0131d\u0131\u011f\u0131 t\u00fcm payload&#8217;lar\u0131 sizlere g\u00f6sterecektir.<br \/>\n<div id=\"attachment_18401\" style=\"width: 951px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/10\/IdentityServer4-Yazi-Serisi-3-Client-Credentials-13.jpg\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-18401\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/10\/IdentityServer4-Yazi-Serisi-3-Client-Credentials-13.jpg\" alt=\"IdentityServer4 Yaz\u0131 Serisi #3 - Client Credentials\" width=\"941\" height=\"599\" class=\"size-full wp-image-18401\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/10\/IdentityServer4-Yazi-Serisi-3-Client-Credentials-13.jpg 941w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/10\/IdentityServer4-Yazi-Serisi-3-Client-Credentials-13-300x191.jpg 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/10\/IdentityServer4-Yazi-Serisi-3-Client-Credentials-13-768x489.jpg 768w\" sizes=\"auto, (max-width: 941px) 100vw, 941px\" \/><\/a><p id=\"caption-attachment-18401\" class=\"wp-caption-text\">\u00d6rnek ama\u00e7l\u0131 HalkBankAPI i\u00e7in \u00fcretilen JWT de\u011feri kullan\u0131lm\u0131\u015ft\u0131r&#8230;<\/p><\/div><\/p>\n<p>Burada JWT i\u00e7erisindeki \u015fifrelenmi\u015f t\u00fcm Payload&#8217;lar\u0131 g\u00f6rebilmek sizler a\u00e7\u0131s\u0131ndan hafif bir ku\u015fkuya mahal vermi\u015f olabilir ve <em><strong>hani burada g\u00fcvenlik!<\/strong><\/em> sorusunu sorman\u0131z\u0131 sa\u011flayabilir. Evet, JWT&#8217;ler bu \u015fekilde decode edilebilmektedir ama server&#8217;da ki hashlenmi\u015f secret key&#8217;i bilmeden kimse herhangi bir valid de\u011fer \u00fcretememektedir. Bu da token&#8217;\u0131n public olmas\u0131na herhangi bir sak\u0131nca getirmemektedir. <\/p>\n<p>Velhas\u0131l, yukar\u0131da decode edilmi\u015f olan JWT payload&#8217;lar\u0131na g\u00f6z atarsak e\u011fer;<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/10\/IdentityServer4-Yazi-Serisi-3-Client-Credentials-14.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/10\/IdentityServer4-Yazi-Serisi-3-Client-Credentials-14.jpg\" alt=\"IdentityServer4 Yaz\u0131 Serisi #3 - Client Credentials\" width=\"379\" height=\"267\" class=\"alignleft size-full wp-image-18406\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/10\/IdentityServer4-Yazi-Serisi-3-Client-Credentials-14.jpg 379w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/10\/IdentityServer4-Yazi-Serisi-3-Client-Credentials-14-300x211.jpg 300w\" sizes=\"auto, (max-width: 379px) 100vw, 379px\" \/><\/a><br \/>\ng\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere t\u00fcm bilgiler kar\u015f\u0131m\u0131zdad\u0131r. Burada <span style=\"color:#E75480;\">aud(Audience)<\/span> de\u011feri bu JWT&#8217;nin hangi resource taraf\u0131ndan kabul edilece\u011fini, <span style=\"color:#E75480;\">client_id<\/span> de\u011feri istek yapan client&#8217;\u0131n Auth Server&#8217;da ki kimlik bilgisini ve <span style=\"color:#E75480;\">scope<\/span> de\u011feri ise ilgili client&#8217;\u0131n ta\u015f\u0131d\u0131\u011f\u0131 t\u00fcm yetkilerini bildirmektedir.<\/p>\n<p><strong>Sonu\u00e7<\/strong><br \/>\nBu makalemizde IdentityServer4 temellerini pratikte t\u00fcm detaylar\u0131yla ele alm\u0131\u015f, bir Auth Server&#8217;dan nas\u0131l token talebinde bulunulabilece\u011fini, client&#8217;\u0131n elde etti\u011fi token ile ne \u015fekilde API&#8217;lara eri\u015fim sa\u011flayabilece\u011fini vs. \u00fczerinde uzun uzun isti\u015fare ederek \u00f6rneklendirmi\u015f bulunmaktay\u0131z. Bundan sonra herhangi bir client uygulamas\u0131 \u00fczerinden bu operasyonun nas\u0131l ger\u00e7ekle\u015ftirilebilece\u011fini \u00e7ok rahat anlayabilecek seviyede temellerin at\u0131ld\u0131\u011f\u0131n\u0131 d\u00fc\u015f\u00fcnmekteyim. Sonraki i\u00e7eriklerimizde ad\u0131m ad\u0131m yetkilendirme boyutunu detayland\u0131racak ve olay\u0131 daha kurumsal uygulamalarda profesyonel \u00e7al\u0131\u015fmalar yapabilecek noktalara getirece\u011fiz&#8230;<\/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 \u00e7al\u0131\u015fmay\u0131 indirebilmek i\u00e7in <a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/10\/IdentityServer4Example.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 bu \u00fc\u00e7\u00fcnc\u00fc makalesinde Client Credential yetki tipi ile gerekli konfig\u00fcrasyonlar e\u015fli\u011finde IdentityServer4 uygulamas\u0131 geli\u015ftirecek ve aya\u011fa kald\u0131raca\u011f\u0131z. Client Credential; machine to machine kimliklendirme dedi\u011fimiz iki uygulama aras\u0131ndaki etkile\u015fime istinaden kullan\u0131lan&#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":[3849,3850,3852,3843,3844,3845,3827,3841,3842,3846,3847,3840,3848,3851],"class_list":["post-18269","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-identityserver4","tag-api-resource","tag-api-scope","tag-asimetrik-sifreleme","tag-client-credential","tag-client-id","tag-client-secret","tag-identityserver4","tag-identityserver4-ayaga-kaldirma","tag-identityserver4-client-credential","tag-identityserver4-client-id","tag-identityserver4-client-secret","tag-identityserver4-uygulamasi","tag-machine-to-machine","tag-simetrik-sifreleme"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/18269","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=18269"}],"version-history":[{"count":123,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/18269\/revisions"}],"predecessor-version":[{"id":18413,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/18269\/revisions\/18413"}],"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=18269"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=18269"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=18269"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}