Ошибка при получении токена от удаленного API Philips Hue - PullRequest
0 голосов
/ 25 января 2019

Я следую за удаленными документами API (https://developers.meethue.com/develop/hue-api/remote-authentication/),, но получаю ошибку сервера при запросе токена с помощью дайджест-аутентификации.

Я создаю запрос в python (такжепробовал php и bash):

s1=clientid+":"+realm+":"+secret
s2="POST:/oauth2/token"
hash1 = hashlib.md5(s1).hexdigest()
hash2 = hashlib.md5(s2).hexdigest()
hash  = hashlib.md5(hash1+":"+nonce+":"+hash2).hexdigest()
authheader = 'Digest username='+ clientid +', realm='+ realm +', nonce='+ nonce +', uri=/oauth2/token, response='+ hash
head = {'Authorization': authheader}
req = requests.Request('POST',url,headers=head)

Запрос и ответ, отправленные на meethue.com, следующие:

('nonce=', '35cdbe20fb0456c6802d7537*********')

REQUEST
{
'_body_position': None,
'_cookies': <RequestsCookieJar[]>,
'body': None,
'headers': {'Content-Length': '0', 'Content-Type': 'application/json', 'Authorization': 'Digest username=CGopN1NNypOEaGvjQq*************, [realm=oauth2_client@api.meethue.com](mailto:realm=oauth2_client@api.meethue.com), nonce=35cdbe20fb0456c6802d753**************, uri=/oauth2/token, response=72e926c2392a23492793******************'},
'hooks': { 'response': []},
'method': 'POST',
'url': 'https://api.meethue.com/oauth2/token?code=M8DkG*******&grant_type=authorization_code'
}

RESPONSE
{
'_content': '{"fault":{"faultstring":"invalid_request","detail":{"errorcode":"invalid_request"}}}',
'_content_consumed': True,
'_next': None,
'connection': <requests.adapters.HTTPAdapter object at 0x7f4a50ea5390>,
'cookies': <RequestsCookieJar[]>,
'elapsed': datetime.timedelta(0, 0, 382331),
'encoding': None,
'headers': {'Date': 'Wed, 23 Jan 2019 17:43:09 GMT', 'Content-Length': '84', 'Content-Type': 'application/json', 'Connection': 'keep-alive'},
'history': [],
'raw': <urllib3.response.HTTPResponse object at 0x7f4a4dabced0>,
'reason': 'Internal Server Error',
'request': <PreparedRequest [POST]>,
'status_code': 500,
'url': u'https://api.meethue.com/oauth2/token?code=M8DkGE******&grant_type=authorization_code'
}

Когда я изменяю любые данные (подделка одноразового номера, неверный параметр,неправильные хеши ...) Я получаю 401 несанкционированный или ошибка, показывающая пропущенные данные. Но когда все кажется в порядке, я получил "invalid_request" и не могу продолжить с токеном.

1 Ответ

0 голосов
/ 17 апреля 2019

У меня также была проблема с API Remote Hue.

Я не разработчик Python, но я вижу, что вы ничего не пишите в выходной поток тела. Я знаю - тела нет - но кажется, что без написания пустой строки вы не получите токен. Кажется, они немного обновили свой Rest API.

Что я сделал в своей реализации:

final byte[] postData = "".getBytes(StandardCharsets.UTF_8);
connection.setRequestProperty(HttpHeaders.CONTENT_LENGTH, Integer.toString(postData.length));
connection.setDoOutput(true);
try (DataOutputStream wr = new DataOutputStream(connection.getOutputStream())) {
    wr.write(postData);
} catch (final Exception e) {
    LOG.error(METHOD + " Exception writing to outputstream of HttpConnection");
}

Это решило мою проблему. Одно предложение - в случае, если авторизация не работает, попробуйте базовую версию авторизации (https://developers.meethue.com/develop/hue-api/remote-authentication/)

...