我有problem ...而且我一直在尝试将一个用户名和密码对传递给我的扩展程序的background.js。过程如下:
我已经解决了所有问题,直到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://.../"
]
}