คำถามติดแท็ก jwt

JSON Web Token (JWT ออกเสียงว่า "jot") เป็นประเภทการพิสูจน์ตัวตนที่ใช้โทเค็นที่เกิดขึ้นใหม่ซึ่งใช้ในสภาพแวดล้อมที่ จำกัด พื้นที่เช่น HTTP Authorization headers

3
อะไรคือความแตกต่างระหว่าง JWTs และ Bearer Token?
ฉันกำลังเรียนรู้บางอย่างเกี่ยวกับ Authorization เช่น Basic, Digest, OAuth2.0, JWTs และ Bearer Token ตอนนี้ฉันมีคำถาม คุณทราบดีว่ามีการใช้ JWT เป็น Access_Token ในมาตรฐาน OAuth2.0 JWT ปรากฏที่ RFC 7519 และ Bearer Token อยู่ที่ RFC 6750 ตัวอย่างเช่นผู้ถือ: Authorization: Bearer <token> ฉันเคยส่งโทเค็นไปยังเซิร์ฟเวอร์โดย AJAX หรือเพิ่มโทเค็นลงในสตริงการสืบค้นของ url ฉันรู้ว่าโทเค็นสามารถส่งได้โดยเพิ่มลงในส่วนหัวของคำขอ นั่นหมายความว่าควรเพิ่มโทเค็นในส่วนหัว Authorization Bearer หรือไม่ คุณช่วยบอกความสัมพันธ์ระหว่าง JWTs และ Bearer Token ได้ไหม ขอบคุณมาก.
121 oauth  token  jwt 

5
วิธีจัดการการดาวน์โหลดไฟล์ด้วยการรับรองความถูกต้องโดยใช้ JWT
ฉันกำลังเขียนเว็บแอปใน Angular ที่มีการจัดการการตรวจสอบความถูกต้องโดยโทเค็น JWT ซึ่งหมายความว่าทุกคำขอจะมีส่วนหัว "การตรวจสอบสิทธิ์" พร้อมข้อมูลที่จำเป็นทั้งหมด ใช้งานได้ดีสำหรับการโทร REST แต่ฉันไม่เข้าใจว่าฉันควรจัดการลิงก์ดาวน์โหลดสำหรับไฟล์ที่โฮสต์บนแบ็กเอนด์อย่างไร (ไฟล์อยู่บนเซิร์ฟเวอร์เดียวกันกับที่โฮสต์บริการเว็บ) ฉันไม่สามารถใช้<a href='...'/>ลิงก์ปกติได้เนื่องจากไม่มีส่วนหัวใด ๆ และการตรวจสอบความถูกต้องจะล้มเหลว window.open(...)เหมือนกันสำหรับคาถาต่างๆของ วิธีแก้ปัญหาบางอย่างที่ฉันนึกถึง: สร้างลิงค์ดาวน์โหลดชั่วคราวที่ไม่ปลอดภัยบนเซิร์ฟเวอร์ ส่งผ่านข้อมูลการพิสูจน์ตัวตนเป็นพารามิเตอร์ url และจัดการเคสด้วยตนเอง รับข้อมูลผ่าน XHR และบันทึกไฟล์ฝั่งไคลเอ็นต์ ทั้งหมดที่กล่าวมาน้อยกว่าที่น่าพอใจ 1 เป็นวิธีแก้ปัญหาที่ฉันใช้อยู่ตอนนี้ ฉันไม่ชอบด้วยเหตุผลสองประการประการแรกมันไม่เหมาะกับการรักษาความปลอดภัยอย่างที่สองมันใช้งานได้ แต่ต้องใช้งานค่อนข้างมากโดยเฉพาะบนเซิร์ฟเวอร์: เพื่อดาวน์โหลดสิ่งที่ฉันต้องเรียกใช้บริการที่สร้าง "สุ่ม" ใหม่ "url เก็บไว้ที่ใดที่หนึ่ง (อาจอยู่ในฐานข้อมูล) สักระยะหนึ่งแล้วส่งคืนให้กับลูกค้า ไคลเอนต์ได้รับ url และใช้ window.open หรือคล้ายกับมัน เมื่อได้รับการร้องขอ url ใหม่ควรตรวจสอบว่ายังถูกต้องหรือไม่จากนั้นจึงส่งคืนข้อมูล 2 ดูเหมือนว่าอย่างน้อยก็ทำงานได้มาก 3 ดูเหมือนจะใช้งานได้มากแม้กระทั่งการใช้ไลบรารีที่มีอยู่และปัญหาที่อาจเกิดขึ้นมากมาย (ฉันจะต้องให้แถบสถานะการดาวน์โหลดของฉันเองโหลดทั้งไฟล์ในหน่วยความจำแล้วขอให้ผู้ใช้บันทึกไฟล์ในเครื่อง) แม้ว่างานนี้จะค่อนข้างธรรมดาดังนั้นฉันจึงสงสัยว่ามีอะไรที่ง่ายกว่านี้ที่ฉันสามารถใช้ได้หรือไม่ …

