现在,我在dart中为twitter制作OAuth程序。
但是,我无法做出oauth_nonce。
首先,我认为这段代码。
String create_nonce(){
var rnd = new Random();
int i = 0;
var number = rnd.nextInt(pow(2,8*4));
List<int> listi = UTF8.encode(number.toString());
String str = "";
while(i < 3){
number = rnd.nextInt(pow(2,8*4));
if(number < pow(2,8*4) - 1){
number = rnd.nextInt(pow(2,8*4));
}
listi = UTF8.encode(number.toString());
str = str + CryptoUtils.bytesToBase64(listi);
i++;
}
return str;
}
但是,此方法无法创建预期的String。
请告诉我如何制作oauth_nonce。
Nonce oauth_nonce参数是应用程序的唯一标记 应为每个唯一请求生成。 Twitter将使用此值 确定请求是否已多次提交。该 此请求的值由base64编码32个字节生成 随机数据,并剥离所有非单词字符,但任何 应该产生相对随机的字母数字字符串的方法 好在这里。
oauth_nonce kYjzVBB8Y0ZFabxSWbWovY3uYSQ2pTgmZeNu2VS4cg
答案 0 :(得分:4)
import 'dart:math' as math;
import 'package:crypto/crypto.dart';
void main() {
math.Random rnd = new math.Random();
List<int> values = new List<int>.generate(32, (i) => rnd.nextInt(256));
print(CryptoUtils.bytesToBase64(values));
}
产生
QqPlpI8BmDk9byWDqJ4tBCMMIWv24v4WL5KZsufnWqQ =
我不确定这究竟意味着什么
并删除所有非单词字符
我找到了https://dev.twitter.com/discussions/12445
你只是想确保你没有发送像“!”这样的字符。 oauth_nonce中的“#”或“$”。你建议的过程听起来很合适。
Base64包含“+”和“/”。您可能需要剥离它们,因为它们是非单词字符。
这应该做到
import 'dart:math' as math;
import 'package:crypto/crypto.dart';
void main() {
math.Random rnd = new math.Random();
List<int> values = new List<int>.generate(32, (i) => rnd.nextInt(256));
print(CryptoUtils.bytesToBase64(values).replaceAll(new RegExp('[=/+]'), ''));
}
在replaceAll
之前和之后
elrA + 4rWr4O3zNv0L57iOLqTQD94abJ23hFoK + hk6QE =
elrA4rWr4O3zNv0L57iOLqTQD94abJ23hFoKhk6QE
答案 1 :(得分:0)
有一个包。它自动生成随机数: https://pub.dev/packages/nonce
答案 2 :(得分:-1)
import 'dart:math' as math;
import 'package:crypto/crypto.dart' as CryptoUtils;
math.Random ran = math.Random();
List<int> vals = List<int>.generate(32, (i) => ran.nextInt(256));
final nonce = CryptoUtils.sha1
.convert(vals)
.toString()
.replaceAll(new RegExp('[=/+]'), '');
print(nonce);