计算 oauth 签名

2023-12-02

我正在尝试一些具体的事情,即尝试调用 REST API。我一直在关注这些指示.

我非常小心地确保正确创建“签名基本字符串”。他们定义它是这样创建的:

(HTTP方法)&(请求URL)&(标准化参数)

您可以仔细检查我的代码中是否需要,但我非常确定它没问题。

我遇到的问题是创建他们所谓的“oauth 签名”,而我的与他们的不匹配。他们应该像这样创建:

使用 [RFC2104] 定义的 HMAC-SHA1 签名算法对请求进行签名,其中文本是签名基本字符串,密钥是用“&”字符分隔的消费者密钥和访问密钥的串联值(显示“&”即使访问密钥为空,因为某些方法不需要访问令牌)。

计算出的摘要八位字节字符串,首先按照 [RFC2045] 进行 Base64 编码,然后使用 [RFC3986] 百分比编码 (%xx) 机制进行转义,这就是 oauth_signature。

我在我的代码中这样表达:

var oauthSignature = CryptoJS.HmacSHA1(signatureBaseString, sharedSecret+"&");
var oauthSignature64 = encodeURIComponent(CryptoJS.enc.Base64.stringify(oauthSignature));
console.log("hash in 64: " + oauthSignature64);

我正在使用 Google 的 CryptoJS 库。我将签名基本字符串作为文本,然后将我的消费者秘密作为与“&”连接的密钥,我没有访问密钥,这不是必需的,但没关系。然后我对该哈希的结果进行 Base 64 编码,然后对它进行 URI 编码,请一些人理智地检查一下我对此的理解以及我在使用该库的代码中对它的使用/表达,我认为这就是我的问题所在。

这是我的完整代码:

var fatSecretRestUrl = "http://platform.fatsecret.com/rest/server.api";

var d = new Date();
var sharedSecret = "xxxx";
var consumerKey = "xxxx";

//this is yet another test tyring to make this thing work
var baseUrl = "http://platform.fatsecret.com/rest/server.api?";
var parameters = "method=food.search&oauth_consumer_key="+consumerKey+"&oauth_nonce=123&oauth_signature_method=HMAC-SHA1&oauth_timestamp="+getTimeInSeconds()+"&oauth_version=1.0&search_expression=banana";
var signatureBaseString = "POST&" + encodeURIComponent(baseUrl) + "&" + encodeURIComponent(parameters);
console.log("signature base string: " + signatureBaseString);
var oauthSignature = CryptoJS.HmacSHA1(signatureBaseString, sharedSecret+"&");
var oauthSignature64 = encodeURIComponent(CryptoJS.enc.Base64.stringify(oauthSignature));
console.log("hash in 64: " + oauthSignature64);

var testUrl = baseUrl+"method=food.search&oauth_consumer_key=xxxx&oauth_nonce=123&oauth_signature="+oauthSignature64+"&oauth_signature_method=HMAC-SHA1&oauth_timestamp="+getTimeInSeconds()+"&oauth_version=1.0&search_expression=banana";
console.log("final URL: " + testUrl);

var request = $http({
  method :"POST",
  url: testUrl
});

我已注意确保我发布的参数按字典顺序排列,并且我非常确定它是正确的。

我得到的回复是:

无效签名:oauth_signature 'RWeFME4w2Obzn2x50xsXujAs1yI='

所以很明显

  1. 我不明白 API 中提供的说明
  2. 或者我已经理解了它们,但我没有在我的代码中以这种方式表达它们
  3. 或者以上两者都有
  4. 或者我在某个我看不到的地方犯了一些微妙的错误

我真的很感谢进行健全性检查,这需要一段时间。


好吧...我做到了,但不是我认为最终会这样做的方式,我花了几个小时尝试使用 Angular 然后 JQuery,最后我尝试了 Node JS 并且它起作用了,这里有两个工作示例,一个和food.get另一个与foods.search

