<?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: daftyw</title>
    <description>The latest articles on DEV Community by daftyw (@daftyw).</description>
    <link>https://dev.to/daftyw</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%2F30766%2Ffeaf4c41-1fb5-4649-a7f5-2fe64f6a77ea.jpeg</url>
      <title>DEV Community: daftyw</title>
      <link>https://dev.to/daftyw</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/daftyw"/>
    <language>en</language>
    <item>
      <title>Kotlin, In my regard</title>
      <dc:creator>daftyw</dc:creator>
      <pubDate>Thu, 05 Aug 2021 23:17:46 +0000</pubDate>
      <link>https://dev.to/daftyw/kotlin-in-my-regar-364o</link>
      <guid>https://dev.to/daftyw/kotlin-in-my-regar-364o</guid>
      <description>&lt;p&gt;&lt;em&gt;TLDR; My love/hate relationship with Kotlin.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Well, as you may know I am quite a long term java developer and I think Java is in surprisingly upside right now since it leave the dark age of the -O- company. I always love to explore the new capacity of the language itself, but can't deny that still feel craving to try another languages such as Go, python and, of course YES, Kotlin.&lt;/p&gt;

&lt;p&gt;Since it introduce to public officially in one of events from Google (I am not sure which one), Kotlin always caught heart of many Android developer if not all of them.&lt;/p&gt;

&lt;p&gt;But in the scope of backend development, I rarely saw any project that using Kotlin.&lt;/p&gt;

&lt;p&gt;But now, I am starting with a new project and when one of our team squad leader so encouraging to put Kotlin into our stack I can't help but honestly feel doubted. Anyway, The team didnt reject the offer and we are going with Java, Kotlin and Go as our backend platform stack. &lt;/p&gt;

&lt;p&gt;In my knowledge before now, Kotlin is quite like an extension of Java. And since we have so many additional language feature recently (which some project still struggling with Java 8) l, my argument for Kotlin are..&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Switching to Kotlin doesn't help improve performance since it still one on JVM like Java and it need additional compilation steps (every time that we build the project, which means we losing our productivities waiting more time) &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Java isn't good with design pattern but it never pushing all over on me. But, Kotlin wants you to understand beforehand about writing a good code. Yes, with good intentions to reduce buggy application but it seems like forever before you got into the point that you understand all Kotlin code in 10 seconds when you see any commit from your college ( Yup, It hurts productivities again )&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Struggling with 1 tool. Well, IntellJ is no doubt a number one IDE but it isn't free. I am mainly a VSCode user and I can't find any worth to mentioned Kotlin Extension. even for Eclipse IDE, the plugin is abandoned.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Well, after I decided that I (and the team) can accept all arguments above. Give it a shot is not so bad right now.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;I think as if you are experienced Kotlin developer. You got a better tools to handle a lot of situations, writing a shorter and cleaner code. Gradle integration is very good and scope function start to catch my heart more and more.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Well that is it for know. This is kind of like a note to myself in the future 😉&lt;/p&gt;

&lt;p&gt;Thank you for reading.&lt;/p&gt;

</description>
      <category>kotlin</category>
      <category>java</category>
    </item>
    <item>
      <title>Go กับ Java ใครเร็วกว่า (แบบ Native)</title>
      <dc:creator>daftyw</dc:creator>
      <pubDate>Wed, 13 Jan 2021 11:26:26 +0000</pubDate>
      <link>https://dev.to/daftyw/go-java-native-1f97</link>
      <guid>https://dev.to/daftyw/go-java-native-1f97</guid>
      <description>&lt;p&gt;โดยส่วนตัวสงสัยมานานว่าระหว่างสองตัวนี้ใครเร็วกว่ากัน เนื่องจากเดิมทีผู้เขียนเป็นคนที่ใช้ภาษา Java มาอย่างยาวนาน ผ่านร้อนผ่านหนาวมาประมาณหนึ่ง ช่วงหลังๆ มาเริ่มได้ยินกิตติศัพท์ที่เลื่องลือของภาษา Go ที่ทาง Google ได้นำเสนอมาตลอด (รวมไปถึงน้องๆ Programmer ที่รู้จักกันอยู่บ้าง) ว่ามันช่างมีความรวดเร็ว และง่ายในการใช้งาน ก็เลยคันไม้คันมืออยากที่จะทดสอบซักหน่อย&lt;br&gt;
