Creación de Firma y Nonce para OAuth (Rubí)
-
13-10-2019 - |
Pregunta
Busco a API de acceso de SmugMug de mi solicitud para álbumes e imágenes de los usuarios de agarre (los usuarios no han sido autenticados mediante OmniAuth de rubí).
De acuerdo con SmugMug es OAuth API , OAuth requiere seis parámetros.
Me puede obtener el token con OmniAuth, y la marca de tiempo debe ser fácil (Time.now.to_i ¿verdad?). Hay dos cosas que no sé cómo generar -. El oauth_nonce y la oauth_signature
De acuerdo con la documentación de OAuth, que genera el valor de uso único a través de la marca de tiempo, pero exactamente cómo iba a hacer eso? ¿Tiene que ser una cierta longitud y limitado a ciertos personajes?
Y por supuesto la firma. ¿Cómo iba a generar una firma HMAC-SHA1 con el rubí? Sé que la gema oauth puede hacerlo, pero prefiero genero yo mismo para su uso con OmniAuth. Si examina el código, estoy teniendo problemas para descifrar cómo la gema oauth genera el sig.
Gracias por cualquier ayuda.
Solución
para la firma
def sign( key, base_string )
digest = OpenSSL::Digest::Digest.new( 'sha1' )
hmac = OpenSSL::HMAC.digest( digest, key, base_string )
Base64.encode64( hmac ).chomp.gsub( /\n/, '' )
end#def
Usted no tiene que generar el valor de uso único de la marca de tiempo, pero puede tener sentido ya que la marca de tiempo es obviamente único, por lo que tiene una buena entrada para iniciar cualquier función de asignación al azar.
Yo uso este, (que obtuve de otra pregunta aquí y modificado)
def nonce
rand(10 ** 30).to_s.rjust(30,'0')
end#def
pero se puede usar cualquier cosa que genera una cadena única.
este GIST por erikeldridge en github y guía para principiantes a OAuth para más
Editar
Desde entonces, he encontrado que hay una mejor manera de generar cadenas aleatorias en la biblioteca estándar de Ruby, SecureRandom .
Otros consejos
Un nonce también puede ser simplemente un gran-ish, número al azar adecuadamente - por ejemplo, el uso de la clase SecureRandom de Ruby (no utilizan 'rand'):
require 'securerandom'
...
nonce = SecureRandom.hex()
Esto genera un número aleatorio de 16 bytes en formato hexadecimal.
¿Por qué usted no sólo tiene que utilizar las gemas de rubí Oauth hacer eso?