Introducción a OAuth con Node.js:OAuth 1.0 (una pierna)

Este texto es parte de Introducción a OAuth con Node.js mini-libro que está disponible en gum.co/hRyc.

Introducción a OAuth con Node.js:Twitter API OAuth 1.0, OAuth 2.0, OAuth Echo, Everyauth y OAuth 2.0 Server Examples

Comencemos con el viejo OAuth 1.0. La forma en que suele funcionar es la siguiente:

  1. Por primera vez, cuando autorizamos a un usuario a usar nuestra aplicación, debemos realizar un trabajo adicional y obtener un token de acceso y un secreto (de tres patas).
  2. Usted almacena estos valores para cada usuario en su aplicación.
  3. Luego, en solicitudes posteriores, las cosas se vuelven mucho más simples. Construimos encabezados de autenticación y hacemos solicitudes HTTP (de una sola pierna).

En este capítulo, se tratarán solo las solicitudes posteriores de un solo paso, como se muestra en la Figura 1–1, mientras que el enfoque anterior de tres pasos se cubrirá en el capítulo Everyauth, es decir, la construcción de lo simple a lo más complejo.

Figura 1–1:Esquema OAuth 1.0A (de una sola pierna)

Twitter proporciona herramientas OAuth para generar tokens y secretos para sus propias aplicaciones. Esto es lo que usaremos para las solicitudes. Necesitará cuatro valores para realizar una solicitud de OAuth 1.0 a la API de Twitter v1.1 o a cualquier otro servicio que utilice OAuth 1.0:

  1. Clave de aplicación, también conocida como clave de consumidor
  2. Clave secreta de la aplicación
  3. Token de usuario para esta aplicación
  4. Secreto de usuario para esta aplicación

Los cuatro se pueden obtener para sus propias aplicaciones en dev.twitter.com, como se muestra en la Figura 1–2.

Figura 1–2:página de inicio de dev.twitter.com

Solo para reiterar, en caso de que usted no sea el usuario (que es el caso de uso más común), deberá realizar un OAuth de tres patas / Iniciar sesión con Twitter, o algo más. El resultado de Iniciar sesión con Twitter es la respuesta con el token y el secreto del usuario, que se puede almacenar en la base de datos de la aplicación para su uso posterior. Para obtener más información, siga los ejemplos del capítulo Everyauth.

Volviendo a la obtención de las claves, haz clic en “Iniciar sesión” ubicado en la esquina superior derecha y verás una lista de tus aplicaciones de Twitter, si tienes alguna. Tus propias aplicaciones se refiere a las aplicaciones que ha creado utilizando su cuenta de Twitter. Por ejemplo, hay tres aplicaciones que se muestran en la Figura 1–3.

Figura 1–3:aplicaciones API de Twitter

Por el bien de este ejercicio, es más fácil simplemente crear una nueva aplicación y obtener tokens y secretos para ella. Haga clic en Crear nueva aplicación de la captura de pantalla de la Figura 1–3 y lo llevará a la página Crear una aplicación , como se muestra en la Figura 1–4.

