首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何通过Google策略处理dpd-passport的回调/重定向?

如何通过Google策略处理dpd-passport的回调/重定向?
EN

Stack Overflow用户
提问于 2015-06-18 01:24:11
回答 1查看 300关注 0票数 5

我正在构建一个项目,使用Deployd帮助我的API,使用dpd-passport进行身份验证。

我似乎已经完成了所有的认证,通过谷歌分发了会话密钥和用户认证,但我的redirectURLs以及翻译我返回的回调页面都有问题。

我深入研究了dpd-passport/index.js文件,我相信这是相关信息:

代码语言:javascript
复制
var sendResponse = function(ctx, err, config) {
var sessionData = ctx.session.data;
var returnUrl = (ctx.req.cookies && ctx.req.cookies.get('_passportReturnUrl')) || null;

if(returnUrl) {
    var redirectURL = url.parse(returnUrl, true);

    // only append if not disabled
    if(!config.disableReturnParams) {
        // delete search so that query is used
        delete redirectURL.search;

        // make sure query is inited
        redirectURL.query = redirectURL.query || {};
        if(err) {
            redirectURL.query.success = false;
            redirectURL.query.error = err;
        } else {
            // append user + session id to the redirect url
            redirectURL.query.success = true;

            if(!config.disableSessionId) {
                redirectURL.query.sid = sessionData.id;
                redirectURL.query.uid = sessionData.uid;
            }
        }
    }

    var redirectURLString = '';
    try {
        redirectURLString = url.format(redirectURL);
    } catch(ex) {
        console.warn('An error happened while formatting the redirectURL', ex);
    }

    // redirect the user
    ctx.res.setHeader("Location", redirectURLString);
    ctx.res.statusCode = 302;

    ctx.done(null, 'This page has moved to ' + redirectURLString);
    } else {
        if(err) {
            ctx.res.statusCode = 401;
            console.error(err);
            return ctx.done('bad credentials');
        } else {
            ctx.done(err, { path: sessionData.path, id: sessionData.id, uid: sessionData.uid });
        }
    }
};

在成功进行身份验证之后,我得到了一个returnUrl

http://localhost:3000/auth/google/callback?code=4/l4o-H2F4QKJ5tdKbVbGfWygTGRvhHgr9zrHWImFFKdM#

主体为:

{"path":"/users","id":"d03c0faccfe41134c193266afef979c5af33adf935aeff45844b0f9473dee4ab1fbd1114240e13ea9a542785da3845cfec984e3a5b8cb188d6c595b6fc39a726","uid":"747f97a9bcfa9811"}

在我看来,我的结果命中了最顶层代码块中的最后一条else语句。

如果这是真的,那么我的returnUrlNULL

回溯dpd-passport文件中的returnUrl代码,它看起来应该从以下代码片段中的cookies中获取该代码:

代码语言:javascript
复制
if(ctx.query.redirectURL && this.config.allowedRedirectURLs) {
    try {
        this.regEx = this.regEx || new RegExp(this.config.allowedRedirectURLs, 'i');

        if(ctx.query.redirectURL.match(this.regEx)) {
            // save this info into the users session, so that we can access it later (even if the user was redirected to facebook)
            if (ctx.res.cookies) ctx.res.cookies.set('_passportReturnUrl', ctx.query.redirectURL);
        } else {
            debug(ctx.query.redirectURL, 'did not match', this.config.allowedRedirectURLs);
        }
    } catch(ex) {
        debug('Error parsing RedirectURL Regex!', ex);
    }
}

除此之外,我在配置中将我的allowedRedirectUrls设置为:

代码语言:javascript
复制
^http://localhost:3000/.*$

我不知所措,我希望我遗漏了一些明显的东西。

我已经看到了与以下类似的passport路由和身份验证策略,但在dpd-passport中实现失败:

代码语言:javascript
复制
app.get('/auth/google/callback', 
  passport.authenticate('google', { failureRedirect: '/login' }),
  function(req, res) {
    // Successful authentication, redirect home.
    res.redirect('/');
  });

除此之外,我还使用了ui-router/AngularJS。

EN

回答 1

Stack Overflow用户

发布于 2015-09-02 09:48:24

您必须通过启动oauth过程的链接提供dpd-passport的redirectURL:

代码语言:javascript
复制
http://localhost:2403/auth/google?redirectURL=http://localhost
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30898327

复制
相关文章

相似问题

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