如何在Javascript中正确生成Facebook Graph API应用程序秘密证明

How to properly generate Facebook Graph API App Secret Proof in Javascript

本文关键字:Graph Facebook API 应用程序 证明 秘密 Javascript      更新时间:2023-09-26

我正在对all_mutual_friends边缘进行服务器端Facebook Graph API调用:https://developers.facebook.com/docs/graph-api/reference/user-context/all_mutual_friends/

当两个用户是好友时,调用有效,但当他们的用户不是好友时,不会返回任何有用的数据。根据文档,这是因为我必须使用 appsecret_proof 参数对调用进行签名。无论我尝试什么,我都无法成功传递此参数。我正在使用在Parse上运行的jsrsasign。我已经尝试了使用access token作为消息和我的appSecret作为密钥的所有配置,反之亦然。我还尝试了 utf8 和十六进制的多种组合。每次收到错误时:API 参数中提供的appsecret_proof无效

法典:

  var Signer = require("cloud/vendor/jsrsasign/lib/jsrsasign.js");
  var userId = request.params.userId;
  var accessToken = request.params.accessToken;
  var appSecret = "redactedStringPastedFromFacebook";
  var signer = new Signer.Mac({alg: "hmacsha256", pass: appSecret});
  var appSecretString = signer.doFinalString(accessToken);
  var appSecretHex = signer.doFinalHex(accessToken);
  var graphRequestURL = "https://graph.facebook.com/v2.5/" + userId;
  var fields = "?fields=context.fields(all_mutual_friends.fields(name,picture.width(200).height(200)))";
  //var authorization = "&access_token=" + accessToken; //this works, but only for existing friends
  var authorization = "&access_token=" + accessToken + "&appsecret_proof=" + appSecretHex;
  return Parse.Cloud.httpRequest({
    url: graphRequestURL + fields + authorization,
    method: "GET",
  })

我见过的大多数例子都是PHP或Python,加密例程更清晰一些。这在appSecretStringappSecretHex都不会抛出错误并且看起来合理,但是这些值总是被Facebook拒绝。

笔记:

  • 我已经三重检查了Facebook提供的应用程序密钥值
  • 我已获得Facebook的批准,可以使用all_mutual_friends功能,这是此特定呼叫的要求
  • 我正在使用Parse,它不是Node,并且不能使用具有外部依赖项的NPM模块,这就是我使用jsrsasign的原因。我也尝试直接使用 CryptoJS,但它不再维护并且没有适当的模块支持,jsrsasign 似乎无论如何都会包装它。

这里是:

  import CryptoJS from 'crypto-js';
  const accessToken = <your_page_access_token>;
  const clientSecret = <your_app_client_secret>;
  const appsecretProof = CryptoJS.HmacSHA256(accessToken, clientSecret).toString(CryptoJS.enc.Hex);