5
JWT เทียบกับคุกกี้สำหรับการพิสูจน์ตัวตนที่ใช้โทเค็น
ฉันอ่านโพสต์เกี่ยวกับ"JWT vs Cookie"แต่มันทำให้ฉันสับสนมากขึ้นเท่านั้น ... ฉันต้องการคำชี้แจงเมื่อมีคนพูดถึง "การรับรองความถูกต้องโดยใช้โทเค็นเทียบกับคุกกี้" คุกกี้ในที่นี้หมายถึงคุกกี้เซสชันเท่านั้นหรือไม่ ความเข้าใจของฉันคือคุกกี้เป็นเหมือนสื่อสามารถใช้เพื่อใช้การตรวจสอบความถูกต้องโดยใช้โทเค็น (เก็บสิ่งที่สามารถระบุผู้ใช้ที่ลงชื่อเข้าใช้ในฝั่งไคลเอ็นต์ ) หรือการพิสูจน์ตัวตนตามเซสชัน (เก็บค่าคงที่ในฝั่งไคลเอ็นต์ ที่ตรงกับข้อมูลเซสชันทางฝั่งเซิร์ฟเวอร์ ) ทำไมเราต้องโทเค็นเว็บ JSON ? ฉันใช้คุกกี้มาตรฐานเพื่อใช้การรับรองความถูกต้องโดยใช้โทเค็น ( ไม่ใช้รหัสเซสชันไม่ใช้หน่วยความจำเซิร์ฟเวอร์หรือที่เก็บไฟล์ ): Set-Cookie: user=innocent; preferred-color=azureและข้อแตกต่างเพียงอย่างเดียวที่ฉันสังเกตเห็นคือ JWT มีทั้งน้ำหนักบรรทุกและลายเซ็น ... ในขณะที่คุณสามารถเลือกได้ ระหว่างคุกกี้ที่ลงชื่อหรือข้อความธรรมดาสำหรับส่วนหัว http ในความคิดของฉันคุกกี้ที่ลงชื่อ ( cookie:'time=s%3A1464743488946.WvSJxbCspOG3aiGi4zCMMR9yBdvS%2B6Ob2f3OG6%2FYCJM') มีประสิทธิภาพในการใช้พื้นที่มากกว่าข้อเสียเปรียบเพียงประการเดียวคือไคลเอนต์ไม่สามารถอ่านโทเค็นได้มีเพียงเซิร์ฟเวอร์เท่านั้นที่ทำได้ ... แต่ฉันคิดว่าดีเพราะเช่นเดียวกับการอ้างสิทธิ์ใน JWT เป็นทางเลือกไม่จำเป็นสำหรับโทเค็น มีความหมาย

3
โทเค็น JWT ขนาดสูงสุดคือเท่าใด
ฉันต้องการทราบความยาวสูงสุดของ โทเค็นเว็บ JSON (JWT) ในรายละเอียดไม่มีข้อมูลเกี่ยวกับเรื่องนี้ อาจเป็นไปได้ว่าไม่มีข้อ จำกัด เรื่องความยาว?
114 jwt 

