มิดเดิลแวร์ Koa และ API SDK ที่ผสานรวม Wechat, QQ, Baidu และ Weibo
มิดเดิลแวร์ koa2 นักพัฒนาสามารถรับข้อมูลพื้นฐานของผู้ใช้ (รวมถึงหมายเลขผู้ใช้ ชื่อเล่น อวตาร) ผ่านมิดเดิลแวร์นี้
npm install l-passport -S
แนะนำ l-passport และกำหนดค่า
const passport = require ( 'l-passport' ) ;
// 微信登录:设置appId与app secret
passport . initialize ( {
provider : 'wechat'
appId : 'your_app_id' ,
appSecret : 'your_app_secret'
} ) ;
router . get ( '/login/wechat' , passport . authorization ( 'wechat' ) , async ( ctx ) => {
ctx . body = ctx . state . passport ;
} ) ;
หากคุณต้องการกำหนดค่าหลายแพลตฟอร์ม (เช่น เว็บ, iOS, Android) ขอแนะนำให้อ้างอิงโค้ดต่อไปนี้
const passport = require ( 'l-passport' ) ;
passport . initialize ( {
provider : 'wechat' ,
clients : [
{ platform : 'web' , appId : 'your_app_id' , appSecret : 'your_app_secret' } ,
{ platform : 'ios' , appId : 'your_app_id' , appSecret : 'your_app_secret' } ,
{ platform : 'android' , appId : 'your_app_id' , appSecret : 'your_app_secret' } ,
]
} ) ;
router . get ( '/login/wechat_web' , passport . authorization ( 'wechat' , { platform : 'web' } ) , async ( ctx ) => {
ctx . body = ctx . state . passport ;
} ) ;
router . get ( '/login/wechat_ios' , passport . authorization ( 'wechat' , { platform : 'ios' } ) , async ( ctx ) => {
ctx . body = ctx . state . passport ;
} ) ;
router . get ( '/login/wechat_android' , passport . authorization ( 'wechat' , { platform : 'android' } ) , async ( ctx ) => {
ctx . body = ctx . state . passport ;
} ) ;
หากคุณต้องการกำหนดค่าผู้ให้บริการหลายรายและหลายแพลตฟอร์ม ขอแนะนำให้อ้างอิงโค้ดต่อไปนี้
const passport = require ( 'l-passport' ) ;
passport . initialize ( [
{
provider : 'wechat' ,
clients : [
{ platform : 'web' , appId : 'your_app_id' , appSecret : 'your_app_secret' } ,
{ platform : 'ios' , appId : 'your_app_id' , appSecret : 'your_app_secret' } ,
{ platform : 'android' , appId : 'your_app_id' , appSecret : 'your_app_secret' } ,
]
} ,
{
provider : 'baidu' ,
clients : [
{ platform : 'web' , appId : 'your_app_id' , appSecret : 'your_app_secret' , redirect : 'your_baidu_redirect' } ,
{ platform : 'ios' , appId : 'your_app_id' , appSecret : 'your_app_secret' , redirect : 'your_baidu_redirect' } ,
{ platform : 'android' , appId : 'your_app_id' , appSecret : 'your_app_secret' , redirect : 'your_baidu_redirect' } ,
]
}
] ) ;
router . get ( '/login/wechat_web' , passport . authorization ( 'wechat' , { platform : 'web' } ) , async ( ctx ) => {
ctx . body = ctx . state . passport ;
} ) ;
router . get ( '/login/baidu_ios' , passport . authorization ( 'baidu' , { platform : 'ios' } ) , async ( ctx ) => {
ctx . body = ctx . state . passport ;
} ) ;
provider
: - ผู้ให้บริการ (จำเป็น)appId
: - รหัสแอปพลิเคชัน (จำเป็น)appSecret
: - ความลับของแอปพลิเคชัน (จำเป็น)platform
: - แพลตฟอร์มบริการ (ไม่จำเป็น)redirect
: - ที่อยู่ติดต่อกลับของแอปพลิเคชัน (ไม่บังคับ)scope
: - ขอบเขตการอนุญาตที่สมัคร (ไม่บังคับ)state
: - สถานะปัจจุบันของแอปพลิเคชัน คุณสามารถระบุค่าใดๆ ก็ได้ ผู้ให้บริการจะคืนค่านี้ให้ไม่เปลี่ยนแปลง (ไม่จำเป็น)หมายเหตุ: ผู้ให้บริการแต่ละรายจัดการที่อยู่โทรกลับแตกต่างกันระหว่างการตรวจสอบสิทธิ์ ตัวอย่างเช่น WeChat จะไม่ตรวจสอบฟังก์ชันการโทรกลับ Weibo และ QQ เพียงตรวจสอบชื่อโดเมนของฟังก์ชันการโทรกลับ และ Baidu จำเป็นต้องตรวจสอบรวมถึงการสืบค้นที่อยู่การโทรกลับทั้งหมดรวมถึง พารามิเตอร์
l-passport รองรับสองวิธีในการตั้งค่าฟังก์ชันโทรกลับ
1. การตั้งค่าคอนฟิกูเรชัน
const passport = require ( 'l-passport' ) ;
passport . initialize ( {
provider : 'baidu'
appId : 'your_app_id' ,
appSecret : 'your_app_secret' ,
redirect : 'your_app_redirect' ,
state : 'your_app_state' ,
scope : 'your_app_scope'
} ) ;
router . get ( '/login/baidu' , passport . authorization ( 'baidu' ) , async ( ctx ) => {
ctx . body = ctx . state . passport ;
} ) ;
2. การตั้งค่าแบบไดนามิก
ใส่การเปลี่ยนเส้นทาง สถานะ และขอบเขตในพารามิเตอร์การค้นหาของเส้นทาง เช่น /login/baidu?redirect=your_redirect&state=your_state&scope=your_scope
l-passport ได้รับการบูรณาการดังนี้:
- 1.qq: เข้าสู่ระบบ QQ
- 2.baidu: เข้าสู่ระบบ Baidu
- 3.weibo: เข้าสู่ระบบ Weibo
- 4.wechat: เข้าสู่ระบบ WeChat
หากนักพัฒนารู้สึกว่ากลยุทธ์การเข้าสู่ระบบแบบรวมในปัจจุบันไม่สามารถตอบสนองความต้องการของพวกเขาได้ พวกเขาสามารถขยายได้ด้วยตนเอง รูปแบบพื้นฐานมีดังนี้:
class YourStragety {
// 服务提供商提供的授权地址
getAuthorizeUrl ( redirect , state , scope ) { }
// 用户通过授权后的认证过程
authorize ( code ) { }
}
passport . use ( 'your_stagety_name' , YourStragety ) ;
หลังจากการตรวจสอบสิทธิ์เสร็จสิ้น ข้อมูลผู้ใช้จะถูกเมาท์ใน ctx.state.passport รูปแบบพื้นฐานจะเป็นดังนี้:
{
"provider" : "服务提供商" ,
"uid" : "用户编号" ,
"nickname" : "用户昵称" ,
"avatar" : "用户头像" ,
"body" : {}
}