ใน forward proxy ของ Go นั้น r.BasicAuth อ่าน Authorization header ซึ่งเป็นของการเข้าสู่ระบบเว็บไซต์ปลายทาง ข้อมูลรับรองของ proxy เองจะมาใน Proxy-Authorization

อะแดปเตอร์เล็ก ๆ สามารถใช้ parser สาธารณะซ้ำได้โดยไม่ต้องแก้ไขคำขอเดิม:

func proxyBasicAuth(r *http.Request) (string, string, bool) {
    headers := make(http.Header)
    headers.Set("Authorization", r.Header.Get("Proxy-Authorization"))
    return (&http.Request{Header: headers}).BasicAuth()
}

ส่วนนี้ใช้ net/http โดยคืนค่าที่แยกวิเคราะห์แล้วและธงความสำเร็จของการแยกวิเคราะห์ แต่ไม่ตรวจสอบยืนยันบัญชี ส่งผลลัพธ์ให้ตัวตรวจสอบข้อมูลรับรองที่ proxy กำหนดไว้

หากการตรวจสอบยืนยันล้มเหลว ให้ส่งคืน 407 พร้อม Proxy-Authenticate challenge ที่เหมาะสม และหยุดประมวลผลคำขอนั้น ตรวจสอบยืนยันก่อนเปิดการเชื่อมต่อไปยังปลายทางหรือรับ CONNECT tunnel

หลังจากรับข้อมูลรับรองแล้ว ให้ใช้ Proxy-Authorization header ของ proxy เองก่อนการส่งต่อตามปกติ รักษาฟิลด์ Authorization เดิมไว้สำหรับต้นทาง หากมี parent proxy อยู่เหนือขึ้นไป มันต้องมีการจัดวางการตรวจสอบยืนยันของตนเองอย่างตั้งใจ ไม่ใช่รับข้อมูลรับรองของไคลเอนต์นี้โดยบังเอิญ

บทความที่เกี่ยวข้อง