บริบทของการทดสอบ&lt;/p&gt;

&lt;p&gt;ในการทดสอบ ผู้เขียนใช้ Framework เพื่อเริ่มการทำงานในส่วนของ REST Microservice โดยภาษา Java จะใช้ Quarkus และ Go เราจะใช้ Gin&lt;br&gt;
ในส่วนของการทดสอบเราจะใช้โปรแกรม wrk ทดสอบความสามารถในการรองรับ โดยใช้คำสั่ง&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;wrk -c1000 -d10 -t10 http://localhost:8080/ping
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;โดยสำหรับ URL : &lt;a href="http://localhost:8080/ping"&gt;http://localhost:8080/ping&lt;/a&gt; เป็นคืนค่า JSON: { "message" : "pong" } กลับมา&lt;/p&gt;

&lt;p&gt;ผลลัพท์ของทั้งสองโปรแกรมให้ดูดังนี้&lt;/p&gt;

&lt;p&gt;1.ในส่วนของ Go&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Running 10s test @ http://localhost:8080/ping
 10 threads and 1000 connections
 Thread Stats Avg Stdev Max +/- Stdev
 Latency 7.92ms 7.27ms 100.85ms 60.64%
 Req/Sec 3.06k 1.58k 7.97k 51.94%
 305741 requests in 10.10s, 41.11MB read
 Socket errors: connect 759, read 95, write 0, timeout 0
Requests/sec: 30259.64
Transfer/sec: 4.07MB
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;2.ส่วนข้างล่างเป็นของ Java&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Running 10s test @ http://localhost:8080/ping
 10 threads and 1000 connections
 Thread Stats Avg Stdev Max +/- Stdev
 Latency 25.64ms 72.74ms 989.09ms 90.21%
 Req/Sec 4.75k 3.96k 27.19k 80.02%
 457231 requests in 10.07s, 43.17MB read
 Socket errors: connect 759, read 95, write 0, timeout 0
Requests/sec: 45404.83
Transfer/sec: 4.29MB
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ก็ทดลองยิงอยู่หลายครั้งนะครับ ผลสรุปเท่าที่ทำการทดลองก็คือ Java จะรันค่อนข้างไวกว่า Go เยอะมาก (30Krps เทียบกับ 45Krps) อนึ่งการทดสอบนี้ผมใช้เครื่อง Macbook Pro 13" Quadcore 2.5Ghz Ram 16 ขนาดทดลองเปิดพัดลม Fullblast ตลอดเวลาครับ โดยผมทิ้ง Link ไปยัง Github ที่เก็บ Source code ดังนี้&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Go : &lt;a href="https://github.com/daftyw/go-rest"&gt;https://github.com/daftyw/go-rest&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Java: &lt;a href="https://github.com/daftyw/quarkus-reactive-rest"&gt;https://github.com/daftyw/quarkus-reactive-rest&lt;/a&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;โดยส่วนตัวคิดว่าอาจจะเป็นเพราะ Framework ในส่วนของ Go นั้นยังทำมาไม่ไวพอ ถ้าใครมี Framework ที่เร็วๆ รบกวนช่วยแนะนำ หรือรู้วิธีปิด Log ใน Gin ช่วยทิ้งไว้ในคอมเมนท์ด้วยนะครับ&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;แล้วพบกันใหม่ครับ สวัสดีครับ&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;หลังจากได้ Feedback มาว่าให้ลองใช้ fasthttp ผมได้ลองทำการค้นคว้าเพิ่มแล้วลองทำดูได้ผลลัพท์ดังนี้ครับ&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Running 10s test @ http://localhost:8080/ping
 10 threads and 1000 connections
 Thread Stats Avg Stdev Max +/- Stdev
 Latency 2.17ms 198.45us 10.97ms 80.12%
 Req/Sec 12.34k 4.13k 22.79k 75.44%
 1115359 requests in 10.10s, 153.17MB read
 Socket errors: connect 759, read 88, write 0, timeout 0
