如何触发护照-oauth2中的回调

时间:2019-11-18 21:36:01

标签: node.js oauth-2.0 passport.js

我已经查看了多个类似的问题,其中回调在护照中不起作用,但我似乎无法解决我的具体情况。

   passport.use(new OAuth2Strategy({
    authorizationURL: 'http://localhost:3001/oauth2/authorize',
    tokenURL: 'http://localhost:3001/oauth2/token',
    clientID: 'ID',
    clientSecret: 'secret',
    passReqToCallback: true
},

    function (accessToken, refreshToken, profile, cb) {

        //This never happens

        User.findOrCreate({ exampleId: profile.id }, function (err, user) {
            return cb(err, user);
        });
    }
))

我也尝试过直接在路由器中完成

app.get('/test', passport.authenticate('oauth2', { failureRedirect: '/login' },
(err, user, info) => {
    console.log("Something work please");
}),
(req, res) => {
    res.send("OK");
}

所有这些都不会触发。发生什么情况是passport.authenticate会立即返回配置文件。是不是应该将结果返回给回调(我尝试使用的任何结果)?

这是个人资料对象供参考

{
"_id": "<ID>",
"accessToken": "<AccessToken>",
"accessTokenExpiresAt": "2019-11-18T21:39:20.994Z",
"refreshToken": "<RefresToken>",
"refreshTokenExpiresAt": "2019-12-02T20:39:20.994Z",
"client": {
    "id": "ClientID"
},
"user": {
    "username": "<username>"
},
"__v": 0

已验证它是否达到了此特定端点?是 提供程序服务器工作?是 其他没有护照的端点吗?是的

编辑:我当时在想它会进行API调用,但是它似乎想重定向请求,因此OAuth2服务器的响应将直接返回给客户端,而不是触发回调。

1 个答案:

答案 0 :(得分:0)

确保您已告知您的应用在您的路线上使用护照策略。

app.use('/test', passport.authenticate('oauth2', {session: false}));

编辑:另外,检查它是否将通过正确的cb函数返回。这是我的查找和更新功能的示例。

passport.use('oauth2', new OAuth2Strategy({
    authorizationURL: 'http://localhost:3001/oauth2/authorize',
    tokenURL: 'http://localhost:3001/oauth2/token',
    clientID: 'ID',
    clientSecret: 'secret',
    passReqToCallback: true
},
async (accessToken, refreshToken, profile, cb) => {
    try {
        var user = await User.findOne({
            where: {
                id: profile.id
            }
        })
        if (user) {
            console.log('user found');
            await user.update({
                // update user if needed
            })
        }
        return cb(null, user);
    }
    catch (error) {
        console.log(error)
        return cb(error, false, error.message);
    }
}));