구글 인증이 완료되면 profile을 읽어 들여 기존 db에 회원등록이 되어있는지 확인하고 가입 경로가 구글이 맞는지 등을 체크하여 가입 또는 로그인을 진행한다.
해당 기능에 필요한 변수들을 user.entity에 추가해준다 (provider(가입경로), profileImg)
이미지 생성 패키지 다운로드 명령어
npm install @types/gravatar gravatar
//provider.enum.ts
export enum ProviderEnum {
LOCAL = 'local',
GOOGLE = 'google',
APPLE = 'apple',
}
//user.entity.ts
+
import * as gravatar from 'gravatar';
@Column({
type: 'enum',
enum: ProviderEnum,
default: ProviderEnum.LOCAL,
})
public provider: ProviderEnum;
@Column()
public profileImg?: string;
async beforesave():Promise<void>{ // 패스워드를 암호화 할때 프로필 이미지 처리도 함께해준다
//로컬 회원가입을 하는게 아니라면 비밀번호와 프로필이미지가 처리될 필요가 없음
if(this.provider != ProviderEnum.Local) return;
else{
//패스워드암호화
const saltVal = await bcrypt.genSalt(10);
this.password = await bcrypt.hash(this.password, saltVal);
//프로필 자동생성
this.profileImg = await gravatar.profile_url(
this.email,
{
s: '200', //이미지 크기
r: 'pg', // 이미지 등급
d: 'mm', // 기본이미지
protocol: 'https',
}
);
}
}
//create-user.dto.ts
+
provider?: ProviderEnum;
profileImg: string;
//google-auth.startegy.ts
async validate(
_accessToken: string,
_refreshToken: string,
profile: any,
done: Verifycallback,
):Promise<any> {
const { provider, displayName, email, picture } = profile;
try{
const user = await this.usersService.getUserByEmail(email);
if(user.provider !== provider){
throw new HttpException( `You are already subscribed to ${user.provider}`, HttpStatus.CONFLICT,);
}
done(null,user);
} catch (err){
if(err.status === 404) {
const newuser = await this.authService.signUp({
email,
username: displayName,
provider,
profileImg: picture,
isMarketingAgree: false,
});
}
done(null, newuser);
}
}
좋은 글 감사합니다.