3
ขั้นตอนการลงชื่อเพียงครั้งเดียวโดยใช้ JWT สำหรับการตรวจสอบสิทธิ์ข้ามโดเมน
มีข้อมูลมากมายบนเว็บเกี่ยวกับการใช้ JWT ( Json Web Token) สำหรับการพิสูจน์ตัวตน แต่ผมก็ยังไม่พบว่ามีคำอธิบายที่ชัดเจนของสิ่งที่ไหลควรจะเป็นเมื่อใช้ JWT สัญญาณสำหรับการลงชื่อเข้าใช้ในการแก้ปัญหาเดียวในสภาพแวดล้อมหลายโดเมน ฉันทำงานให้กับ บริษัท แห่งหนึ่งซึ่งมีไซต์จำนวนมากในโฮสต์ที่แตกต่างกัน ใช้ Let 's example1.comและexample2.com เราจำเป็นต้องมี single sign-on วิธีการแก้ปัญหาซึ่งหมายความว่าถ้าพิสูจน์ผู้ใช้บนexample1.comเราต้องการให้เขายังได้รับการรับรองความถูกต้องในexample2.comโดยอัตโนมัติ เมื่อใช้ขั้นตอนการเชื่อมต่อ OpenIdฉันเข้าใจว่าผู้ใช้ที่ต้องการตรวจสอบสิทธิ์บนexample1.comจะถูกเปลี่ยนเส้นทางไปยังเซิร์ฟเวอร์การตรวจสอบความถูกต้อง (หรือOP: "OpenId Provider") ผู้ใช้พิสูจน์ตัวตนบนเซิร์ฟเวอร์นั้นซึ่งจะเปลี่ยนเส้นทางเขากลับไปยังไซต์example1.comดั้งเดิมด้วยโทเค็น JWT ที่ลงชื่อ (ฉันเข้าใจว่ามีอีกขั้นตอนหนึ่งที่ส่งคืนโทเค็นระดับกลางที่สามารถแลกเปลี่ยนกับโทเค็น JWT จริงได้ในภายหลัง แต่ฉันไม่คิดว่าสิ่งนี้จำเป็นสำหรับเรา) ... ตอนนี้ผู้ใช้กลับมาที่example1.comและได้รับการรับรองความถูกต้องแล้ว! เขาสามารถส่งคำขอส่งโทเค็น JWT ในAuthenticationส่วนหัวและเซิร์ฟเวอร์สามารถตรวจสอบ JWT ที่ลงนามแล้วดังนั้นจึงสามารถระบุผู้ใช้ได้ ดี! คำถามแรก: ควรเก็บโทเค็น JWT บนไคลเอนต์อย่างไร นอกจากนี้อีกครั้งข้อมูลจำนวนมากเกี่ยวกับเรื่องนี้และคนที่ดูเหมือนจะยอมรับว่าการใช้เป็นวิธีที่จะไปมากกว่าดีเก่าWeb Storage cookiesเราต้องการให้ JWT คงอยู่ระหว่างการรีสตาร์ทเบราว์เซอร์ดังนั้นขอใช้Local …

6
จะถอดรหัส JWT Token ได้อย่างไร?
ฉันไม่เข้าใจว่าห้องสมุดนี้ทำงานอย่างไร คุณช่วยฉันได้ไหม นี่คือรหัสง่ายๆของฉัน: public void TestJwtSecurityTokenHandler() { var stream = "eyJhbGciOiJSUzI1NiJ9.eyJpc3MiOiJJU1MiLCJzY29wZSI6Imh0dHBzOi8vbGFyaW0uZG5zY2UuZG91YW5lL2NpZWxzZXJ2aWNlL3dzIiwiYXVkIjoiaHR0cHM6Ly9kb3VhbmUuZmluYW5jZXMuZ291di5mci9vYXV0aDIvdjEiLCJpYXQiOiJcL0RhdGUoMTQ2ODM2MjU5Mzc4NClcLyJ9"; var handler = new JwtSecurityTokenHandler(); var jsonToken = handler.ReadToken(stream); } นี่คือข้อผิดพลาด: สตริงต้องอยู่ในรูปแบบ JSON แบบกะทัดรัดซึ่งอยู่ในรูปแบบ: Base64UrlEncodedHeader.Base64UrlEndcodedPayload.OPTIONAL, Base64UrlEncodedSignature ' หากคุณคัดลอกสตรีมในเว็บไซต์ jwt.ioก็ใช้ได้ดี :)
113 c#  .net  jwt 

