การตั้งค่า https คุกกี้ใน nodejs
ฉันพยายามตั้งค่าระบบล็อกอินบนเว็บไซต์ของฉันมากเกินไป
ได้ยินมาว่าคุกกี้ nodejs เป็นวิธีที่ดีในการทำเช่นนั้น
ในลิงค์ต่อไปนี้:
https://stackoverflow.com/a/21809393/322537
https://nodejs.org/dist/latest-v8.x/docs/api/https.html
ฉันพบตัวอย่างวิธีสร้างเซิร์ฟเวอร์ https เป็นความเข้าใจของฉันว่าฟังก์ชัน createServer ควรทำงานทุกครั้งที่ลูกค้าส่งคำขอ
ดังนั้นฉันจึงมีสิ่งต่อไปนี้ในรหัสของฉัน:
var server_https=modules.https.createServer({
key: this.ssl_key,
cert:this.ssl_cert
},this.respond_to_client).listen(this.port);
mconnection.prototype.respond_to_client=function(request,response){
console.log('responded to client');
}
ดูเหมือนว่าเซิร์ฟเวอร์จะทำงานได้ดีเมื่อเว็บไซต์เริ่มทำงาน แต่respond_to_clientฟังก์ชั่นจะปรากฏขึ้นที่จะไม่ใช้เป็นแฟ้มบันทึก nodejs ไม่เคยแสดงให้เห็นถึง 'ตอบสนองต่อลูกค้าสตริง
เป็นไปได้อย่างไร? มีบางอย่างเกี่ยวข้องกับการที่ฉันอัปเกรดเซิร์ฟเวอร์ https เป็น websocket ในภายหลังในโค้ดได้หรือไม่?
อัปเดต:
นี่คือไฟล์เซิร์ฟเวอร์:
https://openage.org/s.js
นี่คือโมดูลการเชื่อมต่อ:
https://openage.org/c.js
และนี่คือโปรแกรมแชทที่ให้บริการ
https://openage.org/chat/14/?page=index
แผนคือการสร้างคุกกี้เพื่อระบุลูกค้าจากนั้นจึงตั้งค่าระบบล็อกอิน แต่ฉันติดอยู่ที่นี่ /:
คำตอบ
ฉันได้จำลองสคริปต์โหนดของคุณสำหรับการทดสอบภายในเครื่องแล้ว ก่อนอื่นฉันมีสิ่งต่างๆที่ทำงานบน http (เทียบกับ https) และสามารถรับการตอบสนองได้ดี อย่างไรก็ตามเมื่อย้ายไปที่ https คำขอจะไม่ได้รับจากเซิร์ฟเวอร์ เบราว์เซอร์ต้องสร้างการเชื่อมต่อที่ปลอดภัยก่อนที่จะส่งคำขอจริง
ฉันพบปัญหาที่คล้ายกันเมื่อพยายามเรียกใช้เซิร์ฟเวอร์หลายตัว (https และ ws) บนพอร์ตเดียวกัน สิ่งที่คุณมีอยู่ใกล้มาก แต่การตั้งค่า https.createServer ({ตัวเลือก} ตัวจัดการ) จำเป็นต้องมีการปรับเปลี่ยน
ที่คุณมี:
var server_https= https.createServer({
key: this.ssl_key,
cert:this.ssl_cert
},respond_to_client).listen(this.port);
คุณต้องเพิ่มตัวเลือกสำหรับ "ca" ด้วย:
var server_https= https.createServer({
key: this.ssl_key,
cert: this.ssl_cert,
ca: this.ssl_ca, // also add this
},respond_to_client).listen(this.port);
ค่าที่ฉันใช้สำหรับ "ca" คือเนื้อหาของไฟล์: intermediate.crt ที่ได้รับจากผู้ลงนามใบรับรอง
สำคัญ
แม้ว่าอาจเป็นไปได้ที่จะทำงานนี้โดยใช้ใบรับรองที่ลงนามด้วยตนเอง แต่ฉันไม่เคยทำได้เนื่องจากไม่มีอำนาจลงนาม
เช่นเดียวกับที่คุณทำกับไฟล์ใบรับรองอื่น ๆ ของคุณคุณควรทำเช่นนี้กับไฟล์ intermediate.crt
//Where you read your other cert files: add another.
this.ssl_ca = modules.fs.readFileSync(this.ssl_ca_pathfile);
ฉันพบว่านี่เป็นเรื่องยากและเอกสารไม่ดี ฉันไม่ใช่ผู้เชี่ยวชาญเกี่ยวกับ SSL / TSL แต่การค้นหาอย่างรวดเร็วเกี่ยวกับใบรับรองระดับกลางปรากฏขึ้น:
ใบรับรองระดับกลางคือใบรับรองรองที่ออกโดยรูทที่เชื่อถือได้โดยเฉพาะเพื่อออกใบรับรองเซิร์ฟเวอร์เอนทิตีปลายทาง ผลลัพธ์คือห่วงโซ่ใบรับรองที่เริ่มต้นที่ CA รูทที่เชื่อถือได้ผ่านตัวกลางและลงท้ายด้วยใบรับรอง SSL ที่ออกให้คุณ ใบรับรองดังกล่าวเรียกว่าใบรับรองหลักที่ถูกล่ามโซ่ ที่มา
intermediate.crt จะมีโครงสร้างดังนี้
-----BEGIN CERTIFICATE-----
****
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
****
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
****
-----END CERTIFICATE-----
นี่คือการตอบสนองในเบราว์เซอร์