Estoy tratando de implementar una autenticación de 3 patas en mi aplicación para la API de Google, para poder acceder a los calendarios de Google de los usuarios registrados.

En la guía de inicio rápido de Ruby, aparece este comando que, en mi opinión entender debe apuntar a los tokens del usuario:

token_store = Google::Auth::Stores::FileTokenStore.new(file: CREDENTIALS_PATH)

Espera los tokens almacenados en un archivo ( o Redis), pero (por supuesto) Guardo los tokens de cada usuario en mi base de datos (Postgres).

¿He entendido mal el propósito del comando o no? ¿Cómo lo uso con un almacén de base de datos?

Documentación oficial

3
Fellow Stranger 1 ago. 2016 a las 13:25

2 respuestas

La mejor respuesta

Lo implementé yo mismo según la respuesta de @ Rafe. Solo quería compartir en caso de que alguien quiera copiar la implementación de la tienda ActiveRecord / Database:

module Google
  module Auth
    module Stores
      class DatabaseTokenStore < Google::Auth::TokenStore
        def load(id)
          user = User.find(id)
          {
            "client_id": ENV['google_client_id'],
            "access_token": user.token,
            "refresh_token": user.refresh_token,
            "scope": ENV['google_scopes'],
            "expiration_time_millis": user.token_expires_at
          }.to_json
        end
        def store(id, token)
          user = User.find(id)
          hsh = JSON.parse(token)
          user.update(
            token: hsh["access_token"],
            token_expires_at: hsh["expiration_time_millis"] / 1000
          )
        end
      end
    end
  end
end
8
jessh 15 ene. 2018 a las 17:13

Impleméntelo usted mismo, de acuerdo con el el archivo Léame:

También se pueden utilizar implementaciones de almacenamiento personalizadas. Consulte token_store.rb para Detalles adicionales.

No debería ser demasiado difícil implementar load(id), store(id, token) y delete(id) con ActiveRecord (u otro ORM) por el aspecto de los archivos mencionados.

2
Rafe 1 ago. 2016 a las 21:22