【发布时间】:2017-12-04 17:05:00
【问题描述】:
我有这个problem ...并且我一直在尝试将用户名和密码对传递给我的扩展程序的 background.js。流程如下:
- 使用加密的凭据令牌启动凭据服务器 (CS)
- Selenium 使用自定义扩展打开浏览器
- 在AuthRequired 上触发扩展
- 本机消息传递主机 (NMH) 启动,然后收到“就绪”消息
- NMH 使用简单的协议从 CS 请求令牌
- NMH 解密令牌
- NMH 将凭据传递给 background.js
- background.js 将凭据返回给 chrome
- 身份验证魔法发生在远程服务器上
我已经解决了所有问题,最多 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