สร้าง webapi รองรับ JWT

สร้างโปรเจ็กส์แบบ webapi

สร้างโปรเจ็กส์แบบ webapi ชื่อโปรเจ็กส์ webJwt

> dotnet new webapi -o webJwt
> cd webJwt

Startup.cs

บรรทัดที่ 24-37 : เป็นการคอนฟิกให้รองรับ JWT-based authentication
บรรทัดที่ 55: เป็นการเรียกใช้ Authen (ต้องอยู่ก่อน app.UseMvc())

appsettings.json

บรรทัดที่ 9 : ไม่แน่ใจว่า Key นี้คือ private key หรือเปล่า ถ้าใช่ ก็ตั้งอะไรก็ได้ ยากๆเข้าไว้
บรรทัดที่ 10 : ใส่ค่า port ไม่ตรง ก็ทำงานได้ปกติดี

 

ตอนนี้ฝั่ง Server รองรับ JWT ละ
ต่อมาให้ฝั่ง Server รองรับการเชื่อมต่อแบบปลอดภับ (Securing ASP.NET Core 2.0 Endpoints with JWTs)

สร้างไฟล์ Controller/BookController.cs ไว้คืนรายชื่อหนัสือ
และไฟล์ Controller/TokenController.cs ไว้สร้าง Token

Controller/BooksController.cs

เรียก https://localhost:5001/api/books ตอนนี้จะยังใช้งานไม่ได้ 401 unauthorized เพราะต้องมี Token ก่อนถึงจะใช้งานได้

Controller/TokenController.cs

บรรทัดที่ 54 : กำหนด Username และ Password สำหรับการ Authen ไว้แบบ hardcode

ตอนนี้พร้อมใช้ละ
ลองเรียกด้วย Postman แบบ POST ไปที่ https://localhost:5001/api/token
พร้อมส่งค่าไปใน Body แบบ raw JSON

{"username": "mario", "password": "secret"}

จะได้ค่า Token กลับมา เช่น

{"token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1Mzk1ODQ5MzIsImlzcyI6Imh0dHA6Ly9sb2NhbGhvc3Q6NDQzMDcvIiwiYXVkIjoiaHR0cDovL2xvY2FsaG9zdDo0NDMwNy8ifQ.2BPWXkdGTk_Lmmij04OwFtncw_n5-wMEsPSlVaMKhqg"}

พอได้ Token มา
ทีนี้เรียกดูรายชื่อหนังสือแบบ GET ที่ https://localhost:5001/api/books

พร้อมส่ง Authorization แบบ Bearer Token โดยนำค่า Token ที่ได้มา ใส่ลงไปในช่อง Token ดังรูป

จะได้รายชื่อหนังสือกลับมา

[
  {
    "author": "Ray Bradbury",
    "title": "Fahrenheit 451",
    "ageRestriction": false
  },
  {
    "author": "Gabriel García Márquez",
    "title": "One Hundred years of Solitude",
    "ageRestriction": false
  },
  {
    "author": "George Orwell",
    "title": "1984",
    "ageRestriction": false
  },
  {
    "author": "Anais Nin",
    "title": "Delta of Venus",
    "ageRestriction": false
  }
]

 

ถ้ามี Error เกิดขึ้นแบบนี้

ArgumentNullException: String reference not set to an instance of a String. Parameter name: s
•	System.Text.Encoding.GetBytes(string s)
•	webJwt.Startup.<ConfigureServices>b__4_0(JwtBearerOptions options) in Startup.cs
27.	options.TokenValidationParameters = new TokenValidationParameters

ให้ตรวจสอบค่าในไฟล์ appsettings.json ว่าใส่ครบดีมั๊ย (ไม่ต้องเสียเวลาแก้ที่ c#)

Link