บริการเว็บ RESTful - จะตรวจสอบสิทธิ์คำขอจากบริการอื่นได้อย่างไร?


117

ฉันกำลังออกแบบบริการเว็บ RESTful ที่ผู้ใช้ต้องเข้าถึง แต่ยังรวมถึงบริการเว็บและแอปพลิเคชันอื่น ๆ ด้วย คำขอที่เข้ามาทั้งหมดจะต้องได้รับการตรวจสอบสิทธิ์ การสื่อสารทั้งหมดเกิดขึ้นผ่าน HTTPS การรับรองความถูกต้องของผู้ใช้จะทำงานตามโทเค็นการตรวจสอบความถูกต้องซึ่งได้มาจากการโพสต์ชื่อผู้ใช้และรหัสผ่าน (ผ่านการเชื่อมต่อ SSL) ไปยังทรัพยากร/ เซสชันที่ให้บริการโดยบริการ

ในกรณีของไคลเอ็นต์บริการบนเว็บไม่มีผู้ใช้ปลายทางอยู่เบื้องหลังบริการไคลเอ็นต์ การร้องขอจะเริ่มต้นโดยงานตามกำหนดการเหตุการณ์หรือการทำงานของคอมพิวเตอร์อื่น ๆ รายชื่อบริการเชื่อมต่อเป็นที่รู้จักล่วงหน้า (แน่นอนฉันเดา) ฉันจะตรวจสอบสิทธิ์คำขอเหล่านี้ที่มาจากบริการอื่น ๆ (เว็บ) ได้อย่างไร? ฉันต้องการให้ขั้นตอนการตรวจสอบสิทธิ์ง่ายที่สุดในการนำไปใช้กับบริการเหล่านั้น แต่ไม่ต้องเสียค่าใช้จ่ายด้านความปลอดภัย อะไรคือมาตรฐานและแนวทางปฏิบัติที่ดีที่สุดสำหรับสถานการณ์เช่นนี้

ตัวเลือกที่ฉันคิดได้ (หรือได้รับการแนะนำให้ฉัน):

  1. ให้บริการไคลเอ็นต์หันมาใช้ชื่อผู้ใช้และรหัสผ่าน "ปลอม" และตรวจสอบสิทธิ์ในลักษณะเดียวกับผู้ใช้ ฉันไม่ชอบตัวเลือกนี้ - มันไม่ถูกต้อง

  2. กำหนดรหัสแอปพลิเคชันถาวรสำหรับบริการไคลเอ็นต์ซึ่งอาจเป็นรหัสแอปพลิเคชันด้วย เท่าที่ฉันเข้าใจนี่ก็เหมือนกับการมี username + password ด้วยรหัสและรหัสนี้ฉันสามารถตรวจสอบสิทธิ์แต่ละคำขอหรือสร้างโทเค็นการตรวจสอบสิทธิ์เพื่อพิสูจน์ตัวตนคำขอเพิ่มเติม ไม่ว่าจะด้วยวิธีใดฉันไม่ชอบตัวเลือกนี้เพราะใครก็ตามที่ได้รับรหัสแอปพลิเคชันและคีย์สามารถแอบอ้างเป็นลูกค้าได้

  3. ฉันสามารถเพิ่มการตรวจสอบที่อยู่ IP ในตัวเลือกก่อนหน้าได้ ซึ่งจะทำให้คำขอปลอมทำได้ยากขึ้น

  4. ใบรับรองไคลเอ็นต์ ตั้งค่าผู้ออกใบรับรองของฉันเองสร้างใบรับรองหลักและสร้างใบรับรองไคลเอ็นต์สำหรับบริการไคลเอ็นต์ แม้ว่าจะมีปัญหาสองประการดังนี้ก) ฉันจะยังอนุญาตให้ผู้ใช้ตรวจสอบสิทธิ์โดยไม่มีใบรับรองได้อย่างไรและ b) สถานการณ์นี้ซับซ้อนเพียงใดในการใช้งานจากมุมมองของบริการไคลเอ็นต์

  5. อย่างอื่น - ต้องมีวิธีแก้ปัญหาอื่น ๆ หรือไม่?

