การตรวจสอบสิทธิ์พื้นฐาน HTTP และผู้ถือโทเค็น


115

ฉันกำลังพัฒนา REST-API ซึ่ง HTTP-Basic ได้รับการป้องกันสำหรับสภาพแวดล้อมการพัฒนา เนื่องจากการตรวจสอบความถูกต้องจริงผ่านโทเค็นฉันยังคงพยายามหาวิธีส่งส่วนหัวการอนุญาตสองรายการ

ฉันได้ลองสิ่งนี้แล้ว:

curl -i http://dev.myapp.com/api/users \
  -H "Authorization: Basic Ym9zY236Ym9zY28=" \
  -H "Authorization: Bearer mytoken123"

ตัวอย่างเช่นฉันสามารถปิดใช้งาน HTTP-Authentication สำหรับ IP ของฉันได้ แต่เนื่องจากโดยปกติแล้วฉันจะทำงานในสภาพแวดล้อมที่แตกต่างกันด้วยไดนามิก IPs นี่ไม่ใช่ทางออกที่ดี ฉันขาดอะไรไปหรือเปล่า?


2
ฉันจำเป็นต้องตรวจสอบสิทธิ์ผ่าน HTTP Basic เนื่องจากเซิร์ฟเวอร์ Dev ได้รับการป้องกันและฉันต้องการการตรวจสอบความถูกต้องโดยใช้โทเค็นสำหรับ API แต่เมื่อฉันใช้ curl เพื่อทดสอบ api ฉันต้องการวิธีส่งทั้งส่วนหัวการตรวจสอบสิทธิ์ ดังนั้นอันแรก (พื้นฐาน) เพื่อส่งผ่าน HTTP Basic และอันที่สอง (โทเค็น) เพื่อพิสูจน์ตัวตนกับแอปพลิเคชันของฉัน และใช่มันเป็นการสร้างของฉันเอง
Azngeek

1
คุณเคยคิดออกไหม? ฉันกำลังเพิ่มเงินรางวัล
Adam Waite

4
สวัสดีอดัมน่าเสียดายที่ไม่ ตอนนี้ฉันได้เปลี่ยนวิธีการทำงานของการตรวจสอบสิทธิ์โดยเปลี่ยนส่วนหัวการอนุญาตสำหรับโทเค็นเป็น "x-auth" ซึ่งไม่ใช่ส่วนหัวมาตรฐาน
Azngeek

1
เซิร์ฟเวอร์ nginx ของฉันไม่ยอมรับส่วนหัวการอนุญาต 2 รายการ มันส่งคืนไฟล์400 Bad request. โง่.
Rudie

1
เกิดอะไรขึ้นกับการใช้ส่วนหัวที่กำหนดเองสำหรับโทเค็น API ของคุณ ฉันไม่เห็นว่าทำไมคนที่นี่ถึง "ทิ้ง" โดยใช้ HTTP Basic Auth เพื่อให้เซิร์ฟเวอร์การพัฒนา / การจัดเตรียมอยู่ห่างจากการสอดรู้สอดเห็น
Sunil D.

คำตอบ:


68

ลองใช้วิธีนี้เพื่อผลักดันการรับรองความถูกต้องพื้นฐานที่ url:

curl -i http://username:password@dev.myapp.com/api/users -H "Authorization: Bearer mytoken123"
               ^^^^^^^^^^^^^^^^^^

หากข้างต้นไม่ได้ผลแสดงว่าคุณไม่มีส่วนเกี่ยวข้องใด ๆ ดังนั้นลองทางเลือกต่อไปนี้

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

curl -i http://dev.myapp.com/api/users \
  -H "Authorization: Basic Ym9zY236Ym9zY28=" \
  -H "Application-Authorization: mytoken123"

สังเกตว่าฉันได้เปลี่ยนส่วนหัวเป็นApplication-Authorizationไฟล์. ดังนั้นจากแอปพลิเคชันของคุณให้จับโทเค็นภายใต้ส่วนหัวนั้นและประมวลผลสิ่งที่คุณต้องทำ

สิ่งที่คุณสามารถทำได้อีกอย่างคือส่งtokenผ่านPOSTพารามิเตอร์และคว้าค่าของพารามิเตอร์จากฝั่งเซิร์ฟเวอร์ ตัวอย่างเช่นการส่งโทเค็นด้วยพารามิเตอร์ curl post:

-d "auth-token=mytoken123"

1
สวัสดี Sabuj ปัญหาไม่ได้อยู่ที่วิธีการส่งชื่อผู้ใช้และรหัสผ่าน แต่ส่วนหัวการอนุญาตหลายรายการใช้ไม่ได้ ดูรายละเอียด ( ietf.org/rfc/rfc2617.txt ) ฉันเห็นว่าควรจะเป็นไปได้ แต่ตามที่ระบุไว้ด้วย "" ตัวแทนผู้ใช้ต้องเลือกใช้หนึ่งในความท้าทายที่มีรูปแบบการตรวจสอบสิทธิ์ที่แข็งแกร่งที่สุดที่เข้าใจและขอข้อมูลรับรองจากผู้ใช้ตามความท้าทายนั้น "ดังนั้นเช่นเดียวกับที่ฉันเขียนเมื่อ 2 วันก่อนฉันต้องผ่าน โทเค็นเป็นส่วนหัวที่ไม่ได้มาตรฐานซึ่งไม่เป็นไรเมื่อคุณจัดการกับสถาปัตยกรรมที่ไม่ได้มาตรฐาน
Azngeek

