Я пытаюсь реализовать устройства аутентификации U2F в своем приложении django. Основная проблема сейчас в том, что все мои вызовы регистрации переднего плана терпят неудачу.
Для реализации этого я использую скрипт u2f-api.js
и скрипт python-u2flib-server
python.
Я следую этому шаблону:
1) Сгенерируйте ключ/вызов с помощью u2flib
from u2flib_server import u2f
app_id = 'https://127.0.0.1'
reg = u2f.begin_registration(app_id)
print reg
# {'registeredKeys': [],
'registerRequests': [{'challenge': u'pLzGmABMwBzQkco6INeFNuPsAG6KhgfVeYFeV0QBf1g', version': 'U2F_V2'}],
'appId': 'https://127.0.0.1'}
2) Зарегистрируйте ключ из браузера
var reg_data = {'registeredKeys': [], 'registerRequests': [{'challenge': 'pLzGmABMwBzQkco6INeFNuPsAG6KhgfVeYFeV0QBf1g', 'version': 'U2F_V2'}], 'appId': 'https://127.0.0.1'}
u2f.register(reg_data['appId'], reg_data['registerRequests'], [], function(resp) { console.log(resp) });
Это постоянно возвращает ответ {errorCode: 2}
, что по сути означает неверный запрос. Однако я не могу определить, какая часть этого запроса недействительна.
Я использую runserver_plus --cert certname
для запуска своего локального веб-сервера, поэтому сайт обслуживается через HTTPS. Я также пытался использовать NGROK для доступа к моему сайту через HTTPS и пытался использовать тот же код. Постоянно получаю один и тот же ответ.
Я был бы признателен за любую помощь, указатели или рекомендации по моей реализации, поскольку я боролся в течение нескольких дней, а существующая документация по библиотекам и реализациям U2F довольно скудна.
-- Обновлять --
Я на самом деле сделал небольшой прогресс здесь. Я могу получить ответ на генерацию ключа. Однако я все еще не могу зарегистрировать этот ключ в библиотеке python.
В итоге на стороне сервера я получаю что-то вроде этого:
response = {'challenge': 'okGbjnbE2V9cT42X2wm-PA9pm7k3KpTETVEv2SqEUxE', 'registrationData': 'BRS5y7dFXs0O60o2cUFc-SZtKG3jibpFQGuwQDyTQkSWeQUNWn\\u2026bEwIhALYcM1NospvymAbv83lTlpLjaa2ICSFQv-5RYfzkPCc9', 'version': 'U2F_V2', 'clientData': 'eyJjaGFsbGVuZ2UiOiJva0dianBnRTJWOWNUNDJYMndtLVBBOX\\u2026R5cCI6Im5hdmlnYXRvci5pZC5maW5pc2hFbnJvbGxtZW50In0'}
register_request = {'registeredKeys': [], 'registerRequests': [{'challenge': 'okGbjpgE2V9cD32X2wm-PA9pm7k3KpKN5VEv2SqEUxE', 'version': 'U2F_V2'}], 'appId': 'https://127.0.0.1:8000'}
u2f.complete_registration(register_request, response)
Однако это приводит к следующей ошибке:
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/usr/local/lib/python2.7/dist-packages/u2flib_server/u2f.py", line 45, in complete_registration
return U2fRegisterRequest.wrap(request).complete(response, valid_facets)
File "/usr/local/lib/python2.7/dist-packages/u2flib_server/model.py", line 419, in complete
_validate_client_data(resp.clientData, req.challenge, Type.REGISTER,
File "/usr/local/lib/python2.7/dist-packages/u2flib_server/model.py", line 339, in clientData
return ClientData.wrap(self['clientData'])
File "/usr/local/lib/python2.7/dist-packages/u2flib_server/model.py", line 261, in wrap
return data if isinstance(data, cls) else cls(data)
File "/usr/local/lib/python2.7/dist-packages/u2flib_server/model.py", line 328, in __init__
super(ClientData, self).__init__(*args, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/u2flib_server/model.py", line 239, in __init__
kwargs = json.loads(arg.decode('utf-8'))
File "/usr/lib/python2.7/json/__init__.py", line 339, in loads
return _default_decoder.decode(s)
File "/usr/lib/python2.7/json/decoder.py", line 364, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "/usr/lib/python2.7/json/decoder.py", line 382, in raw_decode
raise ValueError("No JSON object could be decoded")
ValueError: No JSON object could be decoded
Я снова застрял! Я пытался создать дамп json из значений, прежде чем передавать их в u2f.register
, но безрезультатно - я получаю ту же ошибку.