为SurveyMonkey实施OAuth,第2步

时间:2016-06-18 17:25:45

标签: javascript api express oauth surveymonkey

我目前正在设置SurveyMonkey开发人员草案应用程序,并按照documentation的描述实施OAuth。我已经完成了步骤1(直接用户到SurveyMonkey的OAuth授权页面)但是一旦用户输入他们的用户名和密码来授权SurveyMonkey访问,如上面链接的步骤2中所指定的,我如何获得对包含的短期代码的访问权限作为查询参数?从本质上讲,一旦我们离开了我正在构建的网站,如何从用户正在查看的SurveyMonkey页面访问URL参数,但据我所知,我的网站无法立即访问?< / p>

1 个答案:

答案 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();
});

请注意,如果您只想访问自己的帐户,如果您在“凭据”部分的应用设置页面底部附近向下滚动,则会为您自己的帐户提供访问令牌。

另请注意,处于“草稿”模式的应用只能访问您自己的帐户。