l passport
1.0.0
整合微信(wechat)、QQ(qq)、百度(baidu)和微博(weibo)於一體的koa中介軟體與API SDK
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 ;
} ) ;
如果需要配置多個平台(如web、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
: - 應用目前狀態,可以指定任意值,服務提供者會原封不動地回傳這個值(選填)注意:不同的服務提供者之間,在認證時對回呼地址的處理方式各不相同,如微信不會檢查回調函數,微博和QQ只需核查回調函數的域名,而百度則需要核查包括Query參數在內的整個回調位址
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.動態設定
將redirect、state、scope放在路由的Query參數中,例如/login/baidu?redirect=your_redirect&state=your_state&scope=your_scope
l-passport已經整合如下:
- 1.qq:QQ登錄
- 2.baidu:百度登入
- 3.weibo:微博登錄
- 4.wechat:微信登入
如果開發者覺得目前整合的登入策略無法滿足需求時,可以自行拓展,其基本形式如下:
class YourStragety {
// 服务提供商提供的授权地址
getAuthorizeUrl ( redirect , state , scope ) { }
// 用户通过授权后的认证过程
authorize ( code ) { }
}
passport . use ( 'your_stagety_name' , YourStragety ) ;
認證完成後使用者資訊將掛載ctx.state.passport中,其基本格式如下:
{
"provider" : "服务提供商" ,
"uid" : "用户编号" ,
"nickname" : "用户昵称" ,
"avatar" : "用户头像" ,
"body" : {}
}