บริการของฉันจะทำงานบน Java แต่ฉันจงใจทิ้งข้อมูลเกี่ยวกับเฟรมเวิร์กเฉพาะที่จะสร้างขึ้นเนื่องจากฉันสนใจหลักการพื้นฐานมากกว่าและไม่มากในรายละเอียดการใช้งาน - ฉันคิดว่าเป็นทางออกที่ดีที่สุดสำหรับสิ่งนี้ เป็นไปได้ที่จะนำไปใช้โดยไม่คำนึงถึงกรอบพื้นฐาน อย่างไรก็ตามฉันไม่ค่อยมีประสบการณ์เกี่ยวกับเรื่องนี้ดังนั้นเคล็ดลับและตัวอย่างที่เป็นรูปธรรมเกี่ยวกับการนำไปใช้จริง (เช่นไลบรารีของบุคคลที่สามที่มีประโยชน์บทความ ฯลฯ ) จะได้รับการชื่นชมมากเช่นกัน


หากฉันอาจแนะนำให้ทำความคุ้นเคยกับบริการเว็บไซต์ขนาดใหญ่และเลือกสิ่งที่คุณชอบ ผู้ใช้ของคุณจะพบว่ามีความคล้ายคลึงกันกับแนวทางปฏิบัติที่ดีที่สุดของบริการ RESTful อื่น ๆ
Yzmir Ramirez

พบอีกคำถาม (เกือบสองขวบ) ที่โดนใจเรื่องที่คล้ายกัน: stackoverflow.com/questions/1138831/…
Tommi

ระบบปฏิบัติการใดเป็นบริการ (ทั้งเว็บและอื่น ๆ ) ที่โฮสต์บน? พวกเขาทำงานบนเซิร์ฟเวอร์ที่เป็นส่วนหนึ่งของโครงสร้างพื้นฐานเดียวกันหรือไม่
Anders Abel

ระบบปฏิบัติการอาจแตกต่างกันไป: Win, * nix เป็นต้นและบริการไคลเอ็นต์อาจอยู่ในโครงสร้างพื้นฐานเดียวกันกับบริการของฉันหรือไม่ก็ได้
Tommi

คำตอบ:


34

การแก้ปัญหาใด ๆ สำหรับปัญหานี้จะกลายเป็นความลับร่วมกัน ฉันไม่ชอบตัวเลือกชื่อผู้ใช้และรหัสผ่านแบบฮาร์ดโค้ด แต่ก็มีประโยชน์ที่จะค่อนข้างง่าย ใบรับรองไคลเอ็นต์ก็ดีเหมือนกัน แต่มันต่างกันมากไหม? มีใบรับรองบนเซิร์ฟเวอร์และหนึ่งในไคลเอนต์ ข้อได้เปรียบหลักคือมันยากกว่าที่จะดุร้าย หวังว่าคุณจะมีการป้องกันอื่น ๆ เพื่อป้องกันสิ่งนั้น

ฉันไม่คิดว่าจุด A สำหรับโซลูชันใบรับรองไคลเอ็นต์ของคุณยากที่จะแก้ไข คุณเพียงแค่ใช้สาขา if (client side certificat) { check it } else { http basic auth }ฉันไม่ใช่ผู้เชี่ยวชาญด้าน java และฉันไม่เคยทำงานกับมันเพื่อทำใบรับรองฝั่งไคลเอ็นต์ อย่างไรก็ตาม Google ฉบับย่อนำเราไปสู่บทช่วยสอนนี้ซึ่งจะดูตรงซอยของคุณ

แม้จะมีการอภิปราย "อะไรดีที่สุด" ทั้งหมดนี้ แต่ขอผมชี้ให้เห็นว่ามีปรัชญาอีกประการหนึ่งที่กล่าวว่า "รหัสน้อยลงฉลาดน้อยดีกว่า" (ผมเองถือปรัชญานี้). โซลูชันใบรับรองไคลเอ็นต์ดูเหมือนรหัสมาก

ฉันรู้ว่าคุณแสดงคำถามเกี่ยวกับ OAuth แต่ข้อเสนอ OAuth2 มีวิธีแก้ปัญหาของคุณที่เรียกว่า " โทเค็นผู้ถือ " ซึ่งต้องใช้ร่วมกับ SSL ฉันคิดว่าเพื่อความเรียบง่ายฉันจะเลือกผู้ใช้ / รหัสผ่านแบบตายตัว (หนึ่งรายการต่อแอปเพื่อให้สามารถเพิกถอนได้ทีละรายการ) หรือโทเค็นผู้ถือที่คล้ายกันมาก


