因此,我正在开发一个简单的单页应用程序,我想使用Facebook提供程序来实现身份验证,我做到了没有大的问题,但是现在,此后,我已经从Facebook提取了用户个人资料并创建了一个帐户在我的数据库中,我能否仅返回由我的支持者生成的jwt令牌并将其用于下一个请求的身份验证,而不使用Facebook提供的访问令牌。
,如果jwt令牌到期,则用户可以从Facebook请求另一个令牌,并且当后端将收到请求时,该帐户将已经使用字段facebook_id
绑定到Facebook个人资料,然后后端将重新发送另一个jwt令牌。
PS:我仅需要Facebook和google才能简化身份验证和注册(自动在facebook的用户个人资料中填充某些字段)
保存用户
async createOrUpdateFromSociel(profile: Profile) {
let user = await this.findByEmail(profile.emails[0].value)
if (user) {
return user;
}
user = new User();
user.email = profile.emails[0].value;
user[profile.provider + 'id'] = profile.id;
user.username = profile.displayName;
return this.create(user);
}
护照策略
import { Injectable, Inject, HttpException, HttpStatus } from '@nestjs/common';
import { Model } from 'mongoose';
import { use } from 'passport';
import { PassportStrategy } from '@nestjs/passport';
import { Strategy } from 'passport-facebook';
import * as passport from 'passport'
import { User } from '../../../entities/user.entity';
import { UserService } from '../../user/user.service';
const env = require('../../../../environement');
export class FacebookStrategy extends PassportStrategy(Strategy) {
constructor(
@Inject('UserService')
private userService: UserService,
) {
super({
clientID: env.FACEBOOK_CID,
clientSecret: env.FACEBOOK_SECRET,
callbackURL: 'http://localhost:3000/auth/facebook-cb',
passReqToCallback: true,
profileFields: ['id', 'displayName', 'name', 'profileUrl', 'emails', 'photos'],
}, async (req, accessToken, refreshToken, profile, done) => {
done(null, await this.userService.createOrUpdateFromSociel(profile))
});
}
}