<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: rustambekov</title>
    <description>The latest articles on DEV Community by rustambekov (@rustambekov).</description>
    <link>https://dev.to/rustambekov</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F280216%2Fd9d8cf45-1249-4ff3-bec6-640389660941.jpg</url>
      <title>DEV Community: rustambekov</title>
      <link>https://dev.to/rustambekov</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/rustambekov"/>
    <language>en</language>
    <item>
      <title>Open Authorization v2.0 OAuth2 mikro servislar xavfsizligi</title>
      <dc:creator>rustambekov</dc:creator>
      <pubDate>Mon, 16 Sep 2024 07:09:16 +0000</pubDate>
      <link>https://dev.to/rustambekov/open-authorization-v20-oauth2-mikro-servislar-xavfsizligi-j25</link>
      <guid>https://dev.to/rustambekov/open-authorization-v20-oauth2-mikro-servislar-xavfsizligi-j25</guid>
      <description>&lt;h1&gt;
  
  
  So'z boshi
&lt;/h1&gt;

&lt;p&gt;Mikroservislardan iborat  API-ni taqdim qilishda e'tiborga olish kerak bo'lgan eng muhim jihatlardan biri bu xavfsizlikdir. Springni ba'zi qiziqarli xususiyatlari va frameworklari bor, bu bizning mikroservislarimiz xavfsizligini sozlashni osonlashtiradi. Ushbu maqolada sizga API shlyuzini token orqali himoyalash uchun Spring Cloud va OAuth2dan qanday foydalanishni ko'rsataman.&lt;/p&gt;

&lt;h1&gt;
  
  
  Nazariya
&lt;/h1&gt;

&lt;p&gt;OAuth2 standarti hozirda umumiy API orqali o'z manbalariga kirishga imkon beradigan barcha yirik veb-saytlar tomonidan qo'llaniladi. Bu foydalanuvchilarga bir sahifada saqlangan shaxsiy manbalarini boshqa sahifaga authenticatsiya xizmatiga o'tmasdan ulashishga imkon beruvchi ochiq avtorizatsiya standarti. OAuth 2 bilan bog'liq asosiy atamalar.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Resource Owner&lt;/strong&gt; - resursga kirishni taqiqlash &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Resource Server&lt;/strong&gt; - maxsus token yordamida taqdim etililishi mumkin bo'lgan &lt;code&gt;owner&lt;/code&gt; resurslarini saqlaydigan server &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Authorization Server&lt;/strong&gt; - &lt;code&gt;key&lt;/code&gt;larni, &lt;code&gt;token&lt;/code&gt;larni va boshqa vaqtinchalik resurslarga kirish kodlarini ajratishni boshqaradi. Shuningdek, u tegishli shaxsga ruxsat berilishini ta'minlashi kerak &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Access Token&lt;/strong&gt; - manbaga kirishga imkon beruvchi kalit&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Authorization Grant&lt;/strong&gt; - kirish uchun ruxsat beradi. Kirish huquqini tasdiqlashning turli xil usullari mavjud: avtorizatsiya kodi, yopiq, manbalar egasining parol ma'lumotlari va mijoz ma'lumotlari &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Siz ushbu standart haqida ko'proq ma'lumotni &lt;a href="https://tools.ietf.org/html/rfc6749" rel="noopener noreferrer"&gt;bu erda&lt;/a&gt; va &lt;a href="https://www.digitalocean.com/community/tutorials/an-introduction-to-oauth-2" rel="noopener noreferrer"&gt;bu digitalocean maqolasida&lt;/a&gt; o'qishingiz mumkin. Ushbu protokolning ketma-ketligi uchta asosiy bosqichdan iborat. Dastlab avtorizatsiya so'rovi resource ownerga yuboriladi. Resource ownerning javobidan so'ng biz authorization serverga authorization grant so'rovini yuboramiz va access tokenni olamiz. Nihoyat, biz ushbu access tokenni Resource serverga yuboramiz va agar u yaroqli bo'lsa, API resursga ruxsat beriladi.&lt;/p&gt;

&lt;h1&gt;
  
  
  Yechim
&lt;/h1&gt;

&lt;p&gt;Quyidagi rasmda tizim arxitekturasi ko'rsatilgan. Bizda API Gateway (Zuul) bor, u bizning so'rovlarimizni avtorizatsiya serveriga va ikkita account mikroservisiga taqsimlaydi. Avtorizatsiya serveri - bu OAuth 2 xavfsizlik mexanizmlarini ta'minlaydigan infratuzilma servisi. Shuningdek, bizda discovery servisi (Eureka) mavjud, u yerda bizning barcha mikroservislarimiz ro'yxatdan o'tgan.&lt;br&gt;
&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkbr1alprs9v2nb4a19iu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkbr1alprs9v2nb4a19iu.png" alt="Alt Text" width="768" height="514"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;
  
  
  Gateway
&lt;/h1&gt;

&lt;p&gt;Ushbu namuna uchun biz API shlyuzida hech qanday xavfsizlikni ta'minlamaymiz. Bu faqat mijozlardan autherization serverga va account micriservislariga so'rovlarni yuborishi kerak. Quyida ko'rinadigan Zuul shlyuzi konfiguratsiyasida, HTTP sarlavhasini avtorizatsiya qilish uchun sensitiveHeaders xususiyatini bo'sh qoldiramiz. Odatiy holda Zuul bu headerni bizning so'rovimizni kerakli APIga yuborishda kesib tashlaydi, chunki servislarimiz gateway ortida basic authentikatsiya talab qiladi.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;zuul:
  routes:
    uaa:
      path: /uaa/**
      sensitiveHeaders:
      serviceId: auth-server
    account:
      path: /account/**
      sensitiveHeaders:
      serviceId: account-service
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;Gatewayning&lt;/code&gt; source codi ichidagi asosiy class juda oddiy. Bu faqat &lt;code&gt;Eureka&lt;/code&gt; registridan servislarni yig'ish uchun &lt;code&gt;ZuulProxy&lt;/code&gt; va &lt;code&gt;DiscoveryClient&lt;/code&gt; larni faollashtirish kerak.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@SpringBootApplication
@EnableZuulProxy
@EnableDiscoveryClient
public class GatewayServer {

   public static void main(String[] args) {
      SpringApplication.run(GatewayServer.class, args);
   }

}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Authorization Server
&lt;/h1&gt;

&lt;p&gt;Authorization server maksimal darajada sodda. U standart SpringSecurity konfiguratsiyasiga asoslangan. Mijozlarni avtorizatsiya qilish tafsilotlari &lt;code&gt;in-memory&lt;/code&gt;da saqlanadi. Albatta, &lt;code&gt;production&lt;/code&gt; rejimida siz JDBC va &lt;code&gt;TokenStore&lt;/code&gt; kabilardan foydalansangiz bo'ladi. Springni avtorizatsiya mexanizmlari haqida qo'shimcha ma'lumotni &lt;a href="http://docs.spring.io/spring-security/site/docs/current/reference/htmlsingle/" rel="noopener noreferrer"&gt;Spring Security Reference&lt;/a&gt; va &lt;a href="http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-security.html" rel="noopener noreferrer"&gt;Spring Boot Security&lt;/a&gt; -da o'qishingiz mumkin. &lt;br&gt;
Bu erda application.yml -dan konfiguratsiya namunasi. Namunada user uchun basic authentication ma'lumotlari va &lt;code&gt;/token&lt;/code&gt; endpoint uchun basic security ma'lumotlarini sozlangan: &lt;code&gt;client-id&lt;/code&gt; va &lt;code&gt;client-secret&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;security:
  user:
    name: root
    password: password
  oauth2:
    client:
      client-id: acme
      client-secret: secret
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bu erda autentifikatsiya serveri va &lt;code&gt;@EnableAuthorizationServer&lt;/code&gt; annotatsiyasi va account servisi uchun user authentikatsiya tafsilotlari uchun REST endpoint.&lt;br&gt;
Shuningdek &lt;code&gt;Eureka&lt;/code&gt; registratori va &lt;code&gt;Discovery&lt;/code&gt; clienti faollashtirilgan.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@SpringBootApplication
@EnableAuthorizationServer
@EnableDiscoveryClient
@EnableResourceServer
@RestController
public class AuthServer {

   public static void main(String[] args) {
      SpringApplication.run(AuthServer.class, args);
   }

   @RequestMapping("/user")
   public Principal user(Principal user) {
       return user;
   }

}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Application – account microservisi
&lt;/h1&gt;

&lt;p&gt;Mikroservisimiz faqat bitta &lt;code&gt;@GET&lt;/code&gt; endpointga ega, u har doim bir xil accountni qaytaradi. Asosiy klassda resurslar serveri va Eureka discovery faollashtirilgan. Xizmat konfiguratsiyasi ahamiyatsiz. Dastur manba kodining namunasi &lt;a href="https://github.com/piomin/sample-spring-oauth2-microservices" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; -da mavjud.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@SpringBootApplication
@EnableDiscoveryClient
@EnableResourceServer
public class AccountService {

   public static void main(String[] args) {
      SpringApplication.run(AccountService.class, args);
   }

}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bu yerda account servisi uchun xavfsizli sozlamalari.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;security:
  user:
    name: root
    password: password
  oauth2:
    resource:
      loadBalanced: true
      userInfoUri: http://localhost:9999/user
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Testlash
&lt;/h1&gt;

&lt;p&gt;Natijani tkshirish uchun &lt;code&gt;browser&lt;/code&gt; va &lt;code&gt;rest client&lt;/code&gt; kerak bo'ladi.Dastlab &lt;code&gt;resource owner&lt;/code&gt; ga authorizatsiya so'rovini yuborishdan boshlasak, browserda &lt;code&gt;Zull gateway&lt;/code&gt; orqali OAuth2 authorizatsiya endpointiga so'rov yuborish mumkin.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://localhost:8765/uaa/oauth/authorize?response_type=token&amp;amp;client_id=acme&amp;amp;redirect_uri=http://example.com&amp;amp;scope=openid&amp;amp;state=48532
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bu so'rov yuborilgandan so'ng biz quyidagi sahifani ko'rishimiz kerak. Tasdiqlash -ni tanlang va avtorizatsiya serveridan so'rovlar va kirish tokenlari uchun Avtorizatsiya -ni bosing. Agar dastur identifikatori tasdiqlangan bo'lsa va ruxsatnoma haqiqiy bo'lsa, HTTP javobida dasturga kirish belgisi qaytarilishi kerak. &lt;br&gt;
&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffajuu2et36psgicisejy.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffajuu2et36psgicisejy.jpg" alt="Alt Text" width="768" height="228"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Oxirgi qadam &lt;code&gt;access token&lt;/code&gt;dan foydalanib, account ning endpointiga murojaat qilish. Biz uni &lt;code&gt;Authorization&lt;/code&gt; headeriga &lt;code&gt;bearer&lt;/code&gt; belgisi bilan o'rnatamiz. Xavfsizlik operatsiyalari uchun dasturlarni &lt;code&gt;logging&lt;/code&gt; darajasi "TRACE" ga o'rnatilgan, shuning uchun biror narsa noto'g'ri ketganda nima bo'lganini osongina bilib olishingiz mumkin. &lt;br&gt;
&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7ossgwph77dhtyit3z3w.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7ossgwph77dhtyit3z3w.jpg" alt="Alt Text" width="768" height="426"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Xulosa
&lt;/h1&gt;

&lt;p&gt;Rostini aytsam, men ilovalardagi xavfsizlik muammolari bilan unchalik tanish emasman. Men uchun juda muhim bo'lgan narsa - men foydalanishga qaror qilgan xavfsizlik echimining soddaligi. Spring Security -da bizda deyarli barcha kerakli mexanizmlar mavjud. Bundan tashqari, qo'shimcha talablar uchun osongina kengaytirilishi mumkin bo'lgan komponentlar mavjud. Siz ushbu maqolani Spring Cloud va Spring Security loyihalaridan foydalangan holda yanada ilg'or echimlarga qisqacha kirish sifatida qarashingiz kerak.&lt;/p&gt;

</description>
      <category>java</category>
      <category>spring</category>
      <category>microservices</category>
      <category>oauth2</category>
    </item>
  </channel>
</rss>