food.get 示例

    var rest              = require('restler'),
    crypto            = require('crypto'),
    apiKey           = 'xxxx',
    fatSecretRestUrl = 'http://platform.fatsecret.com/rest/server.api',
    sharedSecret     = 'xxxx',
    date             = new Date;
    
    // keys in lexicographical order
    var reqObj = {
      food_id: '2395843', // test query
      method: 'food.get',
      oauth_consumer_key: apiKey,
      oauth_nonce: Math.random().toString(36).replace(/[^a-z]/, '').substr(2),
      oauth_signature_method: 'HMAC-SHA1',
      oauth_timestamp: Math.floor(date.getTime() / 1000),
      oauth_version: '1.0'
    };
    
    // make the string...got tired of writing that long thing
    var paramsStr = '';
    for (var i in reqObj) {
      paramsStr += "&" + i + "=" + reqObj[i];
    }
    
    // had an extra '&' at the front
    paramsStr = paramsStr.substr(1);
    
    var sigBaseStr = "GET&"
                     + encodeURIComponent(fatSecretRestUrl)
                     + "&"
                     + encodeURIComponent(paramsStr);
    
    // no access token but we still have to append '&' according to the instructions
    sharedSecret += "&";
    
    var hashedBaseStr  = crypto.createHmac('sha1', sharedSecret).update(sigBaseStr).digest('base64');
    
    // Add oauth_signature to the request object
    reqObj.oauth_signature = hashedBaseStr;
    
    rest.get(fatSecretRestUrl, {
      data: reqObj,
    }).on('complete', function(data, response) {
      console.log(response);
      console.log("DATA: " + data + "\n");
    });

食品.搜索示例

    var rest              = require('restler'),
    crypto            = require('crypto'),
    apiKey           = 'xxxx',
    fatSecretRestUrl = 'http://platform.fatsecret.com/rest/server.api',
    sharedSecret     = 'xxxx',
    date             = new Date;
    
    // keys in lexicographical order
    var reqObj = {
      method: 'foods.search',
      oauth_consumer_key: apiKey,
      oauth_nonce: Math.random().toString(36).replace(/[^a-z]/, '').substr(2),
      oauth_signature_method: 'HMAC-SHA1',
      oauth_timestamp: Math.floor(date.getTime() / 1000),
      oauth_version: '1.0',
      search_expression: 'mcdonalds' // test query
    };
    
    // make the string...got tired of writing that long thing
    var paramsStr = '';
    for (var i in reqObj) {
      paramsStr += "&" + i + "=" + reqObj[i];
    }
    
    // had an extra '&' at the front
    paramsStr = paramsStr.substr(1);
    
    var sigBaseStr = "POST&"
                     + encodeURIComponent(fatSecretRestUrl)
                     + "&"
                     + encodeURIComponent(paramsStr);
    
    // again there is no need for an access token, but we need an '&' according to the instructions
    sharedSecret += "&";
    
    var hashedBaseStr  = crypto.createHmac('sha1', sharedSecret).update(sigBaseStr).digest('base64');
    
    // Add oauth_signature to the request object
    reqObj.oauth_signature = hashedBaseStr;
    
    rest.post(fatSecretRestUrl, {
      data: reqObj,
    }).on('complete', function(data, response) {
      console.log(response);
      console.log("DATA: " + data + "\n");
    });

对于任何使用 Angular 或 JQuery 的人来说真的很抱歉,如果我有一两分钟的空闲时间,我会尝试使用 Angular,任何使用 Angular 的人如果遇到 CORS 相关错误,只需启动 chrome,如下所示:

chromium-browser --disable-web-security- 我在终端上执行此操作 或者将该扩展添加到 Windows 上的某些 chrome 快捷方式中,作为一种快速解决方法,希望它对任何人都有帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

