第1步:创建您的初始node。js应用程序并安装以下包,因为我们将在我们的项目中使用它npmiexpress,jsonwebtoken,passport,passportgoogleoauth20,dotenv 第2步:在googledeveloperconsole中创建一个新项目并获取googleclientid和secret。将此配置添加到。env文件并添加jwt秘密,使用此命令创建一个随机秘密。opensslrandbase6432 第3步:在您的应用中创建文件passport。js。constpassportrequire(passport);constGoogleStrategyrequire(passportgoogleoauth20)。Strategy;constjwtrequire(jsonwebtoken);passport。use(newGoogleStrategy({clientID:process。env。GOOGLECLIENTID,clientSecret:process。env。GOOGLECLIENTSECRET,callbackURL:http:localhost:5000apiauthgoogleRedirect,},asyncfunction(accessToken,refreshToken,profile,done){returndone(null,profile);})); 第4步:创建auth。route。js文件constjwtrequire(jsonwebtoken);constexpressrequire(express);constrouterexpress。Router();constpassportrequire(passport);这是用户单击Google登录按钮时将被重定向到的路由。router。get(logingoogle,passport。authenticate(google,{scope:〔profile,email〕}));GOOGLELOGINCALLBACKrouter。get(googleRedirect,passport。authenticate(google),async(req,res){console。log(req。user,req。body);constusers{firstName:req。user。displayName,lastName:req。user。name。familyName,email:req。user。emails〔0〕。value,imgURL:req。user。photos〔0〕。value,lastLogin:Date。now(),};检查用户是否存在于数据库中的函数。如果是,它返回用户。如果没有,它会创建一个新用户。awaitUsers。findOne({email:users。email},async(err,user){if(err){done(err,false,{message:SomethingwentwrongwithGoogleOAuth,});}if(user){用户已经存在于我们的数据库中console。debug(Useralreadyexistsinourdatabase);更新上次登录时间戳user。lastLoginDate。now();Users(user)。save();lettokenjwt。sign({data:users,},process。env。JWTSECRET,{expiresIn:24h});expiryin24hoursres。cookie(jwt,token);res。redirect(process。env。CLIENTAUTHREDIRECTURL);}else{Users(users)。save();lettokenjwt。sign({data:users,},process。env。JWTSECRET,{expiresIn:24h});expiryin24hoursres。cookie(jwt,token);res。redirect(process。env。CLIENTAUTHREDIRECTURL);}});});module。exportsrouter; 第5步:创建一个中间件控制器来验证并从数据库中获取详细信息。constjwtrequire(jsonwebtoken);constuserModelrequire(。。modeluser。model);获取当前用户详情的中间件router。get(currentuser,verifyStudent,currentuser);exports。verifyStudentasync(req,res,next){constjwttreq。headers。cookie;if(jwtt){consttokenjwtt。split()〔1〕。split(;)〔0〕;jwt。verify(token,process。env。JWTSECRET,async(err,user){if(err){returnres。status(403)。json(Tokenisnotvalid!);}constuserawaituserModel。findOne({email:user。data。email});if(!user){returnres。status(403)。json(Usernotfound!);}req。useruser;next();});}else{returnres。status(401)。json(Youarenotauthenticated!);}};exports。currentuserasync(req,res){if(req。user){res。status(200)。json({message:Userisloggedinsuccessfully!,success:true,user:req。user,});}else{res。status(401)。json({message:Invaliduserid!,success:false,});}};