27
ใบรับรองไคลเอ็นต์ไม่ใช่ความลับที่ใช้ร่วมกัน นั่นเป็นเหตุผลที่พวกเขามีอยู่ ไคลเอนต์มีคีย์ส่วนตัวและเซิร์ฟเวอร์มีคีย์สาธารณะ ลูกค้าไม่เคยเปิดเผยความลับและคีย์สาธารณะไม่ใช่ความลับ
ทิม

5
ลิงก์บทช่วยสอนไม่ได้นำไปสู่บทความบทช่วยสอน แต่ไปที่หน้าดัชนี Java บนไซต์ Oracle ...
Marjan Venema

2
@MarjanVenema นั่นเป็นเพราะคุณกำลังลองใช้ลิงค์ +2 ปีหลังจากที่ newz2000 ตอบ แต่คุณสามารถลองใช้ WayBack Machine ได้ตลอดเวลา: web.archive.org/web/20110826004236/http://java.sun.com/…
Fábio Duque Silva

1
@MarjanVenema: ฉันขอโทษ แต่คุณคาดหวังว่า newz2000 จะมาที่นี่และอัปเดตลิงค์หลังจากที่มันตาย อย่างที่คุณบอกว่าลิงค์เน่าดังนั้นมันจึงเกิดขึ้นไม่ช้าก็เร็ว ไม่ว่าคุณจะพยายามเข้าถึงที่เก็บถาวรเพื่อดูสิ่งที่ผู้เขียนเห็นในเวลานั้นหรือคุณพบลิงก์ใหม่และให้การสนับสนุนในเชิงบวก ฉันไม่เห็นว่าความคิดเห็นของคุณช่วยใครได้อย่างไร แต่ไปที่ลิงค์นี้: oracle.com/technetwork/articles/javase/… (ระวังมันจะเน่าในที่สุด)
Fábio Duque Silva

2
@ FábioSilva: ไม่ฉันไม่คาดหวังให้เขาทำอย่างนั้น ฉันอ่านที่เก็บถาวรแล้ว แต่ฉันไม่มีเวลาไปตามหาลิงค์ใหม่ดังนั้นฉันจึงทำสิ่งที่ดีที่สุดถัดไป: แสดงความคิดเห็นว่ามันตายแล้วเพื่อให้คนอื่นจากชุมชนสามารถค้นหาตำแหน่งใหม่และอัปเดต เสา เห็นได้ชัดว่าคุณมีเวลาในการค้นหาลิงก์ใหม่ทำไมคุณไม่อัปเดตลิงก์ในโพสต์แทนที่จะใส่ไว้ในความคิดเห็นที่มีต่อฉัน
Marjan Venema

36

หลังจากอ่านคำถามของคุณฉันจะบอกว่าสร้างโทเค็นพิเศษเพื่อทำตามคำขอ โทเค็นนี้จะอยู่ในช่วงเวลาที่กำหนด (บอกว่าในหนึ่งวัน)

นี่คือตัวอย่างจากการสร้างโทเค็นการตรวจสอบความถูกต้อง:

(day * 10) + (month * 100) + (year (last 2 digits) * 1000)

ตัวอย่างเช่น 3 มิถุนายน 2554

(3 * 10) + (6 * 100) + (11 * 1000) = 
30 + 600 + 11000 = 11630

จากนั้นเชื่อมต่อกับรหัสผ่านของผู้ใช้ตัวอย่างเช่น "my4wesomeP4ssword!"

11630my4wesomeP4ssword!

จากนั้นทำ MD5 ของสตริงนั้น:

05a9d022d621b64096160683f3afe804

คุณเรียกคำขอเมื่อใดให้ใช้โทเค็นนี้เสมอ

https://mywebservice.com/?token=05a9d022d621b64096160683f3afe804&op=getdata

โทเค็นนี้ไม่ซ้ำกันทุกวันดังนั้นฉันเดาว่าการป้องกันแบบนี้เพียงพอที่จะปกป้องบริการของคุณอยู่เสมอ

หวังว่าจะช่วยได้

:)