计算 oauth 签名 的相关文章

  • 如何设计 REST API 以允许返回带有元数据的文件

    假设我正在设计一个 REST API 并且我需要客户端能够获取带有元数据的文件 设计资源 操作的好方法是什么 我想到了一些想法 单个资源 即 GET files fileId 返回包含文件和带有元数据的 JSON XML 结构的多部分响应
  • 我可以查看当前登录的 Twitter 用户吗?

    他们没有通过我的网站进行 OAuth 验证 但在该浏览器上登录到 Twitter 有什么办法让我知道他们的 Twitter 用户名吗 饼干 什么 除非某些东西非常糟糕或者 Twitter 明确提供了用于此目的的 API 否则不会 至少不是通
  • 如何在WCF Rest服务中从流上传图像

    我正在尝试创建 wcf 服务 该服务将上传 pdf doc xls 图像等文件 但 pdf txt 文件正在上传并正确打开 但是当我尝试上传图像文件时 文件正在上传 但是图像不可见 OperationContract WebInvoke M
  • REST 资源 url 中的查询字符串

    今天 我与一位同事讨论了在 REST URL 中使用查询字符串的问题 举这两个例子 1 http localhost findbyproductcode 4xxheua 2 http localhost findbyproductcode
  • 当REST客户端和服务器在同一台服务器上时如何避免网络调用

    我有一个 Web 应用程序 其中两个主要组件是网站 在 Groovy 和 Grails 中实现 和后端 RESTful Web 服务 使用 JAX RS Jersey 和 Spring 实现 这两个都将在 Glassfish 中运行 该网站
  • 执行oauth时如何创建弹出窗口?

    我想通过使用弹出窗口来完成 Lifestream 和其他网站使用 oauth 身份验证所做的事情 他们打开一个弹出窗口 不知何故没有被弹出窗口拦截器阻止 并将他们的网站变灰 然后 在允许 oauth 访问时 它会说重定向回原始站点并终止弹出
  • 精简 PHP 和 GET 参数

    我使用 Slim PHP 作为 RESTful API 的框架 如何在 Slim PHP 中从 URL 获取 GET 参数 例如 如果我想使用以下内容 http api example com dataset schools zip 999
  • 如何限制 JSON 访问?

    我有一个 Web 应用程序 可以从新创建的 JSON API 中提取数据 我的静态 HTML 页面通过 JavaScript 从静态 HTML 页面动态调用 JSON API 如何限制对 JSON API 的访问 以便只有我 我的网站 可以
  • 为什么将 SOAP 用于 Web 服务?

    我读过教程 web service php mysql xml json http davidwalsh name web service php mysql xml json 看来一切都好 但是为什么我们应该使用soap 来提供网络服务呢
  • 用于 OAuth 身份验证的 WSGI 中间件

    我使用构建了一个非常小的网络应用程序Flask http flask pocoo org 现在我想向网站添加非常基本的身份验证 我不需要授权 由于 Flask 不支持开箱即用的 auth auth 我想插入 WSGI 中间件来完成这项工作
  • Web API 的 ASP.NET MVC Core 控制器 PATCH 方法

    给定一个数据库表 Person 包含 3 列 Id 名字和姓氏 使用真实的 DbContext 时 ASP NET Core Web API MVC 控制器方法 PATCH 仅修改姓氏 看起来如何 我根本不知道如何实现它 并且找不到相关教程
  • 在 Spring 中为 @Pathvariable 添加类级别验证

    在发布这个问题之前 我已经做了很多研究并尝试了很多可用的解决方案 这是我陷入的棘手情况 我有一个 Spring 控制器 它有多个请求映射 它们都有 PathVariables 控制器如下所示 Controller EnableWebMvc
  • 带点 (.) 的 Spring MVC @PathVariable 被截断

    这是问题的延续Spring MVC PathVariable 被截断 https stackoverflow com questions 3526523 spring mvc pathvariable getting truncated S
  • 在java中轮询Http服务器(重复发送http get请求)

    当对其进行 REST 调用时 我的 Web 服务器会发送一些信息 我想不断轮询该服务器 间隔5秒后重复发送HTTP GET请求 以检查返回的信息是否有任何变化 做到这一点最有效的方法是什么 您能提供一些代码示例吗 请注意 我只想开发客户端代
  • C# 构建一个 webservice 方法,它接受 POST 方法,如 HttpWebRequest 方法

    我需要一个接受 POST 方法的 Web 服务 访问我的服务器正在使用 POST 方法 它向我发送了一个 xml 我应该用一些 xml 进行响应 另一方面 当我访问他时 我已经使用 HttpWebRequest 类进行了管理 并且工作正常
  • 轻松的反应

    我有一个与这里描述的类似的案例 动态更改RESTEasy服务返回类型 https stackoverflow com questions 3786781 dynamically change resteasy service return
  • Ruby on Rails REST 设计问题 - 在账户之间转账

    我有一个 Account 类 想要实现转账屏幕以允许用户在 2 个账户之间转账 我将如何实现这种 RESTful 方式 我有标准帐户和休息操作 那很好 但我该如何实现转移呢 通常我只会向帐户控制器和相应的视图添加一个名为 transfer
  • 具有不同数量查询参数的两种 GET 方法:REST

    我有一个 Rest 端点类 如下所示 Path sports public interface SportsEndpoint GET List
  • 如何使用 Chai Http 发布对象数组

    我正在尝试发布一个对象数组ChaiHttp https github com chaijs chai http像这样 agent post route to api send locations lat lat1 lon lon1 lat
  • 使用嵌套的 hashmap 参数发送 volley 请求

    我正在使用 android volley 框架向我的服务器发送 jsonobject 请求 get 请求工作正常 现在我想发送一个带有请求参数的 post 请求 该请求参数是嵌套的 hashmap 我重写 getparams 方法 但它期望

