Nodejs Nestjs Twitter认证插件passport-twitter的使用

Nodejs Nestjs Twitter认证插件passport-twitter的使用
在NestJS中使用passport-twitter进行Twitter认证,你需要遵循几个步骤。首先,确保你已经安装了必要的依赖包。

  1. 安装必要的依赖:

    npm install [@nestjs](/user/nestjs)/passport passport passport-twitter [@nestjs](/user/nestjs)/jwt [@nestjs](/user/nestjs)/platform-express
    
  2. 配置Passport模块: 在你的应用程序中创建一个Passport模块,并配置TwitterStrategy

    // auth.module.ts
    import { Module } from '[@nestjs](/user/nestjs)/common';
    import { PassportModule } from '[@nestjs](/user/nestjs)/passport';
    import { TwitterStrategy } from './twitter.strategy';
    
    [@Module](/user/Module)({
      imports: [
        PassportModule.register({ defaultStrategy: 'twitter' }),
      ],
      providers: [TwitterStrategy],
    })
    export class AuthModule {}
    
  3. 创建Twitter策略: 创建一个策略文件来处理与Twitter API的交互。

    // twitter.strategy.ts
    import { Injectable, UnauthorizedException } from '[@nestjs](/user/nestjs)/common';
    import { PassportStrategy } from '[@nestjs](/user/nestjs)/passport';
    import { Strategy } from 'passport-twitter';
    import { AuthService } from './auth.service';
    
    [@Injectable](/user/Injectable)()
    export class TwitterStrategy extends PassportStrategy(Strategy) {
      constructor(private readonly authService: AuthService) {
        super({
          consumerKey: process.env.TWITTER_CONSUMER_KEY,
          consumerSecret: process.env.TWITTER_CONSUMER_SECRET,
          callbackURL: process.env.TWITTER_CALLBACK_URL,
        });
      }
    
      async validate(requestToken: string, requestSecret: string): Promise<any> {
        const user = await this.authService.validateTwitterUser(requestToken, requestSecret);
        if (!user) {
          throw new UnauthorizedException();
        }
        return user;
      }
    }
    
  4. 创建验证服务: 创建一个服务来处理从Twitter获取用户信息的逻辑。

    // auth.service.ts
    import { Injectable } from '[@nestjs](/user/nestjs)/common';
    import * as Twitter from 'twitter';
    
    [@Injectable](/user/Injectable)()
    export class AuthService {
      async validateTwitterUser(requestToken: string, requestSecret: string): Promise<any> {
        const twitter = new Twitter({
          consumer_key: process.env.TWITTER_CONSUMER_KEY,
          consumer_secret: process.env.TWITTER_CONSUMER_SECRET,
          access_token_key: requestToken,
          access_token_secret: requestSecret,
        });
    
        try {
          const response = await twitter.get('account/verify_credentials', { include_email: true }, (error, data) => {
            if (error) {
              console.error(error);
              return null;
            }
            return data;
          });
    
          return response;
        } catch (err) {
          console.error(err);
          return null;
        }
      }
    }
    
  5. 设置路由: 在你的控制器中设置路由以处理登录请求。

    // auth.controller.ts
    import { Controller, Get, Req, Res } from '[@nestjs](/user/nestjs)/common';
    import { Request, Response } from 'express';
    import { AuthService } from './auth.service';
    
    [@Controller](/user/Controller)('auth')
    export class AuthController {
      constructor(private readonly authService: AuthService) {}
    
      @Get('twitter')
      async twitterAuth(@Req() req: Request, @Res() res: Response) {
        res.redirect(this.authService.twitterAuthUrl());
      }
    
      @Get('twitter/callback')
      async twitterCallback(@Req() req: Request, @Res() res: Response) {
        const user = await this.authService.validateTwitterUser(req.query.oauth_token, req.query.oauth_verifier);
        if (!user) {
          res.status(401).send('Unauthorized');
        } else {
          res.send(user);
        }
      }
    }
    
  6. 配置环境变量: 在你的.env文件中添加Twitter的API密钥和回调URL。

    TWITTER_CONSUMER_KEY=your_consumer_key_here
    TWITTER_CONSUMER_SECRET=your_consumer_secret_here
    TWITTER_CALLBACK_URL=http://localhost:3000/auth/twitter/callback
    

以上步骤将帮助你在NestJS应用程序中集成Twitter认证。请根据你的具体需求调整这些示例代码。


3 回复

当然,使用NestJS和Passport来集成Twitter认证是个有趣的过程!首先,确保你安装了必要的库:

npm install @nestjs/passport passport passport-twitter @nestjs/jwt

然后,在你的模块中配置Passport和Twitter策略。这里有个小技巧,想象你是Twitter的CEO,正在给自己的应用添加登录功能,是不是很酷?

import { Module } from '@nestjs/common';
import { PassportModule } from '@nestjs/passport';
import { TwitterStrategy } from './twitter.strategy';

@Module({
  imports: [
    PassportModule.register({ defaultStrategy: 'twitter' }),
  ],
  providers: [TwitterStrategy],
})
export class AuthModule {}

接着,实现TwitterStrategy,就像你在Twitter总部的大厅里,用代码解锁进入的秘密通道一样:

import { Injectable, UnauthorizedException } from '@nestjs/common';
import { PassportStrategy } from '@nestjs/passport';
import { Strategy } from 'passport-twitter';

