Middleware Koa e API SDK integrando Wechat, QQ, Baidu e Weibo
middleware koa2, os desenvolvedores podem obter informações básicas dos usuários (incluindo número de usuário, apelido, avatar) por meio deste middleware
npm install l-passport -S
Apresente o l-passport e configure-o
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 ;
} ) ;
Se você precisar configurar múltiplas plataformas (como web, ios, android), é recomendado consultar o seguinte código
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 ;
} ) ;
Se você precisar configurar vários provedores de serviços e plataformas, é recomendável consultar o código a seguir
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
: - provedor de serviços (obrigatório)appId
: - ID do aplicativo (obrigatório)appSecret
: - Segredo do aplicativo (obrigatório)platform
: - plataforma de serviço (opcional)redirect
: - endereço de retorno de chamada do aplicativo (opcional)scope
: - o escopo da permissão solicitada (opcional)state
: - O estado atual do aplicativo, você pode especificar qualquer valor, o provedor de serviços retornará este valor inalterado (opcional)Nota: Diferentes provedores de serviços lidam com endereços de retorno de chamada de maneira diferente durante a autenticação. Por exemplo, o WeChat não verifica a função de retorno de chamada, o Weibo e o QQ só precisam verificar o nome de domínio da função de retorno de chamada e o Baidu precisa verificar, incluindo Consulta O endereço de retorno de chamada inteiro, incluindo. parâmetros
l-passport suporta duas maneiras de definir a função de retorno de chamada
1.Definições de configuração
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. Configurações dinâmicas
Coloque redirecionamento, estado e escopo nos parâmetros de consulta da rota, como /login/baidu?redirect=your_redirect&state=your_state&scope=your_scope
l-passport foi integrado da seguinte forma:
- 1.qq: Login QQ
- 2.baidu: login do Baidu
- 3.weibo: login do Weibo
- 4.wechat: login do WeChat
Se os desenvolvedores acharem que a estratégia de login atualmente integrada não pode atender às suas necessidades, eles próprios poderão expandi-la. Sua forma básica é a seguinte:
class YourStragety {
// 服务提供商提供的授权地址
getAuthorizeUrl ( redirect , state , scope ) { }
// 用户通过授权后的认证过程
authorize ( code ) { }
}
passport . use ( 'your_stagety_name' , YourStragety ) ;
Após a conclusão da autenticação, as informações do usuário serão montadas em ctx.state.passport. Seu formato básico é o seguinte:
{
"provider" : "服务提供商" ,
"uid" : "用户编号" ,
"nickname" : "用户昵称" ,
"avatar" : "用户头像" ,
"body" : {}
}