Node.js OAuth1.0 y OAuth2.0:Ejemplos de Twitter API v1.1

Recientemente tuvimos que trabajar en la modificación para adaptar la API de Twitter v1.1. La principal diferencia entre la API de Twitter v1.1 y la API de Twitter v1.0, que pronto quedará obsoleta, es que la mayoría de los puntos finales de la API REST ahora requieren un contexto de aplicación o de usuario. En otras palabras, cada llamada debe realizarse a través de la autenticación OAuth 1.0A o OAuth 2.0.

OAuth de Node.js

En Storify ejecutamos todo en Node.js, por lo que era natural que usáramos oauth módulo de Ciaran Jessup:NPM y GitHub. Es maduro y admite todas las funciones necesarias, pero carece de cualquier tipo de ejemplos y/o documentación de interfaz.

Estos son los ejemplos de llamadas a la API de Twitter v1.1 y una lista de métodos. Espero que nadie tenga que escarbar en oauth código fuente del módulo nunca más!

OAuth 1.0

Comencemos con un buen viejo OAuth 1.0A. Necesitará cuatro valores para realizar este tipo de solicitud a la API de Twitter v1.1 (o cualquier otro servicio):

  1. Tu clave de aplicación de Twitter, también conocida como clave de consumidor
  2. Tu clave secreta de Twitter
  3. Token de usuario para su aplicación
  4. Secreto de usuario para tu aplicación

Los cuatro se pueden obtener para sus propias aplicaciones en dev.twitter.com. En caso de que el usuario no sea usted mismo, deberá realizar OAuth de 3 pasos, iniciar sesión con Twitter o algo más.

A continuación, creamos un objeto oauth con parámetros y llamamos a get() para obtener un recurso seguro. Detrás de escena get() La función construye valores únicos para el encabezado de la solicitud:Autorización encabezamiento. El método cifra la URL, la marca de tiempo, la aplicación y otra información en una firma. Por lo tanto, el mismo encabezado no funcionará para otra URL o después de un período de tiempo específico.

var OAuth = require('OAuth');
var oauth = new OAuth.OAuth(
      'https://api.twitter.com/oauth/request_token',
      'https://api.twitter.com/oauth/access_token',
      'your Twitter application consumer key',
      'your Twitter application secret',
      '1.0A',
      null,
      'HMAC-SHA1'
    );
    oauth.get(
      'https://api.twitter.com/1.1/trends/place.json?id=23424977',
      'your user token for this app', 
      //you can get it at dev.twitter.com for your own apps
      'your user secret for this app', 
      //you can get it at dev.twitter.com for your own apps
      function (e, data, res){
        if (e) console.error(e);        
        console.log(require('util').inspect(data));
        done();      
      });    
});

Eco OAuth

OAuth Echo es similar a OAuth 1.0. Si es un delegador (servicio al que el consumidor delega las solicitudes al proveedor de servicios), todo lo que necesita hacer es pasar el valor de x-verify-credentials-authorization encabezado al proveedor de servicios en Autorización encabezamiento. Twitter tiene buenos gráficos en OAuth Echo.

Hay OAuthEcho objeto que hereda la mayoría de sus métodos de OAuth normal clase. En caso de que desee escribir código de consumidor (o para pruebas funcionales, en nuestro caso, Storify es el delegador) y necesita x-verify-credentials-authorization/Authorization valores de encabezado, hay un authHeader método. Si lo miramos, podemos reconstruir fácilmente los encabezados con métodos internos de oauth módulo como _prepareParameters() y _buildAuthorizationHeaders() . Aquí hay una función que nos dará los valores requeridos basados ​​en la URL (recuerde que la URL es parte de Autorización encabezado):

  function getEchoAuth(url) { 
  //helper to construct echo/oauth headers from URL
    var oauth = new OAuth('https://api.twitter.com/oauth/request_token',
      'https://api.twitter.com/oauth/access_token',
      "AAAAAAAAAAAAAAAAAAAA",
      //test app token
      "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB", 
      //test app secret
    '1.0A',
    null,
      'HMAC-SHA1');
    var orderedParams = oauth._prepareParameters(
      "1111111111-AAAAAA", //test user token
    "AAAAAAAAAAAAAAAAAAAAAAA", //test user secret
    "GET",
    url
    );
    return oauth._buildAuthorizationHeaders(orderedParams);
  }

Desde su código de consumidor, puede realizar una solicitud con superagent u otra biblioteca de cliente http (por ejemplo, http.request del módulo http principal de node.js):

var request = require('super agent');

request.post('your delegator api url')
  .send({...}) 	
  //your json data
  .set(
    'x-auth-service-provider',
    'https://api.twitter.com/1.1/account/verify_credentials.json')
  .set(
    'x-verify-credentials-authorization',
    getEchoAuth("https://api.twitter.com/1.1/account/verify_credentials.json"))
  .end(function(res){console.log(res.body)});