5
แนวทางปฏิบัติที่ดีที่สุดสำหรับการจัดการโทเค็น JWT ทางฝั่งเซิร์ฟเวอร์ [ปิด]
ปิด . คำถามนี้เป็นคำถามความคิดเห็นตาม ขณะนี้ยังไม่ยอมรับคำตอบ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้สามารถตอบได้ด้วยข้อเท็จจริงและการอ้างอิงโดยแก้ไขโพสต์นี้ ปิดให้บริการเมื่อปีที่แล้ว ปรับปรุงคำถามนี้ (เกิดจากหัวข้อนี้ตั้งแต่นี้เป็นจริงคำถามที่เฉพาะเจาะจงของตัวเองและไม่ให้ NodeJS ฯลฯ ) ฉันกำลังใช้เซิร์ฟเวอร์ REST API ด้วยการพิสูจน์ตัวตนและฉันได้ใช้การจัดการโทเค็น JWT สำเร็จแล้วเพื่อให้ผู้ใช้สามารถเข้าสู่ระบบผ่านปลายทาง / login ด้วยชื่อผู้ใช้ / รหัสผ่านซึ่งโทเค็น JWT ถูกสร้างขึ้นจากความลับของเซิร์ฟเวอร์และส่งกลับไปที่ ลูกค้า. จากนั้นโทเค็นจะถูกส่งผ่านจากไคลเอนต์ไปยังเซิร์ฟเวอร์ในแต่ละคำขอ API ที่พิสูจน์ตัวตนซึ่งใช้ความลับของเซิร์ฟเวอร์เพื่อตรวจสอบโทเค็น อย่างไรก็ตามฉันพยายามทำความเข้าใจแนวทางปฏิบัติที่ดีที่สุดว่าควรตรวจสอบโทเค็นอย่างไรและเพียงใดเพื่อสร้างระบบที่ปลอดภัยอย่างแท้จริง สิ่งที่ควรเกี่ยวข้องในการ "ตรวจสอบ" โทเค็นหรือไม่ เพียงพอหรือไม่ที่สามารถตรวจสอบลายเซ็นโดยใช้ความลับของเซิร์ฟเวอร์ได้หรือฉันควรตรวจสอบโทเค็นและ / หรือเพย์โหลดโทเค็นกับข้อมูลบางอย่างที่เก็บไว้ในเซิร์ฟเวอร์ ระบบตรวจสอบความถูกต้องโดยใช้โทเค็นจะปลอดภัยพอ ๆ กับการส่งชื่อผู้ใช้ / รหัสผ่านในแต่ละคำขอโดยมีเงื่อนไขว่าจะได้รับโทเค็นเท่ากันหรือยากกว่าการได้รับรหัสผ่านของผู้ใช้ อย่างไรก็ตามในตัวอย่างที่ฉันเห็นข้อมูลเดียวที่จำเป็นในการสร้างโทเค็นคือชื่อผู้ใช้และความลับฝั่งเซิร์ฟเวอร์ นี่ไม่ได้หมายความว่าสมมติว่าผู้ใช้ที่เป็นอันตรายได้รับความรู้เกี่ยวกับความลับของเซิร์ฟเวอร์เป็นเวลาหนึ่งนาทีตอนนี้เขาสามารถสร้างโทเค็นในนามของผู้ใช้รายใดก็ได้ดังนั้นการเข้าถึงไม่เพียง แต่ให้กับผู้ใช้ที่ได้รับรายเดียวตามความเป็นจริงถ้ารหัสผ่านคือ ได้รับ แต่ในความเป็นจริงสำหรับบัญชีผู้ใช้ทั้งหมด ? สิ่งนี้นำฉันไปสู่คำถาม: 1) การตรวจสอบโทเค็น …

