【问题标题】:No refresh token with NestJS and PassportJSNestJS 和 PassportJS 没有刷新令牌
【发布时间】:2019-10-06 04:05:09
【问题描述】:

我采用两种不同的策略在我的 NestJS 应用中实现了 Google 和 Dropbox 身份验证。

问题是我从来没有得到一个 refresh_token 和 access_token。我已经尝试从我的 Google/Dropbox 帐户中已授予的应用程序中删除该应用程序,但没有成功。

import { Injectable } from '@nestjs/common';
import { PassportStrategy } from '@nestjs/passport';
import { Strategy } from 'passport-google-oauth2';
import { AuthService } from './auth.service';
import { OauthUser } from './oauth-user.entity';
import { UserService } from '../user/user.service';
import { ConfigService } from '../config/config.service';
import { CloudProvider } from '../shared/enums/cloud-service.enum';

@Injectable()
export class GoogleStrategy extends PassportStrategy(Strategy, 'google') {

  constructor(private readonly authService: AuthService,
              private readonly userService: UserService,
              private readonly configService: ConfigService) {
    super({
      clientID: configService.get('OAUTH_GOOGLE_ID'),
      clientSecret: configService.get('OAUTH_GOOGLE_SECRET'),
      callbackURL: configService.get('OAUTH_GOOGLE_CALLBACK'),
      passReqToCallback: true,
      scope: ['email', 'profile', 'https://www.googleapis.com/auth/drive.file'],
      accessType: 'offline',
      prompt: 'consent',
      session: false,
    });
  }

  async validate(request: any, accessToken: string, refreshToken: string, oauthUser: OauthUser) {
    console.log('accessToken', accessToken) // <- this one is good
    console.log('refreshtoken', refreshToken) // <- always undefined
    oauthUser.provider = CloudProvider.GOOGLE;
    return this.userService.getOrCreate(oauthUser, accessToken).then(() => {
      return this.authService.getJwtForUser(oauthUser).then(jwt => {
        return { jwt };
      });
    });
  }

}

【问题讨论】:

  • 我无法使用 Google API,但请注意 Dropbox API 目前不使用刷新令牌。

标签: oauth passport.js google-oauth dropbox-api nestjs


【解决方案1】:
import { Injectable } from '@nestjs/common';
import { PassportStrategy } from '@nestjs/passport';
import { Strategy, VerifyCallback } from 'passport-google-oauth20';

import { IUserProfile } from './interfaces/user.interface';

@Injectable()
export class GoogleStrategy extends PassportStrategy(Strategy) {
  constructor() {
    super({
      clientID: process.env.GOOGLE_CLIENT_ID,
      clientSecret: process.env.GOOGLE_CLIENT_SECRET,
      callbackURL: process.env.GOOGLE_CB_URL,
      scope: ['email', 'profile'],
    });
  }

  authorizationParams(): { [key: string]: string; } {
    return ({
      access_type: 'offline'
    });
  };

  async validate(
    accessToken: string,
    refreshToken: string,
    profile: IUserProfile,
    done: VerifyCallback,
  ): Promise<void> {
    const { emails } = profile;
    console.log(accessToken, refreshToken);
    done(null, {email: emails[0].value, accessToken});
  }
}

【讨论】:

  • krasava, sps)))
  • 这对我不起作用,但在我添加其他属性后它开始工作 - 提示:'consent' to authorizationParams 的返回对象。见github.com/jaredhanson/passport-google-oauth/issues/…
  • 最初我将配置选项放在构造函数中,然后才知道有authorizationParams() 方法。然后我在 node nest.js 代码中自动尝试了 { accessType: 'offline' },但它应该是像上面的答案 { access_type: 'offline' } 这样的蛇形案例。
猜你喜欢
  • 2019-09-19
  • 1970-01-01
  • 2013-11-05
  • 2019-04-17
  • 2017-09-05
  • 2022-07-15
  • 2013-10-27
  • 2013-08-30
  • 2019-03-29
相关资源
最近更新 更多