1
ฉันชอบวิธีที่คุณเพิ่มโทเค็นความปลอดภัยในทุกคำขอ แต่จะเกิดอะไรขึ้นเมื่อโปรแกรมเมอร์สร้างหน้า jsp 100 หน้าแล้วและหลังจากนั้น t0 ก็ใช้การรักษาความปลอดภัยใน 100 หน้าที่สร้างไว้ก่อนหน้านี้รวมถึงเพจที่กำลังจะสร้างขึ้น ในกรณีนี้การต่อท้ายโทเค็นในแต่ละคำขอไม่ใช่ทางเลือกที่ถูกต้องอย่างไรก็ตาม +1 สำหรับเทคนิคของคุณ :)
Ankur Verma

4
จะเกิดอะไรขึ้นถ้านาฬิกาไม่ซิงโครไนซ์? ลูกค้าจะสร้างโทเค็นผิดในอินสแตนซ์นี้ไม่ใช่หรือ แม้ว่าทั้งสองจะสร้างวันที่และเวลาใน UTC นาฬิกาของพวกเขาก็ยังคงแตกต่างกันซึ่งส่งผลให้เกิดหน้าต่างเวลาทุกวันเมื่อโทเค็นไม่ทำงาน?
NickG

@NickG ฉันเคยมีปัญหานี้มาก่อนวิธีเดียวที่จะรักษาความปลอดภัยนี้โดยการขอเวลาเซิร์ฟเวอร์ สิ่งนี้จะฆ่าปัญหา UTC ได้ 99% แน่นอนว่าข้อเสียคือการเรียกไปยังเซิร์ฟเวอร์เพิ่มเติม
kororo

แต่ฉันยังสามารถใช้บริการเว็บของคุณโดยใช้โทเค็นนี้ได้หนึ่งวันใช่ไหม ฉันไม่เห็นว่าสิ่งนี้จะช่วยได้อย่างไร
Mina Gabriel

@MinaGabriel คุณสามารถเพิ่มกรอบเวลาในการสร้างโทเค็นได้ (นาที * 10) + (ชั่วโมง * 100) + (วัน * 1000) + (เดือน * 10,000) + (ปี (2 หลักสุดท้าย) * 100000)
โระ

11

มีหลายวิธีที่คุณสามารถทำได้

  1. RESTful purists ต้องการให้คุณใช้การรับรองความถูกต้องพื้นฐานและส่งข้อมูลรับรองในทุกคำขอ เหตุผลของพวกเขาคือไม่มีใครเก็บรัฐใด ๆ

  2. ฝ่ายบริการลูกค้าสามารถจัดเก็บคุกกี้ซึ่งเก็บรักษารหัสเซสชันไว้ โดยส่วนตัวแล้วฉันไม่คิดว่าสิ่งนี้น่ารังเกียจเหมือนคนเจ้าระเบียบบางคนที่ฉันได้ยินมา - อาจมีราคาแพงในการตรวจสอบสิทธิ์ซ้ำแล้วซ้ำเล่า ดูเหมือนว่าคุณจะไม่ชอบความคิดนี้มากเกินไป

  3. จากคำอธิบายของคุณดูเหมือนว่าคุณอาจสนใจOAuth2ประสบการณ์ของฉันจนถึงตอนนี้จากที่ฉันเคยเห็นมาคือมันค่อนข้างสับสนและมีเลือดออก มีการใช้งานอยู่ที่นั่น แต่มีน้อยและอยู่ไกล ใน Java ฉันเข้าใจว่าได้รวมเข้ากับโมดูลความปลอดภัยของ Spring3 แล้ว ( บทช่วยสอนของพวกเขาเขียนไว้อย่างดี) ฉันรอดูว่าจะมีส่วนขยายในRestletหรือไม่ แต่จนถึงตอนนี้แม้ว่าจะมีการเสนอและอาจอยู่ในตู้อบ แต่ก็ยังไม่ได้รวมเข้าด้วยกันอย่างสมบูรณ์


ฉันไม่มีอะไรเทียบกับตัวเลือกที่ 2 - ฉันคิดว่ามันเป็นทางออกที่ดีในแอพ RESTful - แต่บริการไคลเอนต์ได้รับโทเค็นจากที่ไหนตั้งแต่แรก? พวกเขาตรวจสอบความถูกต้องในครั้งแรกได้อย่างไร? บางทีฉันอาจคิดผิด แต่ก็แปลกที่บริการไคลเอ็นต์จะต้องมีชื่อผู้ใช้และรหัสผ่านของตัวเอง
Tommi

