首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >第一次点击后,google-oauth屏幕不再显示吗?

第一次点击后,google-oauth屏幕不再显示吗?
EN

Stack Overflow用户
提问于 2020-12-11 19:52:33
回答 1查看 169关注 0票数 2

这是非常奇怪的行为。每次我得到一个新的凭证,我点击链接,我得到同意屏幕,但之后同意屏幕不再显示,而是请求到谷歌服务器和对回调url的响应在幕后发生。我注销了用户"/auth/ logout ",我也删除了手动存储的所有cookie,当我点击按钮时,我会自动重新登录。

我相信编码没有问题,我检查了console.developers的同意屏幕,但没有任何与此问题相关的内容。

这是一个typescript项目。这是路线

代码语言:javascript
复制
import passport from "passport";
import { Application, Request, Response } from "express";

export const authRoutes = (app: Application) => {
  app.get(
    "/auth/google",
    passport.authenticate("google", {
      scope: ["profile", "email"],
    })
  );

  app.get(
    "/auth/google/callback",
    passport.authenticate("google"),
    (req: Request, res: Response) => {
      res.redirect("/");
    }
  );

  // passport sees the code here and it knows that it has to use the code to get user
  app.get("/auth/current_user", (req: Request, res: Response) => {
    res.send(req.user);
  });
  app.get("/auth/logout", (req: Request, res: Response) => {
    req.logout();
    res.json({ user: req.user });
  });
};

以下是passport设置:

代码语言:javascript
复制
import GoogleStrategy from "passport-google-oauth20";
import passport from "passport";
import { User, UserDoc } from "../database/models/User";

// passport sets up the cookie and stuffs the user's database id not the googleId.
passport.serializeUser(
  (user: UserDoc, done: (err: any, user: UserDoc) => void) => {
    done(null, user.id);
  }
);

passport.deserializeUser(
  async (id: string, done: (err: any, user: UserDoc) => void) => {
    const user = await User.findById(id);
    if (user) {
      done(null, user);
    }
  }
);

passport.use(
  new GoogleStrategy.Strategy(
    {
      clientID: process.env.GOOGLE_CLIENT_ID!,
      clientSecret: process.env.GOOGLE_CLIENT_SECRET!,
      callbackURL: "http://localhost:4500/auth/google/callback",
      proxy: true,
    },
    async (accessToken, refreshToken, profile, done) => {
      const existingUser = await User.findOne({ googleId: profile.id });
      if (existingUser) {
        done(undefined, existingUser);
      }
      const user = await new User({ googleId: profile.id }).save();
      done(undefined, user);
    }
  )
);
EN

回答 1

Stack Overflow用户

发布于 2020-12-11 21:57:29

你看到的是你想要的行为--一旦用户授权了你请求的范围(显示在同意屏幕上),谷歌就不需要再次获得用户的同意。它会对此进行跟踪。

用户可以在https://myaccount.google.com/permissions查看和撤销对您的应用程序(移动或基于web)的访问权限。这在开发过程中特别有用,这样您就不必不断创建新帐户来进行测试。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65250881

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档