【问题标题】:iron:router how to redirect to a url with a different domain?铁:路由器如何重定向到具有不同域的网址?
【发布时间】:2015-04-01 09:12:46
【问题描述】:

问题已通过进度修改

来自服务器的“结果”值是我传回给客户端的唯一 url(不是我的域)(请参阅我的 Meteor.call 函数)。

如何将用户引导至此网址?。使用 iron:router Router.go(); 不起作用,因为它会将 url 附加到我的域。

当用户单击“getgoodreads”按钮时调用该方法。

服务器.js

var request = Npm.require('request');
var querystring = Npm.require('querystring');

Meteor.methods({
 getGoodreads: function () {
   request.post('http://www.goodreads.com/oauth/request_token', {
            oauth: {
            consumer_key: 'someKey',
            consumer_secret: 'someSecretKey'
            }
      }, function (err, res, body)  {
        req_data = querystring.parse(body);
        result= 'http://www.goodreads.com/oauth/authorize?' + querystring.stringify({oauth_token: req_data.oauth_token});
    });
         return result;
 } 
});

client.js

Template.profiles.events({
'click #goodreads': function (event) {
     event.preventDefault();
     Meteor.call('getGoodreads', function (error, result) {
       if (error) {
          console.log(error)
          } else {
console.log(result);
         Router.go(result); 
          }
      });
     }
});

我收到此错误: *糟糕,客户端或服务器上似乎没有 url 的路由:"http://localhost:3000/oauth/authorize?oauth_token=IBR4tGXdAgQbEsqmxve5Q."

要重定向到的正确网址是:http://www.goodreads.com/oauth/authorize?oauth_token=IWDH8EWUhn1jtrjsQA

*

Router.route('/profile/', {
 name: 'profile',
 waitOn: function () {
    return Meteor.subscribe('profile');
    },
 action: function () {
 ***maybe make the post function here?***


// this.ready() is true if all items returned from waitOn are ready
if (this.ready())
this.render('profile');
  else
this.render('Loading');
  }
});

*“结果”链接将用户带到 goodreads 页面,用户通过登录他们的 goodreads 帐户授予我访问其数据的权限。但是,由于此路线未在我的路线中定义,因此出现错误。之所以如此,是因为每个 url 都是唯一的。

【问题讨论】:

    标签: redirect meteor request iron-router iron


    【解决方案1】:

    oauth1 是其他包使用的依赖包,具体是accounts-twitter。没有任何传统意义上的文档。

    如果您想为未在大气js.com 上列出的服务创建自己的 oauth 登录,您可以从查看使用 oauth-1 的其他包开始。不久前,我必须这样做才能允许使用我的应用程序登录 bitbucket。该软件包的来源在这里:https://github.com/Tarang/Meteor-Accounts-Bitbucket

    还有其他一些,除了重命名 URL 和服务名称之外,大多数几乎相同:

    【讨论】:

    • 我正在阅读代码并试图分解它是如何工作的。我了解一些身份验证代码,例如传递 POST 请求以获取令牌、身份验证和被授予访问令牌。但是,其余的我不明白,因为它是特定于服务提供商的。我已经用oauth2.0的方法验证了用户,没有使用任何包,但是oauth1.0似乎很难掌握。
    • @CodeCandy 您要为哪个服务构建?
    • 当我使用这个 api 调用时...goodreads.com/api/index#reviews.list 我必须得到用户的 'id'
    • 将用户引导至我构建的 uri 的最佳方式是什么。从日志中复制它后,我手动将它放入浏览器控制台,它可以工作。所以我知道这是下一步。我正在使用铁路由器。此身份验证过程从方法调用开始
    • @CodeCandy 我看过这个,所以用户要通过 goodreads 登录然后调用 api 调用?如果是这样,只需将 URL 替换为 goodreads 并将其重命名为 Xero 或 Aweber 包中的 goodread。如果您只是进行 api 调用,则不需要 oauth1 包,而只需使用 npm 模块 request 签署请求
    【解决方案2】:

    所以,我发现您可以使用 webappmeteor 包来做到这一点。

    在您的服务器代码中:

    var fakeSession = {}
    url = Meteor.npmRequire('url');
    
    WebApp.connectHandlers.use('/to-goodreads', function(req, res, next) {
      gr.requestToken(function(obj) {
        fakeSession.oauthToken = obj.oauthToken;
        fakeSession.oauthTokenSecret = obj.oauthTokenSecret;
    
        console.log(obj.url)
        res.writeHead(302, {
          'Location': obj.url
        });
        return res.end();
      })
    })
    
    WebApp.connectHandlers.use('/callback', function(req, res, next) {
    
      oauthToken = fakeSession.oauthToken;
      oauthTokenSecret = fakeSession.oauthTokenSecret;
      params = url.parse(req.url, true);
      return gr.processCallback(oauthToken, oauthTokenSecret, params.query.authorize, function(callback) {
        console.log('processed callback')
        res.write(JSON.stringify(callback));
        return res.end();
      });
    })
    

    其中 gr 是 goodreads npm 模块

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-18
      • 1970-01-01
      • 1970-01-01
      • 2014-12-24
      • 2019-03-30
      相关资源
      最近更新 更多