【问题标题】:JavaScript syncronicity: Combining onAuthRequired Listener and native massagingJavaScript 同步性:结合 onAuthRequired Listener 和原生按摩
【发布时间】:2017-12-04 17:05:00
【问题描述】:

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

  1. 使用加密的凭据令牌启动凭据服务器 (CS)
  2. Selenium 使用自定义扩展打开浏览器
  3. 在AuthRequired 上触发扩展
  4. 本机消息传递主机 (NMH) 启动,然后收到“就绪”消息
  5. NMH 使用简单的协议从 CS 请求令牌
  6. NMH 解密令牌
  7. NMH 将凭据传递给 background.js
  8. background.js 将凭据返回给 chrome
  9. 身份验证魔法发生在远程服务器上

我已经解决了所有问题,最多 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",password:"1Password"}'

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

编辑 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://.../"
  ]
}

【问题讨论】:

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


    【解决方案1】:

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

    我以为我必须处理 Promises,我为此做了很多工作......只是发现有一个更简单的答案。

    Much easier.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-09-22
      • 2018-11-28
      • 2013-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-16
      相关资源
      最近更新 更多