O Google tem o compromisso de promover a igualdade racial para as comunidades negras. Saiba como.

Autenticação e autorização OAuth 2.0

A API Nest usa o protocolo OAuth 2.0 para autenticação e autorização.

Antes que seu produto possa acessar dados privados usando a API Nest, ele deve obter um token de acesso que conceda acesso a essa API. Um único token de acesso pode conceder vários graus de acesso a várias seções da API.

A sequência de autorização começa quando seu produto redireciona um navegador para um URL Nest com parâmetros de consulta que indicam o acesso solicitado. O Nest lida com a autenticação do usuário, seleção de sessão e consentimento do usuário. O resultado é um código de autorização, que seu produto pode trocar por um token de acesso. Seu produto pode então usar o token de acesso para fazer chamadas para a API Nest.

Fluxo OAuth 2.0
Fluxo OAuth 2.0

Configure seu cliente Works with Nest

Para encontrar as credenciais do OAuth 2.0 para seu cliente, verifique a guia Visão geral da página do cliente.

Redirecionar autorização baseada em URI ou PIN?

Ao configurar seu cliente, você é solicitado a inserir um URI de redirecionamento ou deixar os campos de URI de redirecionamento em branco para usar a autorização baseada em PIN.

Se o seu produto for um dispositivo que não possui um aplicativo ou página da web associada (por exemplo, um rastreador de fitness, um aparelho ou um painel de segurança), deixe os campos URI de redirecionamento em branco.

Se o seu produto tiver um componente de navegador, a prática recomendada é incluir um URI de redirecionamento.

Solicitar permissões

A configuração do cliente inclui um conjunto de permissões (também chamado de escopos). Uma permissão é um parâmetro variável que controla o conjunto de recursos e operações que um token de acesso permite. Geralmente, é uma prática recomendada solicitar permissões de forma incremental, no momento em que o acesso é necessário, em vez de no início.

Resultado

Quando você salva a configuração, seu cliente recebe um ID de cliente e um segredo de cliente exclusivos. Além disso, seu cliente recebe um URL de autorização.

A URL de autorização inclui um parâmetro de estado que você pode usar para testar possíveis ataques de falsificação de solicitação entre sites (CSRF). Veja Teste de ataques CSRF .

Detalhes OAuth

Solicite um código de autorização

Depois que seu cliente for configurado, você pode solicitar um código de autorização (às vezes chamado de código PIN). O código de autorização não é o token final que você usa para fazer chamadas para a Nest. Ele é usado na próxima etapa do fluxo do OAuth 2.0 para trocar por um token de acesso real. Esta etapa fornece garantia diretamente da Nest para o usuário de que a permissão está sendo concedida ao produto correto, com o acesso acordado.

A experiência do usuário

Apresentamos uma página Works with Nest que pede ao usuário para conceder acesso ao seu produto. Isso identifica seu produto e descreve as permissões de usuário específicas (escopos) que seu produto solicitou. As palavras na tela vêm da configuração do seu cliente.

Para testar você mesmo, carregue o URL de autorização da Etapa 1 em um navegador. Você deverá ver uma página de solicitação de acesso Works with Nest:

Funciona com o Nest

Vá em frente e clique em [ACEITAR] para ver o que o usuário vê. Ao clicar no botão [ACEITAR], o usuário está aprovando a solicitação do seu produto para acessar seus dados.

Experiência de PIN

Se você deixar os campos Redirect URI em branco na configuração do cliente, o usuário será redirecionado para uma página Nest que exibe um PIN (código de autorização). A IU do dispositivo deve então solicitar que o usuário insira o PIN manualmente.

Pincode

Experiência de redirecionamento de URI

Se você incluir um URI de redirecionamento na configuração do cliente, o usuário será redirecionado para uma página em sua nuvem (ou localhost) e o Nest enviará automaticamente o código de autorização para o dispositivo do usuário.

Teste para ataques CSRF

Antes de aceitar o código de autorização, seu produto deve garantir que o valor retornado no parâmetro de estado corresponda ao valor de estado de sua solicitação de autorização original. Isso garante que você esteja lidando com o usuário real e não com um script malicioso. Se os valores de estado não corresponderem, você deve lançar um código de erro HTTP não autorizado 401 em resposta.

Um ataque CSRF é um ataque que força um usuário final a executar ações indesejadas em um aplicativo da web no qual ele está autenticado no momento.

Ataque CSRF
Ataque CSRF

Para ajudar a ataques prevent CSRF, recomendamos que você sempre enviar uma nonguessable state quando solicitando autorização.

Dessa forma, sua integração com o Works with Nest pode verificar se os códigos de acesso obtidos na nuvem Nest são uma resposta a solicitações feitas por seu produto, e não por algum outro produto.

Exemplo:

Digamos que na configuração do seu cliente você especifique o URI de redirecionamento:

http://localhost:5000/callback

Vamos também dizer que seu cliente envia o 7tvPJiv8StrAqo9IQE9xsJaDso4 Estado na URL de autorização:

https://home.nest.com/login/oauth2?client_id=CLIENT_ID&state=7tvPJiv8StrAqo9IQE9xsJaDso4

