2013-03-14 20 views
0

因此,我一直在節點0.8.20上開發我的應用程序,並一直使用護照進行谷歌身份驗證。在NodeJs更新後charCodeAt出錯

我我的節點更新到最新版本0.10和我得到一個錯誤

_modules\passport-openid\node_modules\openid\lib\convert.js:33 
    if(i.charCodeAt(0) > 127) 
    ^
TypeError: Object n++n++:?n++9rn++??n++n+++ón++1??7q~n++n++qn++v#s?fn++?n++Z.'n+ 
has no method 'charCodeAt' 

我已經更新到護照和護照谷歌模塊的最新版本,它dosent似乎幫助。

此外,護照社區對此沒有提出任何問題。所以我認爲它與我的代碼有關。

更新: 好像好像這個錯誤不是特定於節點0.10。它存在於0.9。建議的解決方法是轉移到google oauth。沒有解決方案

任何幫助將是偉大的。

回答

3

看起來像節點中的加密模塊返回緩衝區對象而不是二進制字符串作爲0.9.0版以來的默認值。

這種差異將解決這個問題:

diff --git node_modules/passport-google/node_modules/passport-openid/node_modules/openid/openid.js node_modules/passport-google/node_modules/passport-openid/node_modules/openid/openid.js 
index 1431dd7..798f741 100644 
--- node_modules/passport-google/node_modules/passport-openid/node_modules/openid/openid.js 
+++ node_modules/passport-google/node_modules/passport-openid/node_modules/openid/openid.js 
@@ -634,9 +634,9 @@ openid.associate = function(provider, callback, strict, algorithm) 
    if(algorithm.indexOf('no-encryption') === -1) 
    { 
    dh = _createDiffieHellmanKeyExchange(algorithm); 
- params['openid.dh_modulus'] = _toBase64(dh.getPrime()); 
- params['openid.dh_gen'] = _toBase64(dh.getGenerator()); 
- params['openid.dh_consumer_public'] = _toBase64(dh.getPublicKey()); 
+ params['openid.dh_modulus'] = _toBase64(dh.getPrime("binary")); 
+ params['openid.dh_gen'] = _toBase64(dh.getGenerator("binary")); 
+ params['openid.dh_consumer_public'] = _toBase64(dh.getPublicKey("binary")); 
    } 

    _post(provider.endpoint, params, function(data, headers, statusCode) 
@@ -713,10 +713,10 @@ openid.associate = function(provider, callback, strict, algorithm) 
     else 
     { 
     var serverPublic = _fromBase64(data.dh_server_public); 
-  var sharedSecret = convert.btwoc(dh.computeSecret(serverPublic)); 
+  var sharedSecret = convert.btwoc(dh.computeSecret(serverPublic, "binary", "binary")); 
     var hash = crypto.createHash(hashAlgorithm); 
     hash.update(sharedSecret); 
-  sharedSecret = hash.digest(); 
+  sharedSecret = hash.digest("binary"); 
     var encMacKey = convert.base64.decode(data.enc_mac_key); 
     secret = convert.base64.encode(_xor(encMacKey, sharedSecret)); 
     } 
+0

爲我工作!謝謝! – drorw 2013-04-14 21:29:14