1
การตรวจสอบการเชื่อมต่อซ็อกเก็ต io โดยใช้ JWT
ฉันจะตรวจสอบการเชื่อมต่อ socket.io ได้อย่างไร? แอปพลิเคชันของฉันใช้ปลายทางการเข้าสู่ระบบจากเซิร์ฟเวอร์อื่น (python) เพื่อรับโทเค็นฉันจะใช้โทเค็นนั้นได้อย่างไรเมื่อใดก็ตามที่ผู้ใช้เปิดการเชื่อมต่อซ็อกเก็ตที่ฝั่งโหนด io.on('connection', function(socket) { socket.on('message', function(message) { io.emit('message', message); }); }); และฝั่งไคลเอ็นต์: var token = sessionStorage.token; var socket = io.connect('http://localhost:3000', { query: 'token=' + token }); หากโทเค็นถูกสร้างขึ้นใน python: token = jwt.encode(payload, SECRET_KEY, algorithm='HS256') ฉันจะใช้โทเค็นนี้เพื่อตรวจสอบการเชื่อมต่อซ็อกเก็ตในโหนดได้อย่างไร
111 node.js  socket.io  jwt  token 

4
JWT ควรเก็บไว้ใน localStorage หรือคุกกี้? [ซ้ำ]
คำถามนี้มีคำตอบอยู่แล้วที่นี่ : ที่เก็บ JWT ในเบราว์เซอร์? จะป้องกัน CSRF ได้อย่างไร? (5 คำตอบ) ปิดให้บริการใน4 เดือนที่ผ่านมา สำหรับวัตถุประสงค์ของการรักษาความปลอดภัย REST API ที่ใช้ JWT ตามวัสดุบางอย่าง (เช่นนี้คู่มือและคำถาม ) ที่ JWT สามารถเก็บไว้ในทั้งlocalStorageหรือคุกกี้ ตามความเข้าใจของฉัน: localStorageอยู่ภายใต้ XSS และโดยทั่วไปไม่แนะนำให้เก็บข้อมูลที่ละเอียดอ่อนใด ๆ ไว้ในนั้น ด้วยคุกกี้เราสามารถใช้แฟล็ก "httpOnly" ซึ่งช่วยลดความเสี่ยงของ XSS ได้ อย่างไรก็ตามหากเราต้องการอ่าน JWT จากคุกกี้ในแบ็กเอนด์เราจะต้องอยู่ภายใต้ CSRF ตามหลักฐานข้างต้น - จะเป็นการดีที่สุดหากเราเก็บ JWT ไว้ในคุกกี้ ในทุกการร้องขอไปยังเซิร์ฟเวอร์ JWT จะถูกอ่านจากคุกกี้และเพิ่มในส่วนหัวการอนุญาตโดยใช้โครงร่างของผู้ถือ จากนั้นเซิร์ฟเวอร์สามารถตรวจสอบ JWT ในส่วนหัวของคำขอได้ (ตรงข้ามกับการอ่านจากคุกกี้) …

4
JWT (Json Web Token) "ผู้ชม" กับ Client_Id - ความแตกต่างคืออะไร?
ฉันกำลังดำเนินการติดตั้ง OAuth 2.0 JWT access_token ในเซิร์ฟเวอร์การตรวจสอบสิทธิ์ของฉัน แต่ฉันไม่ชัดเจนว่าความแตกต่างระหว่างการaudอ้างสิทธิ์JWT และclient_idค่าส่วนหัว HTTP คืออะไร พวกเดียวกันหรือเปล่า? ถ้าไม่คุณสามารถอธิบายความแตกต่างระหว่างทั้งสองได้หรือไม่? ความสงสัยของฉันคือaudควรอ้างถึงเซิร์ฟเวอร์ทรัพยากรและclient_idควรอ้างถึงแอปพลิเคชันไคลเอนต์ตัวใดตัวหนึ่งที่เซิร์ฟเวอร์รับรองความถูกต้อง (เช่นเว็บแอปหรือแอป iOS) ในกรณีปัจจุบันเซิร์ฟเวอร์ทรัพยากรของฉันยังเป็นไคลเอนต์เว็บแอปของฉัน
103 oauth  oauth-2.0  jwt 

