我目前正在设置SurveyMonkey开发人员草案应用程序,并按照documentation的描述实施OAuth。我已经完成了步骤1(直接用户到SurveyMonkey的OAuth授权页面)但是一旦用户输入他们的用户名和密码来授权SurveyMonkey访问,如上面链接的步骤2中所指定的,我如何获得对包含的短期代码的访问权限作为查询参数?从本质上讲,一旦我们离开了我正在构建的网站,如何从用户正在查看的SurveyMonkey页面访问URL参数,但据我所知,我的网站无法立即访问?< / p>
答案 0 :(得分:0)
短暂的代码作为查询参数包含在redirect_uri
中。在应用的“设置”页面中,您将设置带有“OAuth重定向网址”标签的选项作为服务器的链接。
因此,假设您的网站为https://www.example.com
,您的重定向URI可能类似于https://www.example.com/surveymonkey/oauth
,您可以将其保存在应用的设置中。
因此,对于第1步,您会将用户发送到:
https://api.surveymonkey.net/oauth/authorize?response_type=code&redirect_uri=https://www.example.com/surveymonkey/oauth&client_id=<your_client_id>&api_key=<your_api_key>
当用户点击OAuth表单中的“授权”时,我们会将短期代码作为查询参数发送到您的redirect_uri
。因此用户将被发送到:
https://www.example.com/surveymonkey/oauth?code=<short_lived_code>
通常你不会渲染一个页面(虽然你可以通过window.location.search
或者其他东西检查JavaScript中的代码)但是在主机的服务器端你可以从GET参数中获取代码(取决于您的语言/框架)并在https://api.surveymonkey.net/oauth/token?api_key=<your_api_key>
处为长期访问令牌交换该短期令牌。
一个python示例:
import requests
def surveymonkey_oauth(request):
code = request.GET['code']
post_body = {
"client_secret": "your_client_secret",
"redirect_uri": "https://www.example.com/surveymonkey/oauth",
"grant_type": "authorization_code",
"code": code
}
headers = {
"Content-Type": "application/x-www-form-urlencoded"
}
response = requests.post("https://api.surveymonkey.net/oauth/token?api_key=<your_api_key>", headers=headers, data=post_body)
access_token = response['access_token']
然后,您可以存储该访问令牌,并在您希望向该用户发出对SurveyMonkey API的请求时为其提取。
我有一段时间没有使用node.js,但让我尝试一个节点示例,因为我看到你已经表达了标签:
var http = require('http');
var querystring = require("querystring");
app.get('/surveymonkey/oauth', function (req, res) {
var code = req.query.code;
var post_body = querystring.stringify({
"client_secret": "your_client_secret",
"redirect_uri": "https://www.example.com/surveymonkey/oauth",
"grant_type": "authorization_code",
"code": code
});
var options = {
host: 'api.surveymonkey.net',
port: 443,
path: '/oauth/token?api_key=<your_api_key>',
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
'Content-Length': Buffer.byteLength(post_body)
}
}
var req = http.request(options, function(res) {
res.setEncoding('utf8');
res.on('data', function (body) {
// Get access_token from body and do what you like with it
});
});
req.write(post_body);
req.end();
});
请注意,如果您只想访问自己的帐户,如果您在“凭据”部分的应用设置页面底部附近向下滚动,则会为您自己的帐户提供访问令牌。
另请注意,处于“草稿”模式的应用只能访问您自己的帐户。