Complete los valores para Nombre, Descripción, Sitio web y URL de devolución de llamada (no importa cuál sea, siempre que comience con http://) ). El valor de devolución de llamada puede ser cualquier cosa, pero si está vacío, la aplicación de Twitter se bloqueará en el modo OOB, lo que nos impedirá probar el inicio de sesión de OAuth más tarde (verá Desktop applications only support the OAuth_callback value 'oob' error). Por este motivo, coloque cualquier URL en el campo de devolución de llamada, por ejemplo, http://webapplog.com .

Figura 1–4:Crear una aplicación de Twitter

Una vez creada la aplicación, vaya a Permiso y cambie el permiso a Leer, escribir y acceder a mensajes directos . Esto dará como resultado un nuevo valor para el Nivel de acceso campo de las Claves API pestaña, como se muestra en la Figura 1–5. Desde la misma pestaña, haga clic en el botón Crear mi token de acceso . Una vez finalizada la generación, los resultados estarán en Su token de acceso sección, como se muestra en la figura 1-5. Tenga en cuenta que sus teclas diferirán de la ilustración.

Figura 1–5:Token de acceso y secreto para su propia aplicación

Después de generar los valores (puede llevar algo de tiempo), copie y almacene estos valores:

  1. Clave de API:twitterKey en el script de Node.js
  2. Secreto de API:twitterSecret en el script de Node.js
  3. Token de acceso:token en el script de Node.js
  4. Secreto del token de acceso:secret en el script de Node.js

Hay muchos módulos OAuth de Node.js e incluso SDK de Twitter de Node.js (envolturas para la API de Twitter). Sin embargo, para comprender los aspectos básicos de la realización de solicitudes de OAuth, utilizaremos el módulo más minimalista, oauth. . Este módulo nos ayudará a construir encabezados de autenticación para solicitudes HTTP sin la necesidad de comprender todas las complejidades requeridas para construir los encabezados.

Para autorizar una solicitud, debe tener ciertos parámetros en su Authorization encabezado (docs), por ejemplo:

OAuth oauth_consumer_key="xvz1evFS4wEEPTGEFPHBog", oauth_nonce="kYjzVBB8Y0ZFabxSWbWovY3uYSQ2pTgmZeNu2VS4cg", oauth_signature="tnnArxj06cWHq44gCs1OSKk%2FjLY%3D", oauth_signature_method="HMAC-SHA1", oauth_timestamp="1318622958", oauth_token="370773112-GmHxMAgYyLbNEtIKZeRNFsMKPR9EyMZeS9weJAEb", oauth_version="1.0"

Echemos un breve vistazo a cada uno de estos parámetros:

[Nota al margen]

Leer publicaciones de blog es bueno, pero ver cursos en video es aún mejor porque son más atractivos.

Muchos desarrolladores se quejaron de la falta de material de video de calidad asequible en Node. Es una distracción ver videos de YouTube y una locura pagar $ 500 por un curso de video de Node.

Visite Node University, que tiene cursos de video GRATUITOS en Node:node.university.

[Fin de la nota al margen]

  • oauth_consumer_key :es lo mismo que la clave de la aplicación o la clave del consumidor de Twitter, es decir, el identificador único de su aplicación
  • oauth_nonce :un identificador único de su solicitud, generalmente construido con algún parámetro aleatorio y algoritmo hash
  • oauth_timestamp :tiempo actual en segundos, desde la época de Unix
  • oauth_version :siempre debe ser 1.0 para OAuth 1.0
  • oauth_signature_method :debe ser HMAC-SHA1
  • oauth_signature :una combinación hash de todos los demás parámetros

La generación exacta de estos parámetros está fuera del alcance de este libro introductorio. Afortunadamente, hay muchos módulos que pueden hacer este trabajo preliminar por nosotros, es decir, oauth .

Para instalar el oauth módulo, puede usar:

$ npm install [email protected]

En el oauth1/index.js archivo, definimos las variables para la clave, el token y los secretos. Reemplazar los marcadores de posición de cadena con tus valores:

var twitterKey = 'your Twitter application consumer key',
  twitterSecret = 'your Twitter application secret',
  token = 'your user token for this app',
  secret = 'your user secret for this app';

El siguiente es simplemente un ejemplo de cómo se ven los formatos clave. Utilice los suyos propios, ya que estos valores se invalidarán:

twitterKey = 'A3UP583JRnLWuAdeMUBJjzOn2';
twitterSecret = 'tQEu1d0cMU43hk2hk5J77UhIweJ7z4oEPVl6OhxbMRONtLMLMG';
token = '575632191-r98rIwyKnAxTHFt86bKX5ZaFeYRzmfOF5JbaPyPI';
secret = 'eryuMTstgYrcerrL43XwVX1EAOJMTdQxvGKHu5UUSiBY7';

Volviendo a nuestro archivo (oauth1/index.js ), importamos el OAuth class y cree un objeto para OAuth 1.0 donde los parámetros son puntos finales, clave y secreto de la API de Twitter; versión (1.0A); y método de cifrado (HMAC-SHA1):

var OAuth = require('OAuth');
var oauth = new OAuth.OAuth(
  'https://api.twitter.com/oauth/request_token',
  'https://api.twitter.com/oauth/access_token',
  twitterKey,
  twitterSecret,
  '1.0A',
  null,
  'HMAC-SHA1'
);

Después de crear el oauth objeto usando los parámetros, podemos llamar a aouth.get() para obtener un recurso seguro. La función acepta la URL, el token de usuario, el secreto de usuario (no confunda este secreto con el secreto de Twitter) y la devolución de llamada:

oauth.get(
  'https://api.twitter.com/1.1/trends/place.json?id=23424977',
  token,
  secret,
  function (error, data, response){
    if (error) console.error(error);
    data = JSON.parse(data);
    console.log(JSON.stringify(data, 0, 2));
});

Detrás de escena, el get() La función construye valores únicos para el encabezado de la solicitud:Autorización encabezamiento. El método encripta la URL, la marca de tiempo, la aplicación y otra información en una firma, por lo que el mismo encabezado no funcionará para otra URL o después de una ventana de tiempo específica.

En la función de devolución de llamada, analizamos el data cadena en un objeto JavaScript y luego imprímalo con sangría usando JSON.stringify parámetros El último argumento de la devolución de llamada, response , tendrá la información de respuesta con los encabezados.

El código fuente completo del oauth1/index.js :

var twitterKey = 'your Twitter application consumer key',
  twitterSecret = 'your Twitter application secret',
  token = 'your user token for this app',
  //you can get it at dev.twitter.com for your own apps
  secret = 'your user secret for this app';
  //you can get it at dev.twitter.com for your own apps

var OAuth = require('OAuth');

var oauth = new OAuth.OAuth(
  'https://api.twitter.com/oauth/request_token',
  'https://api.twitter.com/oauth/access_token',
  twitterKey,
  twitterSecret,
  '1.0A',
  null,
  'HMAC-SHA1'
);

oauth.get(
  'https://api.twitter.com/1.1/trends/place.json?id=23424977',
  token,
  secret,
  function (error, data, response){
    if (error) console.error(error);
    // data = JSON.parse(data);
    // console.log(JSON.stringify(data, 0, 2));
    console.log(response);
});

Cuando ejecuta el archivo con $ node index.js , debería ver los datos del extremo protegido de la API de Twitter, por ejemplo, los diez temas más populares para una ubicación determinada (WOEID búsqueda) a través del trends/place punto final:

https://api.twitter.com/1.1/trends/place.json?id=23424977

Los documentos de tendencias están disponibles en https://dev.twitter.com/docs/api/1.1/get/trends/place. El resultado podría verse así:

[
  {
    "trends": [
      {
        "name": "#WorldCup",
        "query": "%23WorldCup",
        "url": "http://twitter.com/search?q=%23WorldCup",
        "promoted_content": null
      },
      {
        "name": "Kershaw",
        "query": "Kershaw",
        "url": "http://twitter.com/search?q=Kershaw",
        "promoted_content": null
      },
      {
        "name": "#RE2PECT",
        "query": "%23RE2PECT",
        "url": "http://twitter.com/search?q=%23RE2PECT",
        "promoted_content": null
      },
      ...
            {
        "name": "Starbucks",
        "query": "Starbucks",
        "url": "http://twitter.com/search?q=Starbucks",
        "promoted_content": null
      }
    ],
    "as_of": "2014-07-14T17:45:52Z",
    "created_at": "2014-07-14T17:41:24Z",
    "locations": [
      {
        "name": "United States",
        "woeid": 23424977
      }
    ]
  }
]