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

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

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

[code]
> dotnet new webapi -o webJwt
> cd webJwt
[/code]

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

[code]
{"username": "mario", "password": "secret"}
[/code]

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

[code]
{"token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1Mzk1ODQ5MzIsImlzcyI6Imh0dHA6Ly9sb2NhbGhvc3Q6NDQzMDcvIiwiYXVkIjoiaHR0cDovL2xvY2FsaG9zdDo0NDMwNy8ifQ.2BPWXkdGTk_Lmmij04OwFtncw_n5-wMEsPSlVaMKhqg"}
[/code]

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

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

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

[code]
[
{
"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
}
]
[/code]

 

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

[code]
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
[/code]

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

Link