NodeJS 配置文件中缺少Google OAuth 2.0电子邮件

kcwpcxri  于 2023-01-12  发布在  Node.js
关注(0)|答案(2)|浏览(143)

我正在尝试通过Passport设置Google OAuth 2.0。我正在使用express开发一个node.js。版本18.12.1
当用户还没有被创建时,我尝试根据Google提供的信息创建它。但是,由于某种原因,电子邮件丢失了。
我在OAuth 2.0上使用的范围:

问题的代码摘录:

passport.use(new googleAuth.Strategy({
        clientID: process.env.GOOGLE_CLIENT_ID!,
        clientSecret: process.env.GOOGLE_CLIENT_SECRET!,
        callbackURL: "http://localhost:3000/auth/google/secrets",
        scope: ["email","profile"]
    },
    (accessToken: string, refreshToken: string, profile: googleAuth.Profile, cb: VerifyCallback) => {
        User.findOne({googleId: profile.id}, (err: CallbackError, user: PassportLocalModel<IUser>) => {
            if(err){
                return cb(err);
            }else if(user){
                return cb(err, user);
            }else{
                const user = new User({
                    email: profile.emails![0].value,
                    googleId: profile.id,
                });

                user.save((err: CallbackError) => {
                    if(err){
                        console.log(err);
                        cb(err);
                    }
                })
            }
        })
       
    }
));

Profile. email和_json.email(cf:https://developers.google.com/identity/openid-connect/openid-connect#an-id-tokens-payload)
知道为什么吗?
如果需要更多信息,请不要犹豫。
谢谢

编辑:

_json的内容(隐藏真实的内容):

_json: {
    sub: <somestring>,
    name: <some name>,
    given_name: <some name>,
    family_name: <some name>,
    picture: <some url>,
    locale: 'en-GB'
  }
nbnkbykc

nbnkbykc1#

我找到了解决问题的办法。
原来我在身份验证期间覆盖了范围选项。

app.get("/auth/google", 
        passport.authenticate("google", {scope: ["profile"]})
);

只需删除该选项,即可修复此问题。

app.get("/auth/google", 
        passport.authenticate("google")
);

溶液

passport.use(new googleAuth.Strategy({
        clientID: process.env.GOOGLE_CLIENT_ID!,
        clientSecret: process.env.GOOGLE_CLIENT_SECRET!,
        callbackURL: "http://localhost:3000/auth/google/secrets",
        scope: ["profile", "email"]
    },
    (accessToken: string, refreshToken: string, profile: googleAuth.Profile, cb: VerifyCallback) => {
        User.findOne({googleId: profile.id}, (err: CallbackError, user: PassportLocalModel<IUser>) => {
            if(err){
                return cb(err);
            }else if(user){
                return cb(err, user);
            }else{
                const user = new User({
                    email: profile.emails![0].value,
                    googleId: profile.id,
                });

                user.save((err: CallbackError) => {
                    if(err){
                        console.log(err);
                        cb(err);
                    }
                })
            }
        })
       
    }
));

app.get("/auth/google", 
        passport.authenticate("google")
    );
zazmityj

zazmityj2#

你也可以删除google策略上的选项,并在你的auth路径上使用,如下所示

passport.use(new googleAuth.Strategy({
          clientID: process.env.GOOGLE_CLIENT_ID!,
          clientSecret: process.env.GOOGLE_CLIENT_SECRET!,
          callbackURL: "http://localhost:3000/auth/google/secrets",
      },
      (accessToken: string, refreshToken: string, profile: googleAuth.Profile, cb: VerifyCallback) => {
           //...
      }
 ));

    app.get("/auth/google", 
        passport.authenticate("google", {scope: ["email", "profile"]})
);

正如您在他们的文档中所看到的:https://www.passportjs.org/packages/passport-google-oauth20/

相关问题