2
ถอดรหัสและตรวจสอบโทเค็น JWT โดยใช้ System.IdentityModel.Tokens.Jwt
ฉันได้รับการใช้JWTห้องสมุดถอดรหัส Json เว็บ Token และต้องการที่จะเปลี่ยนการดำเนิน JWT ไมโครซอฟท์อย่างเป็นทางการSystem.IdentityModel.Tokens.Jwt เอกสารประกอบมีน้อยมากดังนั้นฉันจึงมีช่วงเวลาที่ยากลำบากในการหาวิธีทำสิ่งที่ฉันทำกับไลบรารี JWT ให้สำเร็จ ด้วยไลบรารี JWT มีเมธอด Decode ที่ใช้ JWT ที่เข้ารหัส base64 และเปลี่ยนเป็น JSON ซึ่งสามารถ deserialized ได้ ฉันต้องการทำสิ่งที่คล้ายกันโดยใช้ System.IdentityModel.Tokens.Jwt แต่หลังจากขุดไปพอสมควรก็ไม่สามารถหาวิธีได้ สิ่งที่คุ้มค่าฉันกำลังอ่านโทเค็น JWT จากคุกกี้เพื่อใช้กับกรอบข้อมูลประจำตัวของ Google ความช่วยเหลือใด ๆ จะได้รับการชื่นชม
103 .net  wif  jwt 

9
มีตัวอย่าง JSON Web Token (JWT) ใน C # หรือไม่
ฉันรู้สึกเหมือนกำลังกินยาบ้าๆอยู่ที่นี่ โดยปกติแล้วจะมีไลบรารีและตัวอย่างกว่าล้านตัวอย่างลอยอยู่บนเว็บสำหรับงานใด ๆ ก็ตาม ฉันพยายามที่จะใช้การตรวจสอบด้วย Google "บัญชีบริการ" โดยการใช้ JSON เว็บโทเคน (JWT) ตามที่อธิบายไว้ที่นี่ อย่างไรก็ตามมีเฉพาะไลบรารีไคลเอ็นต์ใน PHP, Python และ Java แม้แต่การค้นหาตัวอย่าง JWT นอกการตรวจสอบสิทธิ์ของ Google ก็มีเพียงจิ้งหรีดและร่างแนวคิด JWT นี่เป็นระบบใหม่จริง ๆ และอาจเป็นระบบที่เป็นกรรมสิทธิ์ของ Google หรือไม่ ตัวอย่าง java ที่ใกล้เคียงที่สุดที่ฉันสามารถตีความได้ดูค่อนข้างเข้มข้นและน่ากลัว จะต้องมีบางอย่างใน C # ที่อย่างน้อยฉันก็เริ่มได้ ช่วยด้วยจะดีมาก!
102 c#  oauth  oauth-2.0  jwt 

2
Web API Authentication Basic เทียบกับ Bearer
ฉันได้สร้างการรับรองความถูกต้องโดยใช้ JWT ในแอปพลิเคชัน Web API ของฉัน ฉันไม่สามารถเข้าใจความแตกต่างระหว่าง โทเค็นพื้นฐาน ถือโทเค็น ใครช่วยฉันหน่อยได้ไหม

2
ใช้ JWT Bearer Authentication หลายตัว
เป็นไปได้ไหมที่จะรองรับผู้ออกโทเค็น JWT หลายตัวใน ASP.NET Core 2 ฉันต้องการจัดเตรียม API สำหรับบริการภายนอกและฉันต้องใช้แหล่งที่มาของโทเค็น JWT สองแหล่งนั่นคือ Firebase และผู้ออกโทเค็น JWT ที่กำหนดเอง ใน ASP.NET core ฉันสามารถตั้งค่าการพิสูจน์ตัวตน JWT สำหรับ Bearer auth Scheme ได้ แต่สำหรับหน่วยงานเดียวเท่านั้น: services .AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { options.Authority = "https://securetoken.google.com/my-firebase-project" options.TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = true, ValidIssuer = "my-firebase-project" ValidateAudience = true, ValidAudience = …

3
หนังสือเดินทางท้องถิ่นด้วย node-jwt-simple
ฉันจะรวมพาสปอร์ต - ท้องถิ่นเพื่อคืนโทเค็น JWT ในการพิสูจน์ตัวตนสำเร็จได้อย่างไร ฉันต้องการใช้node-jwt-simpleและดูที่passport.jsฉันไม่แน่ใจว่าจะดำเนินการอย่างไร var passport = require('passport') , LocalStrategy = require('passport-local').Strategy; passport.use(new LocalStrategy( function(username, password, done) { User.findOne({ username: username }, function(err, user) { if (err) { return done(err); } if (!user) { return done(null, false, { message: 'Incorrect username.' }); } if (!user.validPassword(password)) { return done(null, …

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.