@Injectable()
export class TwitterStrategy extends PassportStrategy(Strategy) {
  constructor() {
    super({
      consumerKey: 'YOUR_TWITTER_CONSUMER_KEY',
      consumerSecret: 'YOUR_TWITTER_CONSUMER_SECRET',
      callbackURL: 'http://localhost:3000/auth/twitter/callback',
    });
  }

  async validate(request, accessToken, refreshToken, profile, done) {
    // 这里你可以从profile中获取用户信息,并存入数据库或验证用户
    const user = { id: profile.id, username: profile.username };
    done(null, user);
  }
}

最后,设置路由处理Twitter回调:

import { Controller, Get, Req, Res } from '@nestjs/common';
import { Request, Response } from 'express';
import { AuthService } from './auth.service';

@Controller('auth')
export class AuthController {
  constructor(private readonly authService: AuthService) {}

  @Get('twitter')
  twitterAuth(@Req() req: Request, @Res() res: Response) {
    this.authService.twitterAuth(req, res);
  }

  @Get('twitter/callback')
  twitterAuthCallback(@Req() req: Request, @Res() res: Response) {
    this.authService.twitterAuthCallback(req, res);
  }
}

现在,你可以启动应用,去Twitter开发者平台创建一个应用,获取API密钥,开始你的冒险吧!


使用passport-twitter插件进行Twitter认证是NestJS应用中常见的需求。以下是如何在NestJS项目中集成并使用passport-twitter的步骤。

步骤 1: 安装必要的包

首先,你需要安装passport, passport-twitter, 和 @nestjs/passport包。

npm install passport passport-twitter @nestjs/passport @nestjs/common @nestjs/core

步骤 2: 配置环境变量

在你的.env文件中添加Twitter API密钥和密钥(从Twitter开发者平台获取):

TWITTER_CONSUMER_KEY=your_consumer_key_here
TWITTER_CONSUMER_SECRET=your_consumer_secret_here

步骤 3: 创建Twitter策略

创建一个服务来处理Twitter登录逻辑:

// twitter.strategy.ts
import { Injectable } from '@nestjs/common';
import { PassportStrategy } from '@nestjs/passport';
import { Strategy } from 'passport-twitter';

@Injectable()
export class TwitterStrategy extends PassportStrategy(Strategy) {
  constructor() {
    super({
      consumerKey: process.env.TWITTER_CONSUMER_KEY,
      consumerSecret: process.env.TWITTER_CONSUMER_SECRET,
      callbackURL: "http://localhost:3000/auth/twitter/callback", // 根据你的应用配置
      includeEmail: true, // 如果需要邮箱信息
    });
  }

  async validate(token, tokenSecret, profile, done) {
    const user = {
      id: profile.id,
      name: profile.displayName,
      email: profile.emails ? profile.emails[0].value : null,
    };
    done(null, user);
  }
}

步骤 4: 注册策略

在你的AuthModule中注册这个策略:

// auth.module.ts
import { Module } from '@nestjs/common';
import { AuthService } from './auth.service';
import { LocalStrategy } from './local.strategy';
import { JwtModule } from '@nestjs/jwt';
import { PassportModule } from '@nestjs/passport';
import { TwitterStrategy } from './twitter.strategy';

@Module({
  imports: [
    PassportModule.register({ defaultStrategy: 'jwt' }),
    JwtModule.register({
      secret: 'secret', // 使用环境变量
      signOptions: { expiresIn: '60m' },
    }),
  ],
  providers: [AuthService, LocalStrategy, TwitterStrategy],
  exports: [PassportModule, JwtModule],
})
export class AuthModule {}

步骤 5: 创建控制器

最后,在你的控制器中设置路由来处理Twitter登录:

// auth.controller.ts
import { Controller, Get, Req, Res } from '@nestjs/common';
import { Request, Response } from 'express';
import { AuthService } from './auth.service';

@Controller('auth')
export class AuthController {
  constructor(private readonly authService: AuthService) {}

  @Get('twitter')
  async twitterLogin(@Req() req, @Res() res) {
    await this.authService.twitterLogin(req, res);
  }

  @Get('twitter/callback')
  async twitterCallback(@Req() req, @Res() res) {
    await this.authService.twitterCallback(req, res);
  }
}

步骤 6: 实现服务方法

在你的AuthService中实现这些方法:

// auth.service.ts
import { Injectable } from '@nestjs/common';
import { PassportStrategy } from '@nestjs/passport';
import { Strategy } from 'passport-twitter';

@Injectable()
export class AuthService {

  async twitterLogin(req: Request, res: Response) {
    if (!req.user) {
      return res.redirect('/auth/login');
    }
    res.send(req.user);
  }

  async twitterCallback(req: Request, res: Response) {
    res.redirect('/');
  }
}

这只是一个基本示例,实际应用中可能需要更复杂的错误处理、用户数据库交互等。

使用Passport.js的passport-twitter插件进行Twitter认证,首先需要安装相关依赖:

npm install @nestjs/passport passport passport-twitter

配置策略:

import { PassportStrategy } from '@nestjs/passport';
import { Strategy } from 'passport-twitter';

export class TwitterStrategy extends PassportStrategy(Strategy) {
  constructor() {
    super({
      consumerKey: 'YOUR_TWITTER_API_KEY',
      consumerSecret: 'YOUR_TWITTER_API_SECRET',
      // 其他配置项
    });
  }

  async validate(request, accessToken, refreshToken, profile, done) {
    const { id, name, email } = profile;
    const user = { id, fullName: name.display_name, email };
    done(null, user);
  }
}

然后在你的控制器或服务中使用它。记得在模块中导入PassportModule并注册策略。

回到顶部