来自Parse Cloud Code的Twitter请求失败,并显示“无法对您进行身份验证”。

时间:2015-10-16 13:47:29

标签: javascript android twitter parse-platform oauth

{"errors":[{"code":32,"message":"Could not authenticate you."}]}

这是我在尝试向Twitter发送GET users/show请求时获得的。一些背景:

  • 用户通过ParseTwitterUtils;
  • 在我的Android应用中进行了验证
  • 在Android上,我调用了一个parse.com云代码函数,传递了用户令牌和令牌秘密(看起来很糟糕,但现在我只是想看看这个工作);
  • 从Cloud Code,我使用this github library格式化auth标头。这需要here解释。

您可以在下面看到我的一些代码。 Android发布代码:

HashMap<String, Object> params = new HashMap<>();
params.put("twitterId", ParseTwitterUtils.getTwitter().getUserId());
params.put("authToken", ParseTwitterUtils.getTwitter().getAuthToken());
params.put("authTokenSecret", ParseTwitterUtils.getTwitter().getAuthTokenSecret());
ParseCloud.callFunctionInBackground("fetchPictureFromTwitter", params, ... );

云代码主要功能:

Parse.Cloud.define("fetchPictureFromTwitter", function(request, response) {

  var twitterId = request.params.twitterId;
  var authToken = request.params.authToken;
  var authTokenSecret = request.params.authTokenSecret;
  var url = "https://api.twitter.com/1.1/users/show.json";

  Parse.Cloud.httpRequest({
    url: url,
    followRedirects: true,
    headers: {
      "Authorization": getOAuthSignature(url,authToken,authTokenSecret)
    },
    params: {
      user_id: twitterId
    }

  }).then(...)

最后这里是getOAuthSignature,用于签署请求的函数(我从github链接的示例页面中获取了这个函数):

var getOAuthSignature = function(url, authToken, authTokenSecret) {

    var nonce = OAuth.nonce(32);
    var ts = Math.floor(new Date().getTime() / 1000);
    var timestamp = ts.toString();

    var consumerKey = <MY-APP-CONSUMER-KEY>
    var consumerSecret = <MY-APP-CONSUMER-SECRET>

    var accessor = {
        "consumerSecret": consumerSecret,
        "tokenSecret": authTokenSecret
    };

    var params = {
        "oauth_version": "1.0",
        "oauth_consumer_key": consumerKey,
        "oauth_token": authToken,
        "oauth_timestamp": timestamp,
        "oauth_nonce": nonce,
        "oauth_signature_method": "HMAC-SHA1"
    };

    var message = {
        "method": "GET",
        "action": url,
        "parameters": params
    };

    OAuth.SignatureMethod.sign(message, accessor);
    var normPar = OAuth.SignatureMethod.normalizeParameters(message.parameters);
    var baseString = OAuth.SignatureMethod.getBaseString(message);
    var sig = OAuth.getParameter(message.parameters, "oauth_signature") + "=";
    var encodedSig = OAuth.percentEncode(sig);

    return 'OAuth oauth_consumer_key="'+consumerKey+'", oauth_nonce=' + nonce + ', oauth_signature=' + encodedSig + ', oauth_signature_method="HMAC-SHA1", oauth_timestamp=' + timestamp + ',oauth_token="'+authToken+'", oauth_version="1.0"'
};

可能有什么不对?我现在花了两天时间处理这件事,我不知道该怎么做了。

1 个答案:

答案 0 :(得分:0)

此处的问题是user_id="<user-id>必须在请求标头中以及所有其他oauth_*参数中进行编码。所以我不得不改变这一部分:

var params = {
    "user_id": twitterId, // <- add here
    "oauth_version": "1.0",
    "oauth_consumer_key": consumerKey,
    "oauth_token": authToken,
    "oauth_timestamp": timestamp,
    "oauth_nonce": nonce,
    "oauth_signature_method": "HMAC-SHA1"
};

我正在从外部函数传递userId,例如getOAuthSignature(url,twitterId,authToken,authTokenSecret)

至于将身份验证令牌数据从设备传递到云,可能不需要这样做,因为您可以在任何authData的{​​{1}}字段中找到所有身份验证信息(只要它与推特或Facebook)。