หากผู้ใช้ปลายทางเป็นผู้ใช้ของคุณบริการตัวกลางจะส่งข้อมูลรับรองไปให้คุณตามคำขอแรกและคุณสามารถส่งคืนคุกกี้หรือโทเค็นอื่น ๆ ได้
jwismar

ในทำนองเดียวกันในสถานการณ์ OAuth ผู้ใช้ปลายทางจะมอบหมายให้บริการตัวกลางในการเข้าถึงบริการเว็บของคุณ
jwismar

ดูเหมือนจะมีความเข้าใจผิด - ไม่มีผู้ใช้ที่อยู่เบื้องหลังบริการไคลเอ็นต์เลย ฉันได้อัปเดตคำถามเพื่ออธิบายสถานการณ์ให้ดีขึ้น
Tommi

1
ฉันจะเพิ่มว่าตัวเลือก # 1 ในรายการด้านบนควรทำผ่าน HTTPS เท่านั้น
mr-sk

3

ฉันเชื่อว่าแนวทาง:

  1. คำขอแรกลูกค้าส่ง id / passcode
  2. แลกเปลี่ยน id / pass สำหรับโทเค็นที่ไม่ซ้ำกัน
  3. ตรวจสอบโทเค็นสำหรับแต่ละคำขอที่ตามมาจนกว่าจะหมดอายุ

ค่อนข้างเป็นมาตรฐานไม่ว่าคุณจะใช้งานอย่างไรและรายละเอียดทางเทคนิคเฉพาะอื่น ๆ

หากคุณต้องการพุชซองจดหมายจริงๆคุณอาจถือว่าคีย์ https ของไคลเอ็นต์อยู่ในสถานะที่ไม่ถูกต้องชั่วคราวจนกว่าจะมีการตรวจสอบข้อมูลรับรอง จำกัด ข้อมูลหากไม่เป็นเช่นนั้นและให้สิทธิ์การเข้าถึงเมื่อมีการตรวจสอบโดยพิจารณาจากวันหมดอายุอีกครั้ง

หวังว่านี่จะช่วยได้


3

เท่าที่แนวทางใบรับรองไคลเอ็นต์ดำเนินไปการใช้งานจะไม่ยากมากในขณะที่ยังอนุญาตให้ผู้ใช้ที่ไม่มีใบรับรองไคลเอ็นต์เข้ามา

หากคุณได้สร้างหน่วยงานรับรองที่ลงนามด้วยตนเองและออกใบรับรองลูกค้าให้กับบริการลูกค้าแต่ละรายคุณจะมีวิธีง่ายๆในการตรวจสอบสิทธิ์บริการเหล่านั้น

ขึ้นอยู่กับเว็บเซิร์ฟเวอร์ที่คุณใช้ควรมีวิธีการระบุการรับรองความถูกต้องของไคลเอ็นต์ที่จะยอมรับใบรับรองไคลเอ็นต์ แต่ไม่จำเป็นต้องใช้ ตัวอย่างเช่นใน Tomcat เมื่อระบุตัวเชื่อมต่อ https คุณสามารถตั้งค่า "clientAuth = want" แทน "true" หรือ "false" จากนั้นคุณต้องแน่ใจว่าได้เพิ่มใบรับรอง CA ที่ลงนามด้วยตนเองไปยัง Truststore ของคุณ (โดยค่าเริ่มต้นคือไฟล์ cacerts ใน JRE ที่คุณใช้เว้นแต่คุณจะระบุไฟล์อื่นในการกำหนดค่าเว็บเซิร์ฟเวอร์ของคุณ) ดังนั้นใบรับรองที่เชื่อถือได้เท่านั้นจึงจะเป็นใบรับรองที่ออกจาก CA ของคุณลงนามด้วยตนเอง

ในฝั่งเซิร์ฟเวอร์คุณจะอนุญาตให้เข้าถึงบริการที่คุณต้องการปกป้องก็ต่อเมื่อคุณสามารถดึงใบรับรองไคลเอ็นต์จากคำขอ (ไม่ใช่ค่าว่าง) และผ่านการตรวจสอบ DN ใด ๆ หากคุณต้องการความปลอดภัยเพิ่มเติม สำหรับผู้ใช้ที่ไม่มีใบรับรองไคลเอ็นต์พวกเขาจะยังคงเข้าถึงบริการของคุณได้ แต่จะไม่มีใบรับรองอยู่ในคำขอ

