使用以下基本节点OAuth重定向

时间:2015-11-30 07:43:52

标签: node.js oauth

仍然对节点的一点感到困惑。

我有一台运行在http://localhost:3030的服务器来监听重定向的匹配,但重定向从未到来。

如何在Node中,您有实际请求遵循重定向。并最终在 http://localhost:3030/?code=ccf3d214669645f594b59be14032e20d

这是链接;在浏览器中,它最终会在正确的位置结束 https://www.instagram.com/oauth/authorize/?client_id=8901edf0746b460489427434ba5d321e&redirect_uri=http://localhost:3030&response_type=code

2 个答案:

答案 0 :(得分:1)

authorization_code流程需要浏览器,因为必须将用户重定向到第三方网站才能登录并验证您的应用,在这种情况下是Instagram网站。因此,您需要使用浏览器将您重定向回redirect_url code参数。

对于这种类型的OAuth流,您可以使用Grant。您不必自己实施OAuth流程。只需关注basic example,然后将facebook替换为instagram即可。如您所见,您在那里有一个基本的Web服务器,您必须在Web浏览器中导航到/connect/instagram路由。唯一的区别是格兰特将为您处理繁重的工作,因此您最终只会收到access_token

您可以测试Instagram流量here

答案 1 :(得分:1)

我的第一个回答和评论仍然有效,但我将向您展示如何使用nwjs自动执行授权过程。

首先,您需要为“安全”标签下的OAuth应用启用隐式流程。

出于本演示的目的,我使用http://localhost:3000/callback作为OAuth应用的重定向URI。因此,您需要将其添加为OAuth应用的其他重定向网址。同时在authorization.html填写所有必需的凭据。

server.js

var fs = require('fs')
var path = require('path')
var http = require('http')
var url = require('url')
var qs = require('querystring')
var child = require('child_process')

var nw = null
var server = http.createServer()

server.on('request', function (req, res) {
  if (req.url == '/connect') {
    var dpath = path.resolve(__dirname)
    nw = child.spawn('nw', [dpath])
    res.end()
  }
  else if (req.url == '/callback') {
    var fpath = path.resolve(__dirname, 'token.html')
    var body = fs.readFileSync(fpath, 'utf8')
    res.writeHead(200, {'content-type': 'text/html'})
    res.end(body)
  }
  else if (/^\/token/.test(req.url)) {
    var uri = url.parse(req.url)
    var query = qs.parse(uri.query)
    console.log(query)
    nw.on('close', function (code, signal) {
      console.log('NW closed')
    })
    nw.kill('SIGHUP')
    res.end()
  }
})

server.listen(3000, function () {
  console.log('HTTP server listening on port ' + 3000)
})

以:

开头
node server.js

然后导航到http://localhost:3000/connect,您现在可以使用浏览器。

authorize.html

<!DOCTYPE html>
<html>
<head>
  <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
  <title>Client Side Implicit OAuth Flow</title>
  <script type="text/javascript" charset="utf-8">
    var config = {
      client_id: '[CLIENT_ID]',
      redirect_uri: '[REDIRECT_URL]',
      username: '[USERNAME]',
      password: '[PASSWORD]'
    }

    var authorize_url = 'https://www.instagram.com/oauth/authorize/?' +
      'client_id=' + config.client_id + '&' +
      'redirect_uri=' + config.redirect_uri + '&' +
      'response_type=token'

    document.addEventListener('DOMContentLoaded', function (e) {
      var iframe = document.querySelector('iframe')
      iframe.setAttribute('src', authorize_url)
      iframe.onload = function (e) {
        var doc = this.contentWindow.document
        // login
        if (doc.querySelector('[name=username]')) {
          doc.querySelector('[name=username]').value = config.username
          doc.querySelector('[name=password]').value = config.password
          doc.querySelector('[type=submit]').click()
        }
        // authorize
        else if (doc.querySelector('[value=Authorize]')) {
          doc.querySelector('[value=Authorize]').click()
        }
      }
    }, false)
  </script>
</head>
<body>
  <iframe src=""></iframe>
</body>
</html>

一旦您点击该路线,就会产生一个新流程并执行authorize.html。请记住,NWjs需要在您的服务器上安装一些图形库,因此它不是一个无头浏览器。

浏览器导航到iframe内的授权URL。根据您是否已登录或已经授权应用程序,将加载不同的页面。此代码只会填写您的用户名和密码,并点击几个链接。

OAuth流程完成后,您会在网址中获得access_token哈希值。您可能知道浏览器不会将该部分URL发送到服务器,因此在/callback路由中,服务器返回另一个名为token.html的页面,其唯一目的是从中提取访问令牌URL哈希并将其作为/token路由中的查询字符串返回。

token.html

<!DOCTYPE html>
<html>
<head>
  <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
  <title>Client Side Implicit OAuth Flow</title>
  <script type="text/javascript" charset="utf-8">
    var config = {
      callback_uri: 'http://localhost:3000/token'
    }

    var access_token = window.location.hash.replace('#access_token=', '')
    var url = config.callback_uri + '?access_token=' + access_token

    window.location.href = url
  </script>
</head>
<body>
</body>
</html>

运行此示例后,您将在命令行中看到您的访问令牌:

$ node server.js 
HTTP server listening on port 3000
{ access_token: '1404767371.e5610d0.3381e9a2fd7340d8b90b729f407949d2' }
NW closed

您可以从here下载所有文件。