O usuário concorda com a solicitação.

A nuvem Nest retorna o parâmetro de estado como parte do URI de redirecionamento:

127.0.0.1 - - [02/Jun/2017 13:18:58] "GET /callback?state=7tvPJiv8StrAqo9IQE9xsJaDso4&code=5N4CFK8E8TCFW7PM HTTP/1.1" 302 -
127.0.0.1 - - [02/Jun/2017 13:18:58] "GET / HTTP/1.1" 200 -

Seu produto recebe esse valor de estado e deve ser programado para aceitar apenas redirecionamentos com um estado verificável.

Existem várias maneiras de gerar um parâmetro de estado não adivinhado. Você pode fornecer valores de estado aleatórios de um dicionário mantido na memória ou um valor recomputável. Você pode usar uma chave privada com algumas variáveis ​​facilmente verificáveis ​​- por exemplo, o ID do cliente e um cookie de sessão - para calcular um valor hash. Isso resulta em um valor de byte difícil de adivinhar sem a chave privada. Outra sugestão é fazer um hash da data e hora atuais. Com essa abordagem, seu aplicativo deve economizar o tempo de transmissão para verificá-lo ou permitir um período variável de validade (por exemplo, usando o algoritmo de senha única baseada em tempo [TOTP]).

Depois de calcular o código de autenticação de mensagem hash com chave (HMAC), codifique-o na base 64 e o transmita para a nuvem Nest como um parâmetro de estado.

Aqui está um exemplo Python que usa datetime :

import base64
import datetime
import hmac
import hashlib

def generate_state_parameter(client_id, private_key):
    date = datetime.datetime.today()
    raw_state = str(date) + client_id
    hashed = hmac.new(private_key, raw_state, hashlib.sha1)
    state = base64.b64encode(hashed.digest())
    return (state, date)

Mensagens de erro de código de autorização

Se a solicitação do código de autorização falhar, os usuários verão uma mensagem de erro. Para mais informações sobre essas mensagens e como evitá-los, consulte a Referência de Autorização .

Código de autorização de troca por um token de acesso

A etapa final para obter um token de acesso é seu produto solicitar um usando o código de autorização que acabou de adquirir. Isso é feito fazendo uma solicitação HTTP POST "x-www-form-urlencoded".

Inclua os parâmetros abaixo na solicitação. Todos os quatro parâmetros são obrigatórios.

Parâmetro Descrição
ID do Cliente O ID do cliente na etapa 1
client_secret O segredo do cliente na etapa 1
código O código de autorização recebido na Etapa 2
grant_type O valor deste campo deve ser sempre: authorization_code

Antes de cada chamada POST, obtenha um novo código de autorização. Para fazer isso, recarregue seu URL de autorização. Em seguida, altere o POST code parâmetro para incluir o novo código de autorização.

Exemplos de código (autenticação)

Veja exemplos em vários idiomas .

Exemplo de carteiro (auth)

O Postman oferece uma maneira fácil de testar solicitações OAuth.

Na guia cabeçalhos, certifique-Content-Type = application/x-www-form-urlencoded .

Cabeçalho POST para obter token de acesso

Na guia Corpo, incluem a seguinte chave: valor pares.

Corpo POST para obter token de acesso

Resposta de token de acesso

Uma solicitação bem-sucedida retorna um objeto JSON contendo os seguintes campos:

  • access_token - O token de acesso para o usuário. Este valor deve ser mantido seguro.
  • expires_in - O número de segundos restantes, a partir do momento em que foi solicitada, antes de o token expirar.

Mensagens de erro de token de acesso

Se a solicitação falhar, você receberá um erro na forma de um Código de status HTTP. Para mais informações sobre esses erros e como evitá-los, consulte a Referência de Autorização .

Faça solicitações autenticadas

Depois que um produto obtém um token de acesso, ele envia o token para uma API Nest em um cabeçalho de autorização HTTP. É possível enviar tokens como parâmetros de string de consulta de URI, mas não recomendamos, porque os parâmetros de URI podem acabar em arquivos de log que não são completamente seguros.

Os tokens de acesso são válidos apenas para o conjunto de operações e recursos descritos no escopo da solicitação de token. Por exemplo, se um token de acesso for emitido para a API Nest Thermostat, ele não concederá acesso à API Nest Camera.

Exemplos de código (leitura / gravação)

Exemplo de carteiro (leitura / escrita)

Postman fornece uma maneira fácil de chamadas de teste API usando Content-Type = application/json .

GET para ler os dados

Tokens inválidos

Se você fizer uma chamada de API usando um token inválido, receberá uma resposta 401 Não Autorizada do servidor. Um token pode ser inválido e precisar de regeneração porque:

  • Expirou
  • O usuário revogou a permissão concedida inicialmente ao seu produto

É importante que você codifique seu produto para lidar adequadamente com um erro 401 não autorizado, redirecionando o usuário de volta ao início do fluxo de trabalho de autorização.

Funciona com conexão Nest fechada

Se um usuário remove um Works com conexão Nest , seu produto recebe um auth_revoked evento e as fecha a conexão.