ในความคิดของฉันนี่เป็นวิธีที่ 'ปลอดภัยที่สุด' แต่แน่นอนว่ามันมีช่วงการเรียนรู้และค่าใช้จ่ายดังนั้นอาจไม่จำเป็นต้องเป็นทางออกที่ดีที่สุดสำหรับความต้องการของคุณ


3

5. อย่างอื่น - ต้องมีวิธีแก้ปัญหาอื่น ๆ หรือไม่?

คุณพูดถูกมี! และเรียกว่า JWT (JSON Web Tokens)

JSON Web Token (JWT) เป็นมาตรฐานแบบเปิด (RFC 7519) ที่กำหนดวิธีที่กะทัดรัดและมีอยู่ในตัวสำหรับการส่งข้อมูลอย่างปลอดภัยระหว่างฝ่ายต่างๆในรูปแบบวัตถุ JSON ข้อมูลนี้สามารถตรวจสอบและเชื่อถือได้เนื่องจากมีการลงนามแบบดิจิทัล JWT สามารถลงนามได้โดยใช้ความลับ (ด้วยอัลกอริทึม HMAC) หรือคู่คีย์สาธารณะ / ส่วนตัวโดยใช้ RSA

ฉันขอแนะนำเป็นอย่างยิ่งให้ดู JWT เป็นวิธีแก้ปัญหาที่ง่ายกว่ามากเมื่อเปรียบเทียบกับวิธีแก้ปัญหาอื่น ๆ

https://jwt.io/introduction/


1

คุณสามารถสร้างเซสชันบนเซิร์ฟเวอร์และแชร์sessionIdระหว่างไคลเอนต์และเซิร์ฟเวอร์ด้วยการเรียก REST แต่ละครั้ง

  1. ตรวจสอบสิทธิ์คำขอ REST ครั้งแรก: /authenticate. ส่งคืนการตอบกลับ (ตามรูปแบบไคลเอนต์ของคุณ) ด้วยsessionId: ABCDXXXXXXXXXXXXXX;

  2. ร้านนี้sessionIdอยู่ในMapกับเซสชั่นที่เกิดขึ้นจริง Map.put(sessionid, session)หรือใช้SessionListenerสร้างและทำลายกุญแจสำหรับคุณ

    public void sessionCreated(HttpSessionEvent arg0) {
      // add session to a static Map 
    }
    
    public void sessionDestroyed(HttpSessionEvent arg0) {
      // Remove session from static map
    }
    
  3. รับ sessionid ทุกครั้งที่เรียก REST เช่นURL?jsessionid=ABCDXXXXXXXXXXXXXX(หรือวิธีอื่น ๆ );

  4. ดึงHttpSessionข้อมูลจากแผนที่โดยใช้sessionId;
  5. ตรวจสอบคำร้องขอสำหรับเซสชันนั้นหากเซสชันทำงานอยู่
  6. ส่งการตอบกลับหรือข้อความแสดงข้อผิดพลาด

0

ฉันจะใช้ให้แอปพลิเคชันเปลี่ยนเส้นทางผู้ใช้ไปยังไซต์ของคุณด้วยพารามิเตอร์ id แอปพลิเคชันเมื่อผู้ใช้อนุมัติคำขอจะสร้างโทเค็นเฉพาะที่แอปอื่นใช้สำหรับการตรวจสอบสิทธิ์ วิธีนี้ทำให้แอปพลิเคชันอื่นไม่จัดการข้อมูลรับรองผู้ใช้และแอปพลิเคชันอื่น ๆ สามารถเพิ่มลบและจัดการโดยผู้ใช้ Foursquare และเว็บไซต์อื่น ๆ อีกสองสามแห่งรับรองความถูกต้องด้วยวิธีนี้และง่ายต่อการใช้งานเหมือนกับแอปพลิเคชันอื่น


อืมไม่แน่ใจว่าทำตามคำอธิบายได้ไหม เรากำลังพูดถึงผู้ใช้รายใด ฉันกำลังพูดถึงแอปพลิเคชันที่สื่อสารกับแอปพลิเคชันอื่น ฉันคิดว่าคุณเข้าใจสิ่งนี้ แต่ฉันยังไม่เข้าใจ จะเกิดอะไรขึ้นเมื่อ "โทเค็น" นี้หมดอายุเป็นต้น
Tommi

