仍然对节点的一点感到困惑。
我有一台运行在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
答案 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
填写所有必需的凭据。
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
,您现在可以使用浏览器。
<!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
路由中的查询字符串返回。
<!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下载所有文件。