随机推荐

  • 需要一种方法在 Python 中加载嵌入的、转义的 JSON 字符串[重复]

    这个问题在这里已经有答案了 我必须解析以下 JSON 字符串 JobDescription project 1322 vault qa 122 如果我尝试使用 json loads 我会得到以下信息 gt gt gt import json
  • 打印 syms / matlabFunction 慢

    我在尝试使符号替换速度更快时遇到了很多麻烦 也就是说 替换符号表达式中的变量并得到双精度值 我正在创建一个复杂的函数 f 并计算它的雅可比 df 这以合理的速度进行 我可以将其保存到文件中 但是 当我尝试使用 matlabFunction
  • 创建一个突出显示当前选项卡的 php 菜单

    所以我在 php 文件中有一个菜单 如下所示 这是整个文件 我对 PHP 完全陌生 菜单 php li a href span Home span a li li a href http blog me net span Blog span
  • 与 for 循环一起使用的 String join() 方法

    我需要你的帮助 因为我不明白为什么可以使用join 方法与for循环作为参数 Ex join str x for x in list Python 文档 str join iterable 返回一个字符串 它是可迭代中字符串的串联 A Ty
  • 使用 ProcessBuilder 运行 .java 文件

    我是一名在 Windows XP 上的 Eclipse 中工作的新手程序员 我需要运行多个进程 这将是多计算机系统的模拟 我最初的破解对多个类使用了多个线程 但现在我尝试用进程替换线程 从我的阅读中 我发现 ProcessBuilder 是
  • 内容可编辑光标位置

    我有一个内容可编辑的 div 我希望单击编辑按钮 光标出现在 div 的开头 在它出现在末尾的那一刻 li style display list item class menu item div class Dior div li
  • 如何获取任何文件/文件夹的系统图标

    如何检索与文件 文件夹关联的系统图标 以便 我可以在文件 文件夹名称旁边的列表视图中显示它吗 你需要使用Icon ExtractAssociatedIcon Icon icon Icon ExtractAssociatedIcon file
  • 使用 setInterval() 进行简单的连续轮询

    对于需要按设定的时间间隔刷新向用户呈现的部分数据的简单 Web 应用程序 仅使用是否有任何缺点setInterval 从端点获取 JSON 而不是使用适当的轮询框架 举个例子 假设我每 5 秒刷新一次处理作业的状态 从我的评论来看 I wo
  • Windows Phone-首次如何设置LocalSettings?

    在桌面应用程序或 Web 项目项目中 有 App configs 和 Web configs 文件用于存储设置 这些设置是在开发时 或以后的任何时候 设置的 但如果发生这种情况 则始终是一次操作 在 Windows Phone 8 1 XA
  • 如何将 Azure 移动应用服务与现有 SQL 数据库结合使用

    我已经阅读了许多演示如何使用 Azure 移动服务的文章和教程 但我对很多事情还不清楚 我有一个使用 Azure SQL 数据库并通过 Azure 发布的现有 Web 应用程序 我正在尝试将已经创建的数据库集成到我正在开发的 Xamarin
  • 有人写过线程安全的 BindingList 吗?

    目前 我在多个线程上修改 IBindingList 时遇到异常 在我编写自己的版本之前 有人有线程安全版本吗 我想你会发现这是一项极其困难的任务 更简单的方法是通过以下方式防止多线程访问lock void AddItemToList obj
  • 使用 POST 方法将文件上传到 file.io

    我在 SO 找到了一个链接 可能会对这个查询产生影响在 VBA 中将图片上传到 file io HTTP Post 此链接中的代码 Sub UploadFilesUsingVBAORIGINAL this proc will upload
  • 使用 paypal 详细信息付款,无需重定向到 paypal 网站

    我可以使用 paypal ID 和密码通过 paypal 详细信息进行付款 而不重定向到 paypal 网站吗 我想在不离开我的网站的情况下完成所有付款流程 谢谢 您可以通过使用PayFlow但重定向到 PayPal 的目的是确保付款安全
  • 从我的 iOS 应用程序将照片分享到 Instagram [重复]

    这个问题在这里已经有答案了 我一直在寻找一种从我正在开发的 iOS 应用程序将照片发布到 Instagram 的方法 但看到一些链接 他们似乎不支持使用 API 进行写入访问 所以 是否可以通过某些 API 或 Instagram API
  • Flexbox:每行 4 个项目

    我使用弹性框来显示 8 个项目 这些项目将随我的页面动态调整大小 如何强制它将项目分成两行 每行 4 个 这是一个相关的片段 或者如果你更喜欢 jsfiddle http jsfiddle net vivmaha oq6prk1p 2 pa
  • 核心数据和线程

    我正在开发一个使用核心数据的应用程序 我知道这不是线程安全的 但很难理解如何正确管理它 让我解释一下我到目前为止所拥有的 我创建了一个单例来启动托管对象 然后可供所有其他类使用 这似乎工作正常 因为所有类都收到相同的托管对象地址 然后我有两
  • JspWriter 类型中的方法 print(boolean) 不适用于参数 (void)

    您好 我在 GAE 中的 JSP 代码中遇到了名为 JspWriter 类型中的方法 print boolean 不适用于参数 void 的错误 排队 这是代码
  • 无法使用 Xib 将 UIView 类型的值转换为 [CustomView]

    我见过很多类似的问题 但很多都不是最新的 而且没有一个能解决我的问题 我有一个定制的 Xib 和课程 CardView 当我尝试在代码中实例化它时 我得到Could not cast value of type UIView to Card
  • Python:如何使用Python单击网页中的按钮? [关闭]

    Closed 这个问题需要多问focused 目前不接受答案 下面您可以看到对照组的屏幕截图 如何使用 python 单击该区域 要使用 python 单击此区域 您需要使用 Selenium 的 Python 绑定 接下来使用安装它的网址
  • 计算 oauth 签名

    我正在尝试一些具体的事情 即尝试调用 REST API 我一直在关注这些指示 我非常小心地确保正确创建 签名基本字符串 他们定义它是这样创建的 HTTP方法 请求URL 标准化参数 您可以仔细检查我的代码中是否需要 但我非常确定它没问题 我