โทเค็นที่คุณสร้างและส่งกลับไปยังแอปพลิเคชันอื่นนั้นเป็นโทเค็นแบบถาวรซึ่งจะเชื่อมโยงกับผู้ใช้และแอปพลิเคชัน นี่คือลิงค์ไปยัง foursquares docs developer.foursquare.com/docs/oauth.htmlและโดยพื้นฐานแล้วมันเป็นเพียงแค่ oauth2 ดังนั้นลองดูวิธีการตรวจสอบสิทธิ์ที่ดี
Devin M

ดูเหมือนจะมีความเข้าใจผิด - ไม่มีผู้ใช้ที่อยู่เบื้องหลังบริการไคลเอ็นต์เลย เอกสาร foursquare ที่คุณเชื่อมโยงกล่าวถึงการเข้าถึงแบบไม่ใช้ผู้ใช้สั้น ๆ ดังนั้นอย่างน้อยก็มีประโยชน์บ้าง - ขอบคุณ! แต่ฉันยังไม่สามารถสร้างภาพที่สมบูรณ์ได้ว่ามันจะทำงานอย่างไรในความเป็นจริง
Tommi

เพียงแค่สร้างคีย์สำหรับแอปพลิเคชันจากนั้นหากสิ่งที่คุณทำคืออนุญาตให้เข้าถึงแอปพลิเคชันดังนั้น application_id และ application_key ที่เรียบง่ายควรใช้สำหรับการตรวจสอบสิทธิ์ หากคุณต้องการให้พวกเขาตรวจสอบความถูกต้องด้วยโทเค็นโดยใช้ตัวเลือกการพิสูจน์ตัวตนโทเค็นของประดิษฐ์เพราะมันจะเป็นพารามิเตอร์ที่ส่งไปพร้อมกับคำขอ url ไปยังแอปพลิเคชันของคุณ
Devin M

แต่สิ่งนี้ไม่เหมือนกับสถานการณ์โทเค็นการรับรองความถูกต้องของชื่อผู้ใช้ + รหัสผ่าน = เซสชันใช่หรือไม่ application_id และ application_key เป็นเพียงคำพ้องความหมายสำหรับชื่อผู้ใช้และรหัสผ่านไม่ใช่หรือ :) เป็นเรื่องที่ดีอย่างยิ่งถ้านี่เป็นแนวทางปฏิบัติมาตรฐานสำหรับสถานการณ์เช่นนี้อย่างที่ฉันบอกฉันไม่มีประสบการณ์ในเรื่องนี้ - แต่ฉันคิดว่าอาจมีทางเลือกอื่น ...
ทอมมี

-3

นอกจากการรับรองความถูกต้องแล้วฉันขอแนะนำให้คุณคิดถึงภาพรวม พิจารณาสร้างบริการแบ็กเอนด์ RESTful โดยไม่ต้องมีการตรวจสอบสิทธิ์ จากนั้นใส่การรับรองความถูกต้องที่เรียบง่ายซึ่งจำเป็นต้องใช้บริการชั้นกลางระหว่างผู้ใช้ปลายทางและบริการแบ็กเอนด์


ระหว่างผู้ใช้ปลายทางและบริการแบ็กเอนด์? จะไม่ปล่อยให้บริการไคลเอ็นต์โดยไม่ได้รับการรับรองความถูกต้องทั้งหมดหรือ มันไม่ใช่สิ่งที่ฉันต้องการ แน่นอนฉันสามารถวางชั้นกลางระหว่างบริการเว็บและบริการไคลเอ็นต์ของฉันได้ แต่ก็ยังคงทำให้คำถามเปิดอยู่: รูปแบบการตรวจสอบสิทธิ์ที่แท้จริงจะเป็นอย่างไร
Tommi

ชั้นกลางสามารถเป็นเว็บเซิร์ฟเวอร์เช่น Nginx คุณสามารถตรวจสอบสิทธิ์ได้ที่นั่น โมเดลการพิสูจน์ตัวตนสามารถใช้เซสชันได้
Dagang

ตามที่ฉันได้พยายามอธิบายในคำถามของฉันฉันไม่ต้องการรูปแบบการตรวจสอบสิทธิ์ตามเซสชันสำหรับบริการไคลเอ็นต์เหล่านี้ (โปรดดูการอัปเดตของฉันสำหรับคำถาม)
Tommi

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