Requests/sec: 110399.21
Transfer/sec: 15.16MB
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ดังนั้นถือว่าชัดเจนครับ 45K rps เจอ 110K rps 5555&lt;br&gt;
แล้วก็อย่างเคยครับ ส่วนนี่คือ Repo ที่เก็บ Code Test: &lt;a href="https://github.com/daftyw/go-rest2"&gt;https://github.com/daftyw/go-rest2&lt;/a&gt;&lt;/p&gt;

</description>
      <category>go</category>
      <category>java</category>
      <category>quarkus</category>
    </item>
    <item>
      <title>Challenge of making a diamond of numbers</title>
      <dc:creator>daftyw</dc:creator>
      <pubDate>Sat, 05 Dec 2020 04:33:19 +0000</pubDate>
      <link>https://dev.to/daftyw/making-a-diamond-of-input-number-5aie</link>
      <guid>https://dev.to/daftyw/making-a-diamond-of-input-number-5aie</guid>
      <description>&lt;p&gt;Recently, I got some message from my fellow about a quiz that she has to involve in a next couple of weeks. The quiz itself is actually has 5 assignments but I have remember just one.&lt;/p&gt;

&lt;p&gt;I guess this is one simple assignment for any CS student. But as a long time software developer I think it one hell of a quest for me.&lt;/p&gt;

&lt;p&gt;The assignment content here.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Make a python program that input any number then put that number in one diamond like in an example:&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Input number: 5
    1
   121
  12321
 1234321
123454321
 1234321
  12321
   121
    1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is &lt;a href="https://gist.github.com/daftyw/2b5eee64391709af13375b425930bd9f"&gt;my code in gist&lt;/a&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>quiz</category>
      <category>challenge</category>
    </item>
    <item>
      <title>วิธีทำ Kong ให้รับ JWT + วิธี Generate JWT Token ด้วย Quarkus (Smallrye JWT)</title>
      <dc:creator>daftyw</dc:creator>
      <pubDate>Mon, 12 Oct 2020 14:52:51 +0000</pubDate>
      <link>https://dev.to/daftyw/kong-jwt-generate-jwt-token-quarkus-smallrye-jwt-360b</link>
      <guid>https://dev.to/daftyw/kong-jwt-generate-jwt-token-quarkus-smallrye-jwt-360b</guid>
      <description>&lt;h4&gt;
  
  
  กว่าจะทำได้กินเวลาไป 2 ชม.เต็มๆ
&lt;/h4&gt;

&lt;p&gt;เรื่องมันเริ่มจากอยากใช้ Kong ในการ Authentication ผ่าน JWT ที่ Sign แบบ RS256 (RSA) เพื่อให้มีความปลอดภัยขั้นสูงนิดนึง (นิดเดียวจริงๆ) ทางฝั่ง Consumer ก็คือ Sign JWT จาก Private Key ไป ทางฝั่งเราก้อขอแค่ Public Key สำหรับ Decryption แค่นั้นพอ&lt;/p&gt;

&lt;p&gt;แต่... แล้วพอทำจริงมันก็ช่างยากเย็นซะเหลือเกิน อาจจะเพราะเราใช้ Quarkus ในการ Generate JWT Token ด้วย ตานี้ RSA Private มันเลยแปลกๆ เลยติดอยู่ตรงนี้ซะนาน &lt;/p&gt;

&lt;p&gt;&lt;em&gt;เอาล่ะมาเริ่มกันเลยแล้วกัน Step มีดังนี้ !!&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  ขั้น 1 Generate public/private key
&lt;/h3&gt;

