0

そのため、ノード 0.8.20 でアプリを開発し、Google 認証にパスポートを使用していました。

ノードを最新バージョン 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'

パスポートとパスポート-Googleモジュールの最新バージョンに更新しましたが、役に立たないようです。

また、これに関してパスポートコミュニティで提起された問題はありません。だから私はそれが私のコードに関係していると思います。

更新: このエラーはノード 0.10 に固有のものではないようです。0.9から存在します。推奨される回避策は、Google OAuth に移行することです。まだ解決策はありません

どんな助けでも素晴らしいでしょう。

4

2 に答える 2

3

ノードの crypto モジュールは、バージョン 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));
       }
于 2013-04-11T22:16:47.900 に答える
1

沖、それでこのエラーは修正されたようです。しかし、passport-googleモジュールの下にある既存のコードで動作する回避策を見つけました

https://github.com/jaredhanson/passport-google-oauth/tree/master/examples/oauth2

パスポートgithubで問題が発生しました。しかし、彼らは修正ではなく回避策を指摘することをやめました

于 2013-03-14T12:28:25.870 に答える