JavaScript同步性:结合onAuthRequired Listener和原生按摩

时间:2017-11-30 00:51:30

标签: javascript selenium google-chrome-extension chrome-native-messaging

我有problem ...而且我一直在尝试将一个用户名和密码对传递给我的扩展程序的background.js。过程如下:

  1. 凭据加密凭据令牌启动凭据服务器(CS)
  2. Selenium使用自定义扩展程序打开浏览器
  3. 在onAuthRequired
  4. 上触发扩展程序
  5. 本机消息传递主机(NMH)启动然后收到“就绪”消息
  6. NMH使用简单协议从CS
  7. 请求令牌
  8. NMH解密令牌
  9. NMH将凭据传递给background.js
  10. background.js将凭据返回给chrome
  11. 远程服务器上发生身份验证魔术
  12. 我已经解决了所有问题,直到6 ...也许7.问题是我无法真正捕获NMH发送的内容。 似乎凭证格式不正确,因此它们被拒绝或者JavaScript方面的组合方式存在问题,所以这只是代码损坏的情况。 也有可能我想要的根本不可能......虽然我怀疑是这种情况。

    我将提供尽可能多的代码......虽然我感谢任何帮助,但我很高兴得到一个可以在我自己的时间内修改的通用示例。

    有更好的方法吗?我全都耳朵!很高兴创建一个新问题来解决其他想法。

    编辑1.0: 我应该补充一点,当运行时,第9行的警报会弹出。 修改后阅读:

    window.alert(String(response));

    我得到[object Object]

    编辑2.0: 我将window.alert(String(response));更改为window.alert(JSON.stringify(response));,并产生了预期结果:{"username":"\"some_user\"","password":"\"1Password\"} 我希望这会转换为'{username:“some_user”,密码:“1Password”}'

    在我尝试访问回调之外的信用卡的用户名/密码属性时,由于NMH无法运行,因此似乎存在将响应值传递给creds的问题。 这可能是范围问题......

    编辑3.0: 我发现了这个问题 - 这是一个同步问题。 我发现了很多这方面的问题 - 当我想出一个自己的工作时,我会回答这个问题。如果您有解决方案,请随意回答。

    当前background.js(不工作)

    chrome.webRequest.onAuthRequired.addListener(() => {
     var hostName = "aardvark_nm_host";
     var creds = null;
    
     chrome.runtime.sendNativeMessage(
       hostName,
       { text: "Ready" },
       function(response){
         window.alert("response");
         console.log(response);
         creds = JSON.parse(response);
       }
     );
     return {authCredentials: creds};
    },
     {urls: ["<all_urls>"]},
     ['blocking']
    );

    当前aardvark_nm_host.py(可能正常工作)

    #!/usr/bin/env python
    
    from locksmith import decrypt_token, KEYFILE
    import socket
    import struct
    import sys
    import json
    
    PORT = 9999
    ADDR = 'localhost'
    
    ERRMSG = {"username":"ERROR", "password":"password"}
    
    def report_string(string):
      def transceive(signal):
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        server = (ADDR, PORT)
        sock.connect(server)
    
        try:
          sock.sendall(signal)
        except Exception as e:
          print >>sys.stderr, e
          sock.close()
        try:
          sock.sendall(string)
          sock.close()
        except Exception as e:
          print >>sys.stderr, e
          sock.close()
    
      transceive('S')
    
    def get_tokens():
      def recv_burst(sock):
        total_data = []
        while True:
          data = sock.recv(1024)
          if not data:
            break
          total_data.append(data)
        return ''.join(total_data)
    
      def transceive(signal):
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        server = (ADDR, PORT)
        sock.connect(server)
    
        try:
          sock.sendall(signal)
          message = recv_burst(sock)
    
        except Exception as e:
          report_string(e)
    
        finally:
          sock.close()
          
        return message
    
      try:
        username = transceive('U')
        username = decrypt_token(username)
        report_string(username)
      except Exception as e:
        report_string(str(e))
        username = "TOKEN_ERROR"
      try:
        password = transceive('P')
        password = decrypt_token(password)
        report_string(password)
      except Exception as e:
        report_string(str(e))
        password = "TOKEN_ERROR"
    
      return {"username":username, "password":password}
    
    def read_message():
      text_length = sys.stdin.read(4)
      if len(text_length) == 0:
        sys.exit(0)
    
      text_length = struct.unpack('@I', text_length)[0]
      text = sys.stdin.read(text_length)
      return json.loads(text)
      
    def encode_message(message):
      encoded_content = json.dumps(message)
      encoded_length = struct.pack('@I', len(encoded_content))
      return {'length': encoded_length, 'content': encoded_content}
      
    def send_message(encoded_message):
      sys.stdout.write(encoded_message['length'])
      sys.stdout.write(encoded_message['content'])
      sys.stdout.flush()
    
    def interpretation(message):
      return message["text"] == "Ready"
    
    while True:
      received_message = read_message()
      report_string(received_message)
    
      if interpretation(received_message):
        creds = get_tokens()
        send_message(encode_message(creds))
        creds = None
      else:
        send_message(encode_message(ERRMSG))

    当前扩展名manifest.json

    {
        "version": "1.0.0",
        "manifest_version": 2,
        "name": "authvark",
        "permissions": [
            "<all_urls>",
            "webRequest",
            "webRequestBlocking",
            "nativeMessaging"
        ],
        "background": {
            "scripts": ["background.js"],
            "persistent": false
        }
    }

    本机消息的主机/的manifest.json

    {
      "name": "aardvark_nm_host",
      "description": "Intermediary Credential Host",
      "path": "/path/to/aardvark_nm_host.py",
      "type": "stdio",
      "allowed_origins": [
        "chrome-extension://.../"
      ]
    }

1 个答案:

答案 0 :(得分:0)

问题的解决方案是使用回调。

我以为我必须处理Promises,我做了很多工作......但却发现答案要容易得多。

Much easier.