在 Passportjs 中使用 passport-azure-ad OIDCStrategy 时遇到问题
Trouble using passport-azure-ad OIDCStrategy with Passportjs
我正在尝试使用 passport-azure-ad 对用户进行身份验证。该应用程序显示通用登录屏幕,但当我点击登录时,浏览器 window 变为空白并显示一个微调器,表明它正在工作。与此同时,我的服务器正在接收对我的回调端点的连续 POST 请求。
在此期间,none 我的护照功能(验证、serializeUser 和 deserializeUser)被调用。
这是我的策略定义:
passport.use("azure", new azureStrategy({
identityMetadata: 'https://login.microsoftonline.com/common/.well-known/openid-configuration',
clientID: "*************************",
responseType: 'code id_token',
issuer: "https://sts.windows.net/********************/",
responseMode: 'form_post',
redirectUrl: "http://localhost:5055/auth/azure/callback",
allowHttpForRedirectUrl: true,
clientSecret: "**********************************"
}, function(iss, sub, profile, accessToken, refreshToken, done) {
console.log("ID TOken: ", profile.oid); //Never gets called
console.log("User" ,profile) //Never gets called
done(null, profile);
}));
passport.serializeUser(function(user, done){
console.log("serialize: ", user) //Never gets called
done(null, user);
})
passport.deserializeUser((user, done) => {
console.log("deserialize: ", user) //never gets called
done(null, user);
})
这是我的路线定义:
app.get("/auth/azure", passport.authenticate('azure', {failureRedirect: '/'}))
app.post("/auth/azure/callback",
(req, res, next) => {
console.log("POST Callback Received!");
next();
},
passport.authenticate("azure", {
failureRedirect: "/error.html"
}),
(req, res) => {
console.log("Recieved POST callback")
res.redirect("/user")
})
有几件事要提一下:
- 我正在为我的组织开发应用程序,因此它应该只对我们 AD 中的用户进行身份验证。
- 我最初尝试使用 identityMetadata 的
https://login.microsoft.com/<tenant>...
版本,但我收到了关于 API 版本不支持应用程序的错误——使用 common 似乎已经解决了这个问题。
- 正如我上面提到的,serializeUser、deserializeUser 和验证回调中的
console.log()
代码永远不会被调用。
我的 nodejs 服务器上的控制台 window 简单地显示了这个:
Request at: 1477083649230 GET / {}
Request at: 1477083649235 GET /login.html {}
Request at: 1477084498737 GET /auth/azure {}
Request at: 1477085275630 POST /auth/azure/callback {}
POST Callback Received!
Request at: 1477085275980 POST /auth/azure/callback {}
POST Callback Received!
Request at: 1477085276335 POST /auth/azure/callback {}
POST Callback Received!
Request at: 1477085276679 POST /auth/azure/callback {}
POST Callback Received!
Request at: 1477085277042 POST /auth/azure/callback {}
POST Callback Received!
您可以看到,这种情况一直持续到我终止该会话或浏览到网站上的其他页面为止。还要注意,虽然创建了 POST 回调日志,但在身份验证之后发生的日志永远不会。
如有任何帮助,我们将不胜感激。
在使用 Google 身份验证策略时,我使用 GET 回发;但是,当我按照 Azure 示例进行操作时,我们开始回发 POST.
我从样本中删除了我认为不必要的所有内容。其中之一就是 bodyParser。不幸的是,这是必要的部分,以便 Passport 可以解析 POST 请求的主体以获取从身份验证服务器发回的信息。
因此,所需的位如下:
var parser = require("body-parser")
...
//before passport.initialize()
app.use(parser.urlencoded({extended: true}));
仅此而已,一切都开始正常运行。希望这能让其他人省去所有的麻烦!
我正在尝试使用 passport-azure-ad 对用户进行身份验证。该应用程序显示通用登录屏幕,但当我点击登录时,浏览器 window 变为空白并显示一个微调器,表明它正在工作。与此同时,我的服务器正在接收对我的回调端点的连续 POST 请求。
在此期间,none 我的护照功能(验证、serializeUser 和 deserializeUser)被调用。
这是我的策略定义:
passport.use("azure", new azureStrategy({
identityMetadata: 'https://login.microsoftonline.com/common/.well-known/openid-configuration',
clientID: "*************************",
responseType: 'code id_token',
issuer: "https://sts.windows.net/********************/",
responseMode: 'form_post',
redirectUrl: "http://localhost:5055/auth/azure/callback",
allowHttpForRedirectUrl: true,
clientSecret: "**********************************"
}, function(iss, sub, profile, accessToken, refreshToken, done) {
console.log("ID TOken: ", profile.oid); //Never gets called
console.log("User" ,profile) //Never gets called
done(null, profile);
}));
passport.serializeUser(function(user, done){
console.log("serialize: ", user) //Never gets called
done(null, user);
})
passport.deserializeUser((user, done) => {
console.log("deserialize: ", user) //never gets called
done(null, user);
})
这是我的路线定义:
app.get("/auth/azure", passport.authenticate('azure', {failureRedirect: '/'}))
app.post("/auth/azure/callback",
(req, res, next) => {
console.log("POST Callback Received!");
next();
},
passport.authenticate("azure", {
failureRedirect: "/error.html"
}),
(req, res) => {
console.log("Recieved POST callback")
res.redirect("/user")
})
有几件事要提一下:
- 我正在为我的组织开发应用程序,因此它应该只对我们 AD 中的用户进行身份验证。
- 我最初尝试使用 identityMetadata 的
https://login.microsoft.com/<tenant>...
版本,但我收到了关于 API 版本不支持应用程序的错误——使用 common 似乎已经解决了这个问题。 - 正如我上面提到的,serializeUser、deserializeUser 和验证回调中的
console.log()
代码永远不会被调用。
我的 nodejs 服务器上的控制台 window 简单地显示了这个:
Request at: 1477083649230 GET / {}
Request at: 1477083649235 GET /login.html {}
Request at: 1477084498737 GET /auth/azure {}
Request at: 1477085275630 POST /auth/azure/callback {}
POST Callback Received!
Request at: 1477085275980 POST /auth/azure/callback {}
POST Callback Received!
Request at: 1477085276335 POST /auth/azure/callback {}
POST Callback Received!
Request at: 1477085276679 POST /auth/azure/callback {}
POST Callback Received!
Request at: 1477085277042 POST /auth/azure/callback {}
POST Callback Received!
您可以看到,这种情况一直持续到我终止该会话或浏览到网站上的其他页面为止。还要注意,虽然创建了 POST 回调日志,但在身份验证之后发生的日志永远不会。
如有任何帮助,我们将不胜感激。
在使用 Google 身份验证策略时,我使用 GET 回发;但是,当我按照 Azure 示例进行操作时,我们开始回发 POST.
我从样本中删除了我认为不必要的所有内容。其中之一就是 bodyParser。不幸的是,这是必要的部分,以便 Passport 可以解析 POST 请求的主体以获取从身份验证服务器发回的信息。
因此,所需的位如下:
var parser = require("body-parser")
...
//before passport.initialize()
app.use(parser.urlencoded({extended: true}));
仅此而已,一切都开始正常运行。希望这能让其他人省去所有的麻烦!