如何在Dart中制作OAuth nonce

时间:2014-07-14 13:16:07

标签: twitter oauth dart

现在,我在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

3 个答案:

答案 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);