5
@Azngeek Curl ส่งทั้งส่วนหัวการอนุญาตเมื่อคุณดำเนินการ คุณต้องจัดการตั้งแต่ตอนท้ายเซิร์ฟเวอร์ของคุณ เพียงเรียกใช้คำสั่ง curl ของคุณด้วยส่วนหัวทั้งสองด้วย-vพารามิเตอร์ คุณจะพบว่าส่งAuthorization: Basic Ym9zY236Ym9zY28=, Authorization: Bearer mytoken123ตามส่วนหัวของคำขอ จากจุดสิ้นสุดเซิร์ฟเวอร์ของคุณหากคุณตรวจสอบคุณจะพบว่าคุณมีส่วนหัวการอนุญาตเช่นนี้Authorization: Basic Ym9zY236Ym9zY28=, Bearer mytoken123โดยคั่นด้วยลูกน้ำ ดังนั้นฉันควรแนะนำให้คุณเลือกทางเลือก
Sabuj Hassan

34

Standard ( https://tools.ietf.org/html/rfc6750 ) ระบุว่าคุณสามารถใช้:

  • Form-Encoded Body Parameter: Authorization: Bearer mytoken123
  • URI Query Parameter: access_token = mytoken123

ดังนั้นจึงเป็นไปได้ที่จะส่งผ่าน Bearer Token จำนวนมากพร้อม URI แต่การทำเช่นนี้ไม่ได้รับการสนับสนุน (ดูหัวข้อที่ 5 ในมาตรฐาน)


4

หากคุณใช้ reverse proxy เช่น nginx อยู่ระหว่างนั้นคุณสามารถกำหนดโทเค็นที่กำหนดเองได้เช่นX-API-Token.

ใน nginx คุณจะเขียนซ้ำเพื่อให้พร็อกซีต้นน้ำ (api ที่เหลือของคุณ) เป็นเพียงการรับรองความถูกต้อง:

proxy_set_header Authorization $http_x_api_token;

... ในขณะที่ nginx สามารถใช้ส่วนหัวการอนุญาตดั้งเดิมเพื่อตรวจสอบ HTTP AUth


3

ฉันมีปัญหาที่คล้ายกัน - ตรวจสอบอุปกรณ์และผู้ใช้ที่อุปกรณ์ ฉันใช้Cookieส่วนหัวควบคู่ไปกับAuthorization: Bearer...ส่วนหัว


ไม่ชัดเจนว่าทำไมจึงโหวตลง ฉันเจอคำถามนี้เพื่อค้นหาคำตอบสำหรับปัญหาที่เกี่ยวข้อง - นี่คือวิธีที่ฉันแก้ไข Cookieส่วนหัวที่มีอยู่แล้วที่ใช้บ่อยสำหรับการตรวจสอบ
Iiridayn

2

ขด --anyauth

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


1

มีโซลูชันอื่นสำหรับการทดสอบ API บนเซิร์ฟเวอร์การพัฒนา

  • ตั้งค่าHTTP Basic Authenticationสำหรับเส้นทางเว็บเท่านั้น
  • ปล่อยเส้นทาง API ทั้งหมดให้เป็นอิสระจากการตรวจสอบสิทธิ์

การกำหนดค่าเว็บเซิร์ฟเวอร์สำหรับnginxและLaravelจะเป็นดังนี้:

    location /api {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location / {
        try_files $uri $uri/ /index.php?$query_string;

        auth_basic "Enter password";
        auth_basic_user_file /path/to/.htpasswd;
    }

Authorization: Bearer จะทำหน้าที่ปกป้องเซิร์ฟเวอร์การพัฒนาจากโปรแกรมรวบรวมข้อมูลเว็บและผู้เยี่ยมชมที่ไม่ต้องการอื่น ๆ


0

ด้วย nginx คุณสามารถส่งโทเค็นทั้งสองแบบนี้ได้ (แม้ว่าจะผิดมาตรฐานก็ตาม):

Authorization: Basic basic-token,Bearer bearer-token

สิ่งนี้ใช้ได้ตราบเท่าที่โทเค็นพื้นฐานเป็นอันดับแรก - nginx ส่งต่อไปยังแอ็พพลิเคชันเซิร์ฟเวอร์ได้สำเร็จ

จากนั้นคุณต้องตรวจสอบให้แน่ใจว่าแอปพลิเคชันของคุณสามารถแยก Bearer จากสตริงด้านบนได้อย่างถูกต้อง

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