我正在为访问Google API v3的桌面应用程序编写网络服务器,为此,我需要使用其oAuth 2.0。
Web服务器将PassportJS与passport-google-oauth20
策略结合使用,并且可以工作,因为我收到了访问令牌和刷新令牌。
我既不打算保留用户数据,也不需要桌面应用程序的cookie。我真正需要的只是一个accessToken和refreshToken,这样用户就不必每次都登录。
到目前为止,一切都很好,但是Google发送令牌后,它以某种方式失败了吗?我敢肯定不是Google发送的是401,而是我设置的方式。
我尝试了这个answer,但这对我不起作用,因为我需要令牌。
这是策略设置:
const passport = require("passport");
const GoogleStrategy = require('passport-google-oauth20').Strategy;
passport.use(
new GoogleStrategy(
{
clientID: process.env.CLIENT_ID,
clientSecret: process.env.CLIENT_SECRET,
callbackURL: "/oauth/callback"
},
(accessToken, refreshToken, _, done) => {
console.log("access token: ", accessToken);
console.log("refresh token: ", refreshToken);
done(null, null)
}
)
);
这是服务器的相关部分
server.get("/authorized", (req, res) => res.send("Login Succeeded"));
server.get("/fail", (req, res) => res.send("Login Failed"));
server.get(
"/oauth",
passport.authenticate("google", {
scope: ["https://www.googleapis.com/auth/drive.file", "email"],
accessType: "offline",
approvalPrompt: "force",
})
);
server.get(
"/oauth/callback",
passport.authenticate("google", {
successRedirect: "/authorized",
failureRedirect: "/fail",
failureFlash: true,
failWithError: true,
})
);
,如果您想亲自观看,here is a snippet repo
答案 0 :(得分:1)
在策略回调中,您需要向Passport提供经过身份验证的用户,否则它将被视为身份验证尝试失败。
通过将authorized
更新为以下内容,我可以使您的代码正常工作并重定向到done()
路由:
(accessToken, refreshToken, _, done) => {
console.log("access token: ", accessToken);
console.log("refresh token: ", refreshToken);
done(null, _)
}