ที่เก็บนี้มีเซิร์ฟเวอร์เข้าสู่ระบบที่จะใช้กับเครื่องมือการแมป Cocoda ช่วยให้ผู้ใช้สามารถรับรองความถูกต้องโดยใช้ผู้ให้บริการที่แตกต่างกัน (เช่น GitHub, ORCID) ดู https://coli-conc.gbv.de/login/api สำหรับตัวอย่างเกี่ยวกับวิธีการใช้สิ่งนี้
.envproviders.jsonapplications.jsonLogin-Server ต้องการ node.js (> = V18, V20 แนะนำ) และเข้าถึงฐานข้อมูล MongoDB (> = V5, V7 แนะนำ)
git clone https://github.com/gbv/login-server.git
cd login-server
npm install
# after setting up or changing providers, create indexes
npm run indexesเข้าสู่ระบบเซิร์ฟเวอร์ยังมีให้ผ่านทาง Docker โปรดดูเอกสารที่ https://github.com/gbv/login-server/blob/master/docker/readme.md สำหรับรายละเอียดเพิ่มเติม
หากเรียกใช้เซิร์ฟเวอร์ที่อยู่ด้านหลังพร็อกซีย้อนกลับตรวจสอบให้แน่ใจว่าได้รวมส่วนหัว X-Forwarded-Proto ให้อนุญาตวิธี HTTP ทั้งหมดและเปิดใช้งาน WebSocket Proxying
คุณต้องจัดเตรียมไฟล์การกำหนดค่าสองไฟล์:
.envเพื่อกำหนดค่าแอปพลิเคชัน:
# recommended, port for express, default: 3004
PORT=
# recommended, full base URL, default: http://localhost[:PORT]/
# (required when used in production or behind a reverse proxy)
BASE_URL=
# title of application (will be shown in header)
TITLE=My Login Server
# list of allowed origins separated by comma, includes the hostname of BASE_URL by default
ALLOWED_ORIGINS=
# required for some strategies to enable production mode, default: development
NODE_ENV=production
# strongly recommended, imprint and privacy URLs for footer and clients
IMPRINT_URL=
PRIVACY_URL=
# recommended, secret used by the session
SESSION_SECRET=
# optional, maximum number of days a session is valid (rolling), default: 30
COOKIE_MAX_DAYS=
# threshold in minutes when to send "sessionAboutToExpire" events, default: 60
SESSION_EXPIRATION_MESSAGE_THRESHOLD=
# interval in minutes in which to check for expiring sessions, default: 5
SESSION_EXPIRATION_MESSAGE_INTERVAL=
# username used for MongoDB, default: <empty>
MONGO_USER=
# password used for MongoDB, default: <empty>
MONGO_PASS=
# host used for MongoDB, default: 127.0.0.1
MONGO_HOST=
# port used for MongoDB, default: 27017
MONGO_PORT=
# database used for MongoDB, default: login-server
MONGO_DB=
# the rate limit window in ms, default: 60 * 1000
RATE_LIMIT_WINDOW=
# the rate limit tries, default: 10
RATE_LIMIT_MAX=
# a jsonwebtoken compatible keypair
JWT_PRIVATE_KEY_PATH=
JWT_PUBLIC_KEY_PATH=
# the jsonwebtoken algorithm used
JWT_ALGORITHM=
# expiration time of JWTs in seconds, default: 120, min: 10
JWT_EXPIRES_IN=
# URL for Sources, default: https://github.com/gbv/login-server
SOURCES_URL=
# the path to the providers.json file, default: ./providers.json
PROVIDERS_PATH=
# log = log all messages, warn = only log warnings and errors, error = only log errorsl default: log
VERBOSITY=providers.jsonเพื่อกำหนดค่าผู้ให้บริการ ดูผู้ให้บริการ
applications.json เพื่อให้ข้อมูลแก่ผู้ใช้เกี่ยวกับแอปพลิเคชันที่กำลังเข้าถึงข้อมูลของพวกเขาและแอปพลิเคชันใดที่เริ่มต้นการเข้าสู่ระบบของเซสชันคุณสามารถจัดเตรียมรายการแอปพลิเคชันใน applications.json json รายการจะต้องเป็นอาร์เรย์ของวัตถุและแต่ละวัตถุต้องมี url และ name ตัวอย่าง:
[
{
"url" : " https://bartoc.org " ,
"name" : " BARTOC "
},
{
"url" : " https://coli-conc.gbv.de/coli-rich/ " ,
"name" : " coli-rich "
},
{
"url" : " https://coli-conc.gbv.de/cocoda/app/ " ,
"name" : " Cocoda "
},
{
"url" : " https://coli-conc.gbv.de/cocoda/dev/ " ,
"name" : " Cocoda (dev) "
},
{
"url" : " https://coli-conc.gbv.de/cocoda/rvk/ " ,
"name" : " Cocoda (RVK) "
},
{
"url" : " https://coli-conc.gbv.de/cocoda/wikidata/ " ,
"name" : " Cocoda (Wikidata) "
},
{
"url" : " https://coli-conc.gbv.de/cocoda/ " ,
"name" : " Cocoda (other) "
},
{
"url" : " https://coli-conc.gbv.de " ,
"name" : " Other coli-conc application "
}
] URL ควรเข้าถึงได้เนื่องจากอินเทอร์เฟซจะเชื่อมโยงกับมัน เซสชันเกี่ยวข้องกับแอปพลิเคชันหาก URL ผู้อ้างอิงมี url ของแอปพลิเคชัน แอปพลิเคชันจะถูกตรวจสอบจากบนลงล่างดังนั้นคุณควรสั่งซื้อจาก URL ที่เฉพาะเจาะจงที่สุดไปยัง URL ที่เฉพาะเจาะจงน้อยที่สุด (ดูตัวอย่างด้านบน)
npm run startเซิร์ฟเวอร์จัดเตรียมเว็บอินเตอร์เฟส HTTP API และ WebSocket
เว็บอินเตอร์เฟสช่วยให้ผู้ใช้สามารถสร้างและจัดการบัญชีที่มีการเชื่อมต่อกับตัวตนหลายตัวที่ผู้ให้บริการข้อมูลประจำตัว (ดูผู้ให้บริการ) ผู้ให้บริการใช้เพื่อตรวจสอบสิทธิ์ผู้ใช้เนื่องจากเซิร์ฟเวอร์เข้าสู่ระบบไม่ได้จัดเก็บรหัสผ่านใด ๆ (ลงชื่อเข้าใช้ครั้งเดียว)
HTTP API และ WebSocket อนุญาตให้แอปพลิเคชันไคลเอนต์โต้ตอบกับเซิร์ฟเวอร์เข้าสู่ระบบเช่นเพื่อตรวจสอบว่าผู้ใช้ได้รับการลงชื่อเข้าใช้และเพื่อค้นหาว่าตัวตนใดเป็นของผู้ใช้หรือไม่
เซิร์ฟเวอร์เข้าสู่ระบบสามารถใช้เพิ่มเติมเพื่อตรวจสอบสิทธิ์ผู้ใช้กับบริการอื่น ๆ เพื่อให้ผู้ใช้สามารถพิสูจน์ตัวตนของพวกเขาได้
Directory bin มีสคริปต์ตัวช่วยสำหรับการจัดการอินสแตนซ์เซิร์ฟเวอร์เช่นรายการบัญชีผู้ใช้และการจัดการผู้ให้บริการท้องถิ่น
การทดสอบใช้ mongoDB เดียวกับที่กำหนดค่าใน .env เพียงแค่ postfix -test หลังจากชื่อฐานข้อมูล
npm test เข้าสู่ระบบ-เซิร์ฟเวอร์ใช้หนังสือเดินทาง (GitHub) เป็นมิดเดิลแวร์การตรวจสอบความถูกต้อง หนังสือเดินทางใช้สิ่งที่เรียกว่า "กลยุทธ์" เพื่อสนับสนุนการตรวจสอบความถูกต้องกับผู้ให้บริการที่แตกต่างกัน รายการกลยุทธ์ที่มีอยู่สามารถดูได้ที่นี่ กลยุทธ์ที่ได้รับการสนับสนุนในปัจจุบันในเซิร์ฟเวอร์เข้าสู่ระบบคือ:
เนื่องจากกลยุทธ์ใช้พารามิเตอร์ที่แตกต่างกันในการตรวจสอบการโทรกลับแต่ละกลยุทธ์จึงมีไฟล์ wrapper ของตัวเองใน strategies/ ในการเพิ่มกลยุทธ์อื่นในการเข้าสู่ระบบเซิร์ฟเวอร์ให้เพิ่มไฟล์ที่เรียกว่า {name}.js (โดยที่ {name} เป็นชื่อของกลยุทธ์ที่ใช้กับ passport.authenticate ) พร้อมโครงสร้างต่อไปนี้ (GitHub เป็นตัวอย่าง):
/**
* OAuth Stategy for GitHub.
*/
// Import strategy here
import { Strategy } from "passport-github"
// Don't change this part!
export default ( options , provider , callback ) => new Strategy ( options ,
// Strategies have different callback parameters.
// `req` is always the first and the `done` callback is always last.
( req , token , tokenSecret , profile , done ) => {
// Prepare a standardized object for the user profile,
// usually using information from the `profile` parameter
let providerProfile = {
// Required, don't change this!
provider : provider . id ,
// Required: Choose a field that represents a unique user ID for this user
id : profile . id ,
// Optional: Provides a display name (e.g. full name)
name : profile . displayName ,
// Optional: Provides a username
username : profile . username
}
// Call a custom callback. `req`, `providerProfile`, and `done` are required,
// `token` and `tokenSecret` can be null.
callback ( req , token , tokenSecret , providerProfile , done )
} )คุณสามารถดูกลยุทธ์ที่มีอยู่เป็นตัวอย่างและเพิ่มของคุณเองผ่านคำขอดึง
หลังจากคุณเพิ่มกลยุทธ์แล้วคุณสามารถใช้งานได้โดยการเพิ่มผู้ให้บริการให้กับ providers.json :
[
{
"id" : " github " ,
"strategy" : " github " ,
"name" : " GitHub " ,
"template" : " https://github.com/{username} " ,
"options" : {
"clientID" : " abcdef1234567890 " ,
"clientSecret" : " abcdef1234567890abcdef1234567890 "
},
"image" : " https://upload.wikimedia.org/wikipedia/commons/9/91/Octicons-mark-github.svg " ,
"url" : " https://github.com "
}
]แต่ละวัตถุในรายการของผู้ให้บริการสามารถมีคุณสมบัติดังต่อไปนี้:
id (จำเป็น) - ID ที่ไม่ซ้ำกันสำหรับผู้ให้บริการstrategy (จำเป็น) - ชื่อของกลยุทธ์หนังสือเดินทางที่ผู้ให้บริการใช้name (จำเป็น) - แสดงชื่อของผู้ให้บริการtemplate (ตัวเลือก) - สตริงเทมเพลตเพื่อสร้าง URI (ตัวยึด {field} สามารถเป็นฟิลด์ใด ๆ ที่มีให้ในวัตถุ providerProfile โดยปกติ {id} หรือ {username} )credentialsNecessary (ไม่บังคับ) - ตั้งค่าเป็น true หากชื่อผู้ใช้และรหัสผ่านมีความจำเป็นสำหรับผู้ให้บริการรายนี้ แทนที่จะเปลี่ยนเส้นทาง (สำหรับ OAuth) การเข้าสู่ระบบเซิร์ฟเวอร์จะแสดงแบบฟอร์มการเข้าสู่ระบบที่จะส่งข้อมูลรับรองไปยังจุดสิ้นสุดของโพสต์options (ส่วนใหญ่จำเป็น) - วัตถุตัวเลือกสำหรับกลยุทธ์ซึ่งมักจะมีข้อมูลรับรองไคลเอนต์สำหรับจุดสิ้นสุดการตรวจสอบความถูกต้องimage (ไม่บังคับ) - รูปภาพที่เกี่ยวข้องกับผู้ให้บริการ จะแสดงในหน้าเข้าสู่ระบบและในรายการตัวตนที่เชื่อมต่อ คุณสามารถให้ภาพคงที่ในโฟลเดอร์ static/ ค่าสำหรับคุณสมบัติจะเป็น static/myimage.svg หากชื่อไฟล์ตรงกับ id ของผู้ให้บริการภาพจะเชื่อมโยงโดยอัตโนมัติurl (ไม่บังคับ) - URL สำหรับผู้ให้บริการ จะเชื่อมโยงกับรูปภาพ /ไอคอนภายใต้ /account มี URL เริ่มต้นสำหรับกลยุทธ์ github , orcid , mediawiki และ stackexchange ต่อไปนี้เป็นตัวอย่าง providers.json ที่แสดงวิธีกำหนดค่าผู้ให้บริการที่มีอยู่แต่ละราย:
[
{
"id" : " github " ,
"strategy" : " github " ,
"name" : " GitHub " ,
"template" : " https://github.com/{username} " ,
"options" : {
"clientID" : " abcdef1234567890 " ,
"clientSecret" : " abcdef1234567890abcdef1234567890 "
}
},
{
"id" : " orcid " ,
"strategy" : " orcid " ,
"name" : " ORCID " ,
"template" : " https://orcid.org/{id} " ,
"options" : {
"clientID" : " APP-abcdef1234567890 " ,
"clientSecret" : " abcdef1-23456-7890ab-cdef12-34567890 "
}
},
{
"id" : " mediawiki " ,
"strategy" : " mediawiki " ,
"name" : " Mediawiki " ,
"template" : " https://www.mediawiki.org/wiki/User:{username} " ,
"options" : {
"consumerKey" : " abcdef1234567890 " ,
"consumerSecret" : " abcdef1234567890abcdef1234567890 "
}
},
{
"id" : " stackexchange " ,
"strategy" : " stackexchange " ,
"name" : " Stack Exchange " ,
"template" : " https://stackexchange.com/users/{id} " ,
"options" : {
"clientID" : " 12345 " ,
"clientSecret" : " abcdef1234567890(( " ,
"stackAppsKey" : " 1234567890abcdefg(( "
}
},
{
"id" : " my-ldap " ,
"strategy" : " ldapauth " ,
"name" : " My LDAP " ,
"credentialsNecessary" : true ,
"options" : {
"server" : {
"url" : " ldap://ldap.example.com " ,
"bindDN" : " uid=admin,dc=example,dc=com " ,
"bindCredentials" : " abcdef1234567890 " ,
"searchBase" : " dc=example,dc=com " ,
"searchFilter" : " (uid={{username}}) "
}
}
},
{
"id" : " easydb " ,
"name" : " easydb test provider " ,
"strategy" : " easydb " ,
"credentialsNecessary" : true ,
"options" : {
"url" : " https://easydb5-test.example.com/api/v1/ "
}
},
{
"id" : " some-script " ,
"strategy" : " script " ,
"name" : " Some Script " ,
"credentialsNecessary" : true ,
"template" : " https://example.org/some-script/{id} " ,
"options" : {
"script" : " ./bin/example-script "
}
},
{
"id" : " cbs " ,
"strategy" : " cbs " ,
"name" : " CBS " ,
"credentialsNecessary" : true ,
"template" : " cbs:{id} " ,
"options" : {
"url" : " https://example.com/ext/api/colirich/users/info " ,
"apiKey" : " abcdef1234567890 "
}
}
] ในการกำหนดค่าผู้ให้บริการในพื้นที่โปรดใช้สคริปต์ที่ให้ไว้ภายใต้ bin/manage-local.js มันจะช่วยให้คุณสร้าง/ลบผู้ให้บริการในพื้นที่และสร้าง/ลบผู้ใช้สำหรับผู้ให้บริการในพื้นที่
คุณสามารถปรับเส้นทางไปยังไฟล์ providers.json ด้วย PROVIDERS_PATH ใน .env
หมายเหตุเกี่ยวกับการใช้ผู้ให้บริการ Mediawiki:
"baseURL": "https://www.wikidata.org/"https://coli-conc.gbv.de/login/login/wikidata/return สำหรับอินสแตนซ์เข้าสู่ระบบของเรา)หมายเหตุเกี่ยวกับการใช้ผู้ให้บริการสคริปต์:
lib/script-strategy.js )options.script ) อาจสัมพันธ์กับโฟลเดอร์รูทของเซิร์ฟเวอร์เข้าสู่ระบบหรือเส้นทางสัมบูรณ์ (แนะนำสำหรับนักเทียบท่า)bin/example-scriptchmod +x )id ที่ถูกตั้งค่าเมื่อการรับรองความถูกต้องสำเร็จ เป็นทางเลือก name สามารถให้ชื่อและจะใช้เป็นชื่อที่แสดงเข้าสู่ระบบ-เซิร์ฟเวอร์เสนอโทเค็นเว็บ JSON ที่สามารถใช้ในการตรวจสอบความถูกต้องกับบริการอื่น ๆ (เช่น JSKOS-Server) JsonWebToken ใช้สำหรับการเซ็นชื่อโทเค็น
โดยค่าเริ่มต้นแป้นพิมพ์ RSA ใหม่จะถูกสร้างขึ้นเมื่อแอปพลิเคชันเริ่มต้นครั้งแรก (2048 บิตโดยใช้ Node-RSA) แป้นพิมพ์ที่สร้างขึ้นนี้จะมีอยู่ใน ./private.key และ ./public.key คุณสามารถให้ไฟล์ ./public.key กับบริการอื่น ๆ ที่ต้องการตรวจสอบโทเค็น อีกวิธีหนึ่งคือคีย์สาธารณะที่ใช้ในปัจจุบันมีให้ที่ /เกี่ยวกับจุดสิ้นสุด
นอกจากนี้คุณยังสามารถให้เส้นทางที่กำหนดเองสำหรับไฟล์คีย์โดยการตั้งค่า JWT_PRIVATE_KEY_PATH และ JWT_PUBLIC_KEY_PATH ใน. .env หากไม่พบปุ่มหนึ่งหรือทั้งสองปุ่มคีย์จะถูกสร้างขึ้น โดยค่าเริ่มต้นอัลกอริทึม RS256 จะถูกใช้ แต่อัลกอริทึมคีย์สาธารณะอื่น ๆ สามารถใช้ได้โดยการตั้งค่า JWT_ALGORITHM
โดยค่าเริ่มต้นโทเค็นแต่ละตัวจะใช้ได้เป็นเวลา 120 วินาที คุณสามารถปรับได้โดยการตั้ง JWT_EXPIRES_IN ใน .env
โทเค็นจะได้รับผ่านจุดสิ้นสุด /โทเค็นหรือโดยใช้คำขอ WebSocket ประเภท token นอกจากนี้โทเค็นจะถูกส่งผ่าน WebSocket หลังจากผู้ใช้เข้าสู่ระบบและจากนั้นเป็นประจำก่อนที่โทเค็นสุดท้ายจะหมดอายุ
ตัวอย่างวิธีการตรวจสอบโทเค็น:
import jwt from "jsonwebtoken"
// token, e.g. from user request
let token = "..."
// get public key from file or endpoint
let publicKey = "..."
jwt . verify ( token , publicKey , ( error , decoded ) => {
if ( error ) {
// handle error
// ...
} else {
let { user , iat , exp } = decoded
// user is the user object
// iat is the issued timestamp
// exp is the expiration timestamp
// ...
}
} )หรือคุณสามารถใช้ Passport-JWT (ตัวอย่างจะตามมา)
แสดงหน้า Landing Page พร้อมข้อมูลทั่วไปเกี่ยวกับเซิร์ฟเวอร์เข้าสู่ระบบ
แสดงไซต์เพื่อจัดการบัญชีผู้ใช้ของคน ๆ หนึ่ง (หากได้รับการรับรองความถูกต้องแล้ว) หรือเปลี่ยนเส้นทางไปยัง /login (หากไม่ได้รับการรับรองความถูกต้อง)
แสดงไซต์เพื่อจัดการเซสชันของผู้ใช้ (ถ้าได้รับการรับรองความถูกต้อง) หรือเปลี่ยนเส้นทางไปยัง /login (หากไม่ได้รับการรับรองความถูกต้อง)
แสดงไซต์เพื่อเข้าสู่ระบบ (หากไม่ได้รับการรับรองความถูกต้อง) หรือนำไปยัง /account (ถ้าได้รับการรับรองความถูกต้อง)
หากได้รับพารามิเตอร์แบบสอบถาม redirect_uri ไซต์จะเปลี่ยนเส้นทางไปยัง URI ที่ระบุหลังจากการเข้าสู่ระบบที่ประสบความสำเร็จ (หากได้รับพารามิเตอร์ แต่ว่างเปล่ามันจะใช้ผู้อ้างอิงเป็น URI)
แสดงหน้าเข้าสู่ระบบสำหรับผู้ให้บริการ สำหรับผู้ให้บริการ OAuth หน้านี้จะเปลี่ยนเส้นทางไปยังหน้าของผู้ให้บริการเพื่อเชื่อมต่อตัวตนของคุณซึ่งจะเปลี่ยนเส้นทางไปที่ /login/:provider/return สำหรับผู้ให้บริการที่ใช้ข้อมูลรับรองจะแสดงแบบฟอร์มการเข้าสู่ระบบ
หน้านี้ยังจัดการ redirect_uri (ดู /login ด้านบน)
โพสต์ปลายทางสำหรับผู้ให้บริการที่ใช้ข้อมูลรับรอง หากประสบความสำเร็จมันจะเปลี่ยนเส้นทางไปยัง /account มิฉะนั้นจะเปลี่ยนเส้นทางกลับไปที่ /login/:provider
ตัดการเชื่อมต่อผู้ให้บริการจากผู้ใช้และเปลี่ยนเส้นทางไปยัง /account
บันทึกผู้ใช้ออกจากบัญชีของพวกเขา โปรดทราบว่าเซสชันจะยังคงอยู่เพราะใช้สำหรับ WebSockets สิ่งนี้ช่วยให้แอปพลิเคชันส่งเหตุการณ์ไปยัง WebSockets ที่ใช้งานได้สำหรับเซสชันปัจจุบันแม้ว่าผู้ใช้จะออกจากระบบ
แสดงเว็บไซต์เพื่อลบบัญชีผู้ใช้ของหนึ่ง
ดำเนินการลบบัญชีผู้ใช้และเปลี่ยนเส้นทางไป /login
เซิร์ฟเวอร์ให้จุดสิ้นสุดการเปลี่ยนเส้นทาง OAuth (การเปลี่ยนเส้นทาง URI) สำหรับผู้ให้บริการ OAuth แต่ละราย
จุดสิ้นสุดการโทรกลับสำหรับคำขอ OAUTH จะบันทึกตัวตนที่เชื่อมต่อไปยังผู้ใช้ (หรือสร้างผู้ใช้ใหม่หากจำเป็น) และเปลี่ยนเส้นทางไปยัง /account
ก่อนที่จะเขียนโปรแกรมโดยตรงกับ HTTP API และ WebSocket API ให้ดูที่ไลบรารีเบราว์เซอร์ JavaScript ของลูกค้าเข้าสู่ระบบ มันสามารถเห็นได้ในการดำเนินการที่นี่ (แหล่งที่มาสำหรับเว็บไซต์นั้น)
ส่งคืนวัตถุที่มี title คีย์ (ชื่อของอินสแตนซ์เข้าสู่ระบบ-เซิร์ฟเวอร์), env (สภาพแวดล้อมเช่น development หรือ production ), publicKey (โดยปกติจะเป็นคีย์สาธารณะ RSA) และ algorithm (อัลกอริทึม JsonwebToken ที่ใช้) คีย์ส่วนตัวที่เกี่ยวข้องกับคีย์สาธารณะที่กำหนดจะถูกใช้เมื่อลงนาม JWTS
ส่งคืนรายชื่อผู้ให้บริการที่มีอยู่ (ถอดข้อมูลที่ละเอียดอ่อน)
ส่งคืนผู้ใช้ที่เข้าสู่ระบบในปัจจุบัน ส่งคืนข้อผิดพลาด 404 เมื่อไม่มีผู้ใช้เข้าสู่ระบบ
ส่งคืนผู้ใช้เฉพาะ ปัจจุบัน จำกัด รหัสผู้ใช้ของตัวเอง
ปรับผู้ใช้เฉพาะ สามารถใช้งานได้เฉพาะในขณะที่ผู้ใช้รายเดียวกันเข้าสู่ระบบคุณสมบัติที่อนุญาตในการเปลี่ยนแปลง: name (ทุกอย่างอื่นจะถูกละเว้น)
ลบเซสชันทั้งหมดสำหรับผู้ใช้ปัจจุบันยกเว้นเซสชันปัจจุบัน
ลบเซสชันด้วย SessionID :id (ต้องเป็นเซสชันสำหรับผู้ใช้ปัจจุบัน)
ส่งคืนโทเค็นเว็บ JSON ในรูปแบบ:
{
"token" : " <JWT> " ,
"expiresIn" : 120
}ดูเพิ่มเติมที่: JWTS
โทเค็นเองจะมีคุณสมบัติ user (ซึ่งมีข้อมูลเกี่ยวกับผู้ใช้ที่เข้าสู่ระบบในปัจจุบันหรือเป็นโมฆะหากผู้ใช้ไม่ได้ลงชื่อเข้าใช้) และคุณสมบัติ sessionID ซึ่งจำเป็นต้องตรวจสอบสิทธิ์ภายในการเชื่อมต่อ WebSocket
WebSocket API ที่ URL ฐาน / ส่งเหตุการณ์เกี่ยวกับผู้ใช้หรือเซสชันปัจจุบัน เหตุการณ์จะถูกส่งเป็นสตริงที่เข้ารหัส JSON ที่มีลักษณะเช่นนี้:
{
"type" : " event name (see below) " ,
"date" : " date (as ISOString) " ,
"data" : {
"user" : {
"uri" : " URI of user " ,
"name" : " name of user " ,
"identities" : {
"xzy" : {
"id" : " ID of user for provider xzy " ,
"uri" : " URI or profile URL of user for provider xzy " ,
"name" : " display name of user for provider xzy (if available) " ,
"username" : " username of user for provider xzy (if available) "
}
}
}
}
}open - ส่งหลังจากสร้างการเชื่อมต่อ WebSocket ใช้สิ่งนี้แทน ws.onopen !loggedIn - ส่งเมื่อผู้ใช้เข้าสู่ระบบ (จะถูกส่งทันทีหลังจากสร้าง WebSocket หากผู้ใช้เข้าสู่ระบบแล้ว)loggedOut - ส่งเมื่อผู้ใช้ออกจากระบบ (จะถูกส่งทันทีหลังจากสร้าง WebSocket หากผู้ใช้ไม่ได้ลงชื่อเข้าใช้)updated - ส่งเมื่อผู้ใช้ได้รับการอัปเดต (เช่นเพิ่มตัวตนใหม่ ฯลฯ )providers - ส่งหลังจากการเชื่อมต่อ WebSocket ได้รับการจัดตั้งขึ้น (ประกอบด้วย data.providers คุณสมบัติผู้จัดทำรายชื่อผู้ให้บริการที่มีอยู่)about - ส่งหลังจากสร้างการเชื่อมต่อ WebSocket ( data คุณสมบัติจะมีรูปแบบเดียวกับใน Get /About)token - ส่งเมื่อผู้ใช้เข้าสู่ระบบและเป็นระยะก่อนที่โทเค็นก่อนหน้าจะหมดอายุ ( data คุณสมบัติจะมีรูปแบบเช่นเดียวกับใน Get /Token)authenticated - ส่งเป็นการตอบกลับที่ประสบความสำเร็จเมื่อขอการตรวจสอบสิทธิ์ (ดูด้านล่าง)pong - ส่งเป็นคำตอบสำหรับการร้องขอประเภท ping (สามารถใช้เพื่อตรวจสอบว่า WebSocket กลายเป็นเก่า)sessionAboutToExpire - ส่งเมื่อเซสชันที่เกี่ยวข้องในปัจจุบันกำลังจะหมดอายุerror - ส่งเป็นคำตอบไปยังข้อความที่ไม่ถูกต้องผ่าน WebSocket (ประกอบด้วย data.message คุณสมบัติการส่งข้อความพร้อมข้อความแสดงข้อผิดพลาด)คุณยังสามารถส่งคำขอไปยัง WebSocket สิ่งเหล่านี้จะต้องเป็นสตริงที่เข้ารหัส JSON ในรูปแบบต่อไปนี้:
{
"type" : " name of request "
} นี่เป็นคำขอพิเศษที่ใช้ JWT ที่ได้มาจาก Get /Token เพื่อเชื่อมโยง WebSocket ปัจจุบันกับเซสชันเฉพาะ (ส่งอ็อบเจ็กต์ที่ต้องการ token น
บางครั้งคำขอ authenticate มีความจำเป็นเมื่อใช้ WebSocket จากโดเมนที่แตกต่างจาก Login Server ในกรณีนั้นโทเค็นจะต้องได้รับการร้องขอผ่าน API (เช่นโดยใช้การดึงข้อมูลด้วย credentials: "include" หรือ Axios พร้อมตัวเลือก withCredentials: true ) และถูกส่งผ่าน WebSocket โทเค็นรวมถึง SessionID ที่เข้ารหัสซึ่งจะเชื่อมโยงกับการเชื่อมต่อ WebSocket นี่คือตัวอย่างว่าเวิร์กโฟลว์จากเว็บแอปพลิเคชันมีลักษณะอย่างไร: https://coli-conc.gbv.de/login/api
ต่อไปนี้เป็นตัวอย่างง่ายๆเกี่ยวกับวิธีการเชื่อมต่อกับ WebSocket
// Assumes server is run on localhost:3005
let socket = new WebSocket ( "ws://localhost:3005" )
socket . addEventListener ( "message" , ( message ) => {
try {
let event = JSON . parse ( message )
alert ( event . event , event . user && event . user . uri )
} catch ( error ) {
console . warn ( "Error parsing WebSocket message" , message )
}
} ) ยอมรับ PRS
dev เป็นพื้นฐาน การเปลี่ยนแปลงจาก dev จะถูกรวมเข้ากับ master เฉพาะสำหรับรุ่นใหม่สำหรับผู้ดูแลเท่านั้น
โปรดทำงานกับสาขา dev ในระหว่างการพัฒนา (หรือดีกว่าพัฒนาในสาขาฟีเจอร์และรวมเข้ากับ dev เมื่อพร้อม)
เมื่อรีลีสใหม่พร้อม (เช่นคุณสมบัติเสร็จสิ้นการรวมเข้ากับ dev และการทดสอบทั้งหมดประสบความสำเร็จ) ให้เรียกใช้สคริปต์รุ่นที่รวมอยู่ (แทนที่ "แพตช์" ด้วย "รอง" หรือ "สำคัญ" หากจำเป็น):
npm run release:patchสิ่งนี้จะ:
devdev เป็นข้อมูลล่าสุดnpm version patch (หรือ "เล็กน้อย"/"Major")devmasterdevmaster ด้วยแท็กdevหลังจากเรียกใช้สิ่งนี้การกระทำของ GitHub จะสร้างร่าง GitHub Release ใหม่โดยอัตโนมัติ โปรดแก้ไขและเผยแพร่การเปิดตัวด้วยตนเอง
MIT © 2019 Verbundzentrale des GBV (VZG)