- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在编写一个简单的 Twitter 登录并尝试获取请求 token 以将用户重定向到访问 token ,但我总是以无法验证您
错误结束我试图将签名添加为最后一个 header ,但它也不起作用。当我删除一些 header 时,我得到了错误的身份验证数据错误,因此使用此配置我假设一切正常我只是无法弄清楚我做错了什么并且 Twitter 拒绝发回请求 token 。
这是我的代码
'use strict';
const https = require("https");
const cfg = require('./config');
// const cfg=require(`${__dirname}/config`);
const qs = require("querystring");
const esc = qs.escape;
const crypto = require('crypto');
const HMAC = crypto.createHmac;
class twitter {
constructor(o) {
// if (!o || !o.consumer_key || !o.consumer_secret) throw new Error("Missing Paramaters");
this.id = o.consumer_key;
this.secret = o.consumer_secret;
}
getNonce() {
let num = 32;
let preDefined = Date.now().toString().split("");
num -= preDefined.length;
while (num--) {
preDefined.push(Math.round(Math.random() * 31).toString(32));
}
return (new Buffer(preDefined.join("")).toString("base64"));
}
getSignature(HTTPmethod, url, parameters, tokenSecret) {
const method = HTTPmethod.toUpperCase();
const baseUrl = url;
const params = parameters;
const sorted = Object.keys(params).sort();
let baseString = `${esc(method)}&${esc(baseUrl)}`;
let signingKey = `${esc(this.secret)}&`
signingKey += tokenSecret ? esc(tokenSecret) : "";
let firstRun = true;
sorted.forEach(param => {
if (firstRun) {
baseString += "&";
firstRun = false;
}
else {
baseString += esc("&");
}
baseString += esc(`${param}=${params[param]}`);
});
return HMAC('SHA1', signingKey).update(baseString).digest('base64');
// return baseString;
}
getHeaders(httpMethod, baseUrl, additional, token, tokenSecret, extraHeaders) {
let headers = {
oauth_consumer_key: this.id,
oauth_nonce: this.getNonce(),
oauth_signature_method: "HMAC-SHA1",
oauth_timestamp: Math.floor(Date.now() / 1000),
oauth_version: "1.0"
}
if (extraHeaders) {
for (let i in extraHeaders) {
headers[i] = extraHeaders[i];
}
}
if (token) headers.oauth_token = token;
let params = headers;
if (additional) {
for (let i in additional) {
params[i] = additional[i];
}
}
// const signature = this.getSignature(httpMethod, baseUrl, params, tokenSecret || "");
headers.oauth_signature = this.getSignature(httpMethod, baseUrl, params, tokenSecret || "");
let header = `OAuth `;
let firstRun = true;
const sorted = Object.keys(headers).sort();
sorted.forEach(i => {
let prefix;
if (firstRun) {
prefix = "";
firstRun = false;
}
else {
prefix = ", ";
}
header += `${prefix}${esc(i)}="${esc(headers[i])}"`
});
// header += `, oauth_signature="${esc(signature)}"`;
return header;
}
getRequestToken(cb) {
if (!cb) throw new Error('callback must be defined');
const callbackUrl = cb;
let headers = this.getHeaders("POST", "https://api.twitter.com/oauth/request_token", false, false, false, {
oauth_callback: callbackUrl
});
const reqParams = {
method: "POST",
host: "api.twitter.com",
path: "/oauth/request_token",
headers: { "Authorization": headers }
}
const req = https.request(reqParams, res => {
let data = "";
res.on("data", d => data += d);
res.on("end", _ => console.log(data));
}); req.end();
console.log(req._headers);
}
}
(new twitter({
consumer_key: cfg.id,
consumer_secret: cfg.secret
})).getRequestToken("https://127.0.0.1/twitter");
最佳答案
关键是双重转义基本字符串参数
关于node.js - twitter request_token 端点总是返回 "couldn' t 验证你”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36658149/
这里的 IT 网络/编程学生试图完成一项作业,但我遇到了障碍。我们的任务是读取文本文件,将单词放入 ArrayList 中,并对内容执行字符串操作。我能够将单词拉入 ArrayList、按升序对内容进
编辑:我收到以下错误代码: Error adding accessory The operation couldn’t be completed. (HMErrorDomain error 2.) 和
您好,我正在尝试测试套接字激活机制,但无法连接到服务器。 curl --unix-socket/run/gunicorn.sock本地主机 curl: (7) Couldn't connect to
所以我安装了sandbox (运行 centOS)来自 hortonworks在 virtualBox带网络配置>>> bridged network我编辑了bashrc导出http_proxy和 h
我目前正在开发一个android应用程序,提交一个post请求并处理相应的响应。 我能够将发布请求发送到相应的 URL,但是当我尝试检索响应时,我得到了一半的 HTML 内容,然后是“*无法从 STD
我在将 ServiceLoader 集成到我的 Android 应用程序以集成插件系统时遇到问题。 public class StrategieClassLoader extends URLClass
我有一个类似于以下的自定义数据类型: data Token = Number Int | Otherthings 我希望能够以一种方式使用“数字”,以另一种方式使用其他东西。所以
当我尝试从 Visual Studio Code 运行一个简单的 React Native 应用程序时,我收到以下错误消息。 Scanning folders for symlinks in C:\P
我最近从Java搬到了Kotlin。将整个项目转换为Kotlin,将pom.xml转换为build.gradle。我正在使用Kotlin,Gradle,Cucumber Sernity,Appium构
我在执行docker-compose命令时遇到Powershell中的错误: 尽管从Docker Quickstart Terminal运行相同的命令可以正常工作: 最佳答案 确保首先在Powersh
当我运行docker build时,我得到了: Sending build context to Docker daemon 10.24kB WARN[11935] Couldn't run aup
我在运行 SDL 程序时遇到此错误。它编译得很好,但是窗口打开了一小会儿然后就关闭了。 这是我的代码: //Using SDL and standard IO #include #include
我正在编写一个基于 Google map 的 Android 应用程序。应用程序本身运行良好,没有任何问题。我可以看到 map ,缩放到我的当前位置等等。根据 AndroidManifest.xml,
我在实际设备上仅在生产和开发容器上都遇到了这个错误。模拟器能够很好地获取记录。这发生在通过 XCode 运行的开发构建、TestFlight 构建和 AppStore 上的实时生产构建上。 所有设备
我正在创建一个模板化的快速排序函数,它应该允许我使用迭代器对一个定制的双向链表类进行快速排序。我遇到了错误 In file included from main.cpp:21.0: quicksort
我有一个模板类和一个具有模板返回类型的函数: template class Wrapper { public: Wrapper(const T& _data) : data(_data) {
将 Jersey 从 1.15 版升级到 1.17 版后,它开始记录以下消息: Apr 2, 2013 5:13:06 PM com.sun.jersey.server.wadl.generators
关闭。这个问题是not reproducible or was caused by typos .它目前不接受答案。 这个问题是由于错别字或无法再重现的问题引起的。虽然类似的问题可能是on-topi
我有一个 android 应用程序在我将设备更新到 android 4.4 (kitkat) 之前一直运行没有问题。 现在我开始收到这个错误,并且程序的某些部分在日志 cat_ 中被破坏了_ Andr
我通过 git clone 成功安装了 Directus CMS。在数据库中创建了 15 个表。在/config 文件夹中,我的 projectkey.php 文件也已创建。安装后我想使用我的凭据登录
我是一名优秀的程序员,十分优秀!