&lt;p&gt;เริ่มที่ Private key ก่อน (ถ้าเค้าถามก็ใส่ Subject ไปให้ครบ ตัวนี้ล่ะสำคัญเลยล่ะ C,O,CN)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;openssl req &lt;span class="nt"&gt;-x509&lt;/span&gt; &lt;span class="nt"&gt;-newkey&lt;/span&gt; rsa:2048 &lt;span class="nt"&gt;-nodes&lt;/span&gt; &lt;span class="nt"&gt;-keyout&lt;/span&gt; ./private-key.pem &lt;span class="nt"&gt;-days&lt;/span&gt; 365
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ต่อไปก็ Generate เอา Public key&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;openssl rsa &lt;span class="nt"&gt;-in&lt;/span&gt; private-key.pem &lt;span class="nt"&gt;-out&lt;/span&gt; pub-key.pem &lt;span class="nt"&gt;-outform&lt;/span&gt; PEM &lt;span class="nt"&gt;-pubout&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ได้มาสองอันแระเป็น &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;private-key.pem (ซึ่งเราจะเอาไปใส่ใน App เพื่อ Gen)&lt;/li&gt;
&lt;li&gt;pub-key.pem (เราจะเอาตัวนี้ไปเพิ่มใน Consumer Credential ของ Kong)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ขั้น 2 เอา public key ไปใส่ใน Kong
&lt;/h3&gt;

&lt;p&gt;ก่อนอื่นต้องเท้าความว่าเราใช้แบบ unsecured admin port สำหรับ Kong ก็จะเป็นการยิง curl รัวๆ ตามนี้&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;เพิ่ม Consumer
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-X&lt;/span&gt; POST http://&lt;span class="nv"&gt;$HOST&lt;/span&gt;:8001/consumers &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'username=rawin'&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'custom_id=rawin'&lt;/span&gt; | jq
&lt;span class="o"&gt;{&lt;/span&gt;                                                
  &lt;span class="s2"&gt;"custom_id"&lt;/span&gt;: &lt;span class="s2"&gt;"rawin"&lt;/span&gt;,                          
  &lt;span class="s2"&gt;"created_at"&lt;/span&gt;: 1602513121,                      
  &lt;span class="s2"&gt;"id"&lt;/span&gt;: &lt;span class="s2"&gt;"3c3693c2-db73-4740-8d96-4e46645c4874"&lt;/span&gt;,  
  &lt;span class="s2"&gt;"tags"&lt;/span&gt;: null,                                  
  &lt;span class="s2"&gt;"username"&lt;/span&gt;: &lt;span class="s2"&gt;"rawin"&lt;/span&gt;                            
&lt;span class="o"&gt;}&lt;/span&gt;                                                
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;เพิ่ม RS256 Public Key
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-X&lt;/span&gt; POST http://&lt;span class="nv"&gt;$H&lt;/span&gt;:32001/consumers/rawin/jwt &lt;span class="nt"&gt;-F&lt;/span&gt; &lt;span class="s1"&gt;'rsa_public_key=@pub-key.pem'&lt;/span&gt; | jq
&lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="s2"&gt;"created_at"&lt;/span&gt;: 1602513212,
  &lt;span class="s2"&gt;"id"&lt;/span&gt;: &lt;span class="s2"&gt;"6467fcdc-ac73-48a6-b2d6-c78a633b59f9"&lt;/span&gt;,
  &lt;span class="s2"&gt;"tags"&lt;/span&gt;: null,
  &lt;span class="s2"&gt;"secret"&lt;/span&gt;: &lt;span class="s2"&gt;"sIjCL1CWZvCye0N9w8op8aHcQGRYxzdf"&lt;/span&gt;,
  &lt;span class="s2"&gt;"rsa_public_key"&lt;/span&gt;: &lt;span class="s2"&gt;"-----BEGIN PUBLIC KEY-----&lt;/span&gt;&lt;span class="se"&gt;\r\n&lt;/span&gt;&lt;span class="s2"&gt;MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnilPbARTGCm19Tq4xxeT&lt;/span&gt;&lt;span class="se"&gt;\r\n&lt;/span&gt;&lt;span class="s2"&gt;geQUfXzAmr7LMpGkcvFiAKf0Yo0hi9SX55B85d0l22EEk5mhwLXcA+orXB8dq9ke&lt;/span&gt;&lt;span class="se"&gt;\r\n&lt;/span&gt;&lt;span class="s2"&gt;S0mjWjFedXPQfjFCRUyIyQYt75qaDX5RJX+p6YN/VJCZkjlSI1UeaX8rOOmcBuUG&lt;/span&gt;&lt;span class="se"&gt;\r\n&lt;/span&gt;&lt;span class="s2"&gt;HinV+qMWIZmwvpFXt45HLIuCH2iLM+7/TiiIBHakNR/ogKTKQE7iHon9ZQ2eSakG&lt;/span&gt;&lt;span class="se"&gt;\r\n&lt;/span&gt;&lt;span class="s2"&gt;UMOBcCrGG8itp2jXtk0oTlZgNtB5+i03HoyZqAZ6Ny7VX0EIlJFuukvuFbNzKZaI&lt;/span&gt;&lt;span class="se"&gt;\r\n&lt;/span&gt;&lt;span class="s2"&gt;Is21/xnXlsqto7iP9rJViFLzswg1c41nkbpwC1oByvTUDH4pQ94+L1vdhSof6A7n&lt;/span&gt;&lt;span class="se"&gt;\r\n&lt;/span&gt;&lt;span class="s2"&gt;DwIDAQAB&lt;/span&gt;&lt;span class="se"&gt;\r\n&lt;/span&gt;&lt;span class="s2"&gt;-----END PUBLIC KEY-----&lt;/span&gt;&lt;span class="se"&gt;\r\n&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;,
  &lt;span class="s2"&gt;"consumer"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;"id"&lt;/span&gt;: &lt;span class="s2"&gt;"3c3693c2-db73-4740-8d96-4e46645c4874"&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;,
  &lt;span class="s2"&gt;"key"&lt;/span&gt;: &lt;span class="s2"&gt;"9SGoxUxJ8m8V7TaftQxtvBMMEwF3Q2mm"&lt;/span&gt;,
  &lt;span class="s2"&gt;"algorithm"&lt;/span&gt;: &lt;span class="s2"&gt;"HS256"&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;จากนั้นต้องมีแก้ไข algorithm ด้วยนิดหน่อยโดย
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'algorithm=RS256'&lt;/span&gt; &lt;span class="nt"&gt;-X&lt;/span&gt; PATCH http://&lt;span class="nv"&gt;$H&lt;/span&gt;:32001/consumers/rawin/jwt/6467fcdc-ac73-48a6-b2d6-c78a633b59f9 | jq      
&lt;span class="o"&gt;{&lt;/span&gt;                                                                                                                          
  &lt;span class="s2"&gt;"created_at"&lt;/span&gt;: 1602513212,                                                                                                
  &lt;span class="s2"&gt;"id"&lt;/span&gt;: &lt;span class="s2"&gt;"6467fcdc-ac73-48a6-b2d6-c78a633b59f9"&lt;/span&gt;,                                                                            
  &lt;span class="s2"&gt;"tags"&lt;/span&gt;: null,                                                                                                            
  &lt;span class="s2"&gt;"secret"&lt;/span&gt;: &lt;span class="s2"&gt;"sIjCL1CWZvCye0N9w8op8aHcQGRYxzdf"&lt;/span&gt;,                                                                            
  &lt;span class="s2"&gt;"rsa_public_key"&lt;/span&gt;: &lt;span class="s2"&gt;"-----BEGIN PUBLIC KEY-----&lt;/span&gt;&lt;span class="se"&gt;\r\n&lt;/span&gt;&lt;span class="s2"&gt;MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnilPbARTGCm19Tq4xxeT&lt;/span&gt;&lt;span class="se"&gt;\r\n&lt;/span&gt;&lt;span class="s2"&gt;geQU
fXzAmr7LMpGkcvFiAKf0Yo0hi9SX55B85d0l22EEk5mhwLXcA+orXB8dq9ke&lt;/span&gt;&lt;span class="se"&gt;\r\n&lt;/span&gt;&lt;span class="s2"&gt;S0mjWjFedXPQfjFCRUyIyQYt75qaDX5RJX+p6YN/VJCZkjlSI1UeaX8rOOm
cBuUG&lt;/span&gt;&lt;span class="se"&gt;\r\n&lt;/span&gt;&lt;span class="s2"&gt;HinV+qMWIZmwvpFXt45HLIuCH2iLM+7/TiiIBHakNR/ogKTKQE7iHon9ZQ2eSakG&lt;/span&gt;&lt;span class="se"&gt;\r\n&lt;/span&gt;&lt;span class="s2"&gt;UMOBcCrGG8itp2jXtk0oTlZgNtB5+i03HoyZqAZ6Ny7VX0
EIlJFuukvuFbNzKZaI&lt;/span&gt;&lt;span class="se"&gt;\r\n&lt;/span&gt;&lt;span class="s2"&gt;Is21/xnXlsqto7iP9rJViFLzswg1c41nkbpwC1oByvTUDH4pQ94+L1vdhSof6A7n&lt;/span&gt;&lt;span class="se"&gt;\r\n&lt;/span&gt;&lt;span class="s2"&gt;DwIDAQAB&lt;/span&gt;&lt;span class="se"&gt;\r\n&lt;/span&gt;&lt;span class="s2"&gt;-----END PUBLIC KEY--
---&lt;/span&gt;&lt;span class="se"&gt;\r\n&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;,                                                                                                                  
  &lt;span class="s2"&gt;"consumer"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;                                                                                                            
    &lt;span class="s2"&gt;"id"&lt;/span&gt;: &lt;span class="s2"&gt;"3c3693c2-db73-4740-8d96-4e46645c4874"&lt;/span&gt;                                                                           
  &lt;span class="o"&gt;}&lt;/span&gt;,                                                                                                                       
  &lt;span class="s2"&gt;"key"&lt;/span&gt;: &lt;span class="s2"&gt;"9SGoxUxJ8m8V7TaftQxtvBMMEwF3Q2mm"&lt;/span&gt;,                                                                               
  &lt;span class="s2"&gt;"algorithm"&lt;/span&gt;: &lt;span class="s2"&gt;"RS256"&lt;/span&gt;                                                                                                     
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;เป็นอันเรียบร้อยที่ฝั่ง Kong (อันนี้คือเรามีตัว JWT Plugins ลงไว้เป็น Global Mode แล้วนะ)&lt;/p&gt;

&lt;h3&gt;
  
  
  ขั้นที่ 3 Generate JWT Token จาก Quarkus
&lt;/h3&gt;

&lt;p&gt;ขั้นนี้มีซับซ้อนนิดหน่อยคือ เราต้องเอา field "key" มาใส่ในช่อง issuer ของ JWT token ด้วยโดยสมมุติว่าเรามี Quarkus Project อยู่แล้วก็เพิ่ม Extensions ไปก่อนโดย&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;./mvnw quarkus:add-extensions &lt;span class="nt"&gt;-Dextension&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"quarkus-smallrye-jwt"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ต่อมาก็ Copy File &lt;em&gt;private-key.pem&lt;/em&gt; ไปใส่ที่ &lt;em&gt;src/main/resources&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;แล้วไปเพิ่มในไฟล์  &lt;em&gt;application.properties&lt;/em&gt; หนึ่งบรรทัดตามด้านล่างนี้&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight properties"&gt;&lt;code&gt;&lt;span class="py"&gt;smallrye.jwt.sign.key-location&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;private-key.pem&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ถือว่าอ้างอิง Private key เสร็จสิ้นก็ทำ RestEasy Resource Class มาได้เลย&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kn"&gt;package&lt;/span&gt; &lt;span class="nn"&gt;org.rawin.jwt&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;javax.enterprise.context.RequestScoped&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;javax.ws.rs.GET&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;javax.ws.rs.Path&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;io.smallrye.jwt.build.Jwt&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="nd"&gt;@Path&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/key"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="nd"&gt;@RequestScoped&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;KeyResource&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="nd"&gt;@GET&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;generateKey&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="kd"&gt;throws&lt;/span&gt; &lt;span class="nc"&gt;Exception&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

        &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;jwtOut&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Jwt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;claims&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
            &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;issuer&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"9SGoxUxJ8m8V7TaftQxtvBMMEwF3Q2mm"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// เอาค่าจาก key มา&lt;/span&gt;
            &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;sign&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;jwtOut&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;จบตามนี้ก็พร้อมรัน&lt;/p&gt;

&lt;h3&gt;
  
  
  ขั้นที่ 4 ทดสอบ
&lt;/h3&gt;

&lt;p&gt;หา JWT Token ก่อน&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;./mvnw quarkus:dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;แล้วเรียก&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; http://localhost:8080/key
eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJpc3MiOiJlS042NTA2UzhlaXp5T2RYZzNUbFpoUUdhZEYxdWJFOSIsImlhdCI6MTYwMjUxMjIwMSwiZXhwIjoxNjAyNTEyNTAxLCJqdGkiOiIzSVpkYjRua0lBelJadW5YQ0dqQWVRIn0.M3KojWn78l9sAbcEqsekiKd-ukJktboRRs6CkrPz6JNfq03pSBTygu_Xf678Z45NGfTJy0wg6ftZj9x1h7GN4VBZ06nqm0Vqcmdx-st_thFswEVOrUlTxzNULMElOejJCybpYd2lwxA_3vYu_L5sj0fyvLfetev90zV0TDK8S91Xl_dfr75fo7hF1jPcdN_wmV3woB3YKhN3xV9zAJpn7F5o1oL2YaRutevVJMqGhidLgb1S8j0H8jB2smr3DZ7v8KNkkMvuCej0oU9f39BixNBsbgm7VnaWC-xoJqBGAEnSIeza00datSyp-NSZN-CB7gLISmunR3S_PQ4iIVGJCg
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;เอาคีย์มาเรียกเข้าที่ Kong&lt;/p&gt;

&lt;p&gt;เรียกแบบไม่ใส่ JWT Token&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; http://&lt;span class="nv"&gt;$HOST&lt;/span&gt;:8000/office/reports
&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"message"&lt;/span&gt;:&lt;span class="s2"&gt;"Unauthorized"&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;เรียกแบบใส่ JWT Token&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt;  http://&lt;span class="nv"&gt;$HOST&lt;/span&gt;:8000/office/reports &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJpc3MiOiJlS042NTA2UzhlaXp5T2RYZzNUbFpoUUdhZEYxdWJFOSIsImlhdCI6MTYwMjUxMjIwMSwiZXhwIjoxNjAyNTEyNTAxLCJqdGkiOiIzSVpkYjRua0lBelJadW5YQ0dqQWVRIn0.M3KojWn78l9sAbcEqsekiKd-ukJktboRRs6CkrPz6JNfq03pSBTygu_Xf678Z45NGfTJy0wg6ftZj9x1h7GN4VBZ06nqm0Vqcmdx-st_thFswEVOrUlTxzNULMElOejJCybpYd2lwxA_3vYu_L5sj0fyvLfetev90zV0TDK8S91Xl_dfr75fo7hF1jPcdN_wmV3woB3YKhN3xV9zAJpn7F5o1oL2YaRutevVJMqGhidLgb1S8j0H8jB2smr3DZ7v8KNkkMvuCej0oU9f39BixNBsbgm7VnaWC-xoJqBGAEnSIeza00datSyp-NSZN-CB7gLISmunR3S_PQ4iIVGJCg"&lt;/span&gt; 
&lt;span class="o"&gt;[]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ถือว่าประสบความสำเร็จ รีบมาเขียนไว้นี่คือเก็บไว้ดูเผื่อลืม&lt;/p&gt;

&lt;p&gt;ใครสนใจหรือมีคำถามมาคุยกันที่ twitter: &lt;a href="https://twitter.com/rawinng"&gt;@rawinng&lt;/a&gt; ครับ &lt;/p&gt;

</description>
      <category>quarkus</category>
      <category>jwt</category>
      <category>java</category>
      <category>kong</category>
    </item>
  </channel>
</rss>