OAuth2

OAuth 2.0 es muy fácil de usar en comparación con otros métodos de autenticación. Algunos argumentan que no es tan seguro, así que asegúrese de usar SSL y HTTPS para todas las solicitudes.

 var OAuth2 = OAuth.OAuth2;    
 var twitterConsumerKey = 'your key';
 var twitterConsumerSecret = 'your secret';
 var oauth2 = new OAuth2(
   twitterconsumerKey,
   twitterConsumerSecret, 
   'https://api.twitter.com/', 
   null,
   'oauth2/token', 
   null);
 oauth2.getOAuthAccessToken(
   '',
   {'grant_type':'client_credentials'},
   function (e, access_token, refresh_token, results){
     console.log('bearer: ',access_token);
     oauth2.get('protected url', 
       access_token, function(e,data,res) {
         if (e) return callback(e, null);
         if (res.statusCode!=200) 
           return callback(new Error(
             'OAuth2 request failed: '+
             res.statusCode),null);
         try {
           data = JSON.parse(data);        
         }
         catch (e){
           return callback(e, null);
         }
         return callback(e, data);
      });
   });

Tenga en cuenta el JSON.parse() función, autorización el módulo devuelve una cadena, no un objeto JavaScript.

Los consumidores de OAuth2 no necesitan obtener el token de portador/acceso para cada solicitud. Está bien hacerlo una vez y ahorrar valor en la base de datos. Por lo tanto, podemos realizar solicitudes a recursos protegidos (es decir, API de Twitter v.1.1) con solo una contraseña secreta. Para obtener más información, consulta la aplicación de Twitter solo autenticación.

API de autenticación de Node.js

Node.js oauth Oauth

oauth.OAuth()

Parámetros:

  • url de solicitud
  • URL de acceso
  • clave de consumidor
  • secreto del consumidor
  • versión
  • autorizar_devolución de llamada
  • método de firma
  • nonceSize
  • encabezados personalizados

Node.js oauth OAuthEcho

oauth.OAuthEcho()

[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]

Parámetros:

  • reino
  • verificar_credenciales
  • clave de consumidor
  • secreto del consumidor
  • versión
  • método de firma
  • nonceSize
  • encabezados personalizados

OAuthEcho compartidores los mismos métodos que OAuth

Métodos oauth de Node.js

Métodos de solicitud HTTP seguros para las clases OAuth y OAuthEcho:

OAuth.get()

Parámetros:

  • dirección URL
  • oauth_token
  • oauth_token_secret
  • devolución de llamada

OAuth.delete()

Parámetros:

  • dirección URL
  • oauth_token
  • oauth_token_secret
  • devolución de llamada

OAuth.put()

Parámetros:

  • dirección URL
  • oauth_token
  • oauth_token_secret
  • post_cuerpo
  • tipo_contenido_post
  • devolución de llamada

OAuth.post()

Parámetros:

  • dirección URL
  • oauth_token
  • oauth_token_secret
  • post_cuerpo
  • tipo_contenido_post
  • devolución de llamada

https://github.com/ciaranj/node-oauth/blob/master/lib/oauth.js

Node.js oauth OAuth2

Clase OAuth2

OAuth2()

Parámetros:

  • ID de cliente
  • secreto del cliente
  • sitiobase
  • autorizarRuta
  • ruta del token de acceso
  • encabezados personalizados

OAuth2.getOAuthAccessToken()

Parámetros:

  • código
  • parámetros
  • devolución de llamada

OAuth2.get()

Parámetros:

  • dirección URL
  • token_de_acceso
  • devolución de llamada

https://github.com/ciaranj/node-oauth/blob/master/lib/oauth2.js

Los autores de node.js oauth hizo un gran trabajo, pero actualmente hay 32 solicitudes de extracción abiertas (la mía es una de ellas) y me entristece. ¡Hágales saber que nos preocupamos por mejorar el ecosistema de módulos y la comunidad de desarrolladores de Node.js!

ACTUALIZACIÓN:¡La solicitud de extracción se fusionó correctamente!

Recursos útiles de Twitter API v1.1

Solo porque son enormes y no siempre fáciles de encontrar.

  • Cambios en el flujo "Iniciar sesión con Twitter"
  • Presentamos nuevos metadatos para Tweets
  • REST API v1.1 Límites por ventana por recurso
  • Recursos de API REST v1.1
  • Crear una firma
  • Eco de OAuth
  • Autorización de una solicitud
  • Implementación de Iniciar sesión con Twitter
  • xAuth
  • Autorización de 3 patas
  • Obtención de tokens de acceso
  • Autenticación solo de aplicación

Herramientas

  • Servidor de prueba de OAuth
  • Inspeccionar solicitudes HTTP