La autenticación con Google Sign-In es una práctica común en las aplicaciones modernas. En esta publicación de blog, analizaremos cómo integrar Google Identity Services en cualquiera de sus aplicaciones front-end que utilicen Ruby on Rails como servidor. Google Identity Services ofrece
Botón de inicio de sesión/registro personalizado
Iniciar sesión con un toque
¡Vamos a sumergirnos!
Para usar Google Sign In o One Tap, necesitamos un client_id para agregar nuestro cliente y servidor .
Para crear una aplicación, diríjase a la
Seleccione Crear credenciales > ID de cliente de OAuth . Antes de hacer esto, debe configurar su
Al crear client_id, asegúrese de incluir localhost y el puerto en el que se ejecuta su cliente en el origen de Javascript autorizado para desarrollo y su URL de producción.
Una vez hecho esto, tendrá su client_id del formulario 1234567890-abcdefg.apps.googleusercontent.com
Para obtener más detalles sobre la configuración de la aplicación, puede leer
Para cargar la biblioteca del cliente, agregue <script src="https://accounts.google.com/gsi/client" async defer></script>
en su index.html
si está usando React.js o _app.jsx
si usa Next.js.
useEffect(() => { /* global google */ google.accounts.id.initialize({ client_id: "YOUR_GOOGLE_CLIENT_ID", callback: signInCallback, cancel_on_tap_outside: false, }); google.accounts.id.renderButton(document.getElementById("signInDiv"), { theme: "outline", size: "large", }); }, []);
google global se agrega para mostrar que google se ha definido globalmente en nuestro index.html
google.accounts.id.initialize
el método crea una instancia de cliente Iniciar sesión con Google basada en campos dados. client_id es un campo obligatorio que obtenemos al crear la aplicación de Google, la devolución de llamada es la función de JavaScript (aquí signInCallback ) que maneja el token de ID devuelto desde el aviso de One Tap o la ventana emergente.
De manera predeterminada, si un usuario hace clic en cualquier parte de la pantalla, se aplica un enfriamiento exponencial en el aviso de One Tap. En caso de que desee que el indicador esté siempre visible, establezca este valor en false . Puedes echar un vistazo a más configuraciones
El método google.accounts.id.renderButton
muestra un botón Iniciar sesión con Google. Puedes jugar con las configuraciones.
document.getElementById("signInDiv")
es el elemento HTML. Al agregar el siguiente código a su página web HTML,
return ( <div className="App"> <div id="signInDiv" /> </div> );
podrás ver un botón personalizado como este
google.accounts.id.prompt();
const signInCallback = (result) => { if (result.credential) { const params = { token: result.credential }; axios .post("http://localhost:3000/user/google", params) .then((res) => { const { authToken, ...userInfo } = res.data.data; // set token in local storage/cookies based on your authentication method // redirect to the authenticated page }) .catch((err) => console.log(err)); } };
dónde,
El resultado es una respuesta de Google una vez que hacemos clic en el botón Iniciar sesión o Un toque.
El resultado comprende dos campos.
credencial : este campo es el token de ID como una cadena JSON Web Token (JWT) codificada en base64
select_by : muestra cómo se selecciona la credencial. Más sobre eso
Tomamos la credencial del resultado y la pasamos como parámetro a nuestro servidor.
Crearemos una ruta en el servidor para manejar la solicitud del cliente. Antes de hacer eso, necesitamos crear un controlador que acepte el JWT del cliente.
Cree un archivo, app/controllers/users/user_controller.rb
, agregue un método google
.
agregue la ruta users/user#google_oauth , en config/routes.rb .
Una vez que la ruta recibe el JWT, el primer y más importante paso es verificar si el JWT está validado. Para ello, podemos utilizar la gema
Esto se puede hacer fácilmente usando
Google::Auth::IDTokens.verify_oidc access_token, aud: "YOUR_GOOGLE_CLIENT_ID"
donde access_token es el JWT recibido del cliente y aud es una identificación de cliente de la aplicación de Google.
{ "iss": "https://accounts.google.com", "nbf": 12345678, "aud": "YOUR_GOOGLE_CLIENT_ID, "sub": "1112223333444", "email": "[email protected]", "email_verified": true, "azp": "YOUR_GOOGLE_CLIENT_ID", "name": "First Last", "picture": "https://lh3.googleusercontent.com/a/AItbvmnvsIQFJw", "given_name": "First", "family_name": "Last", "iat": 1653797115, "exp": 1653805725, "jti": "8ffa19190gngd46745ff558821f953802" }
Si el token es válido, puede verificar en su base de datos si el usuario existe o no y, en consecuencia, crear un usuario. Una vez hecho esto, puede iniciar la sesión del usuario o redirigirlo según su método de autenticación.
# users/user_controller.rb def google begin data = Google::Auth::IDTokens.verify_oidc access_token, aud: "YOUR_GOOGLE_CLIENT_ID" // find the user in the data // if the user does not exist, create a user using data // sign the user (based on your authentication method) rescue StandardError => e end end
# config/routes.rb scope :user do post 'google' => 'users#user_controller.rb' end
PD : asegúrese de tener rack-cors
instalados en su servidor y agregue esta aplicación.rb
config.middleware.insert_before 0, Rack::Cors do allow do origins '*' resource( '*', headers: :any, expose: ['Authorization'], methods: %i[get patch put delete post options show] ) end end
para evitar enfrentar errores como este
PPS : si su aplicación utiliza la biblioteca de la plataforma de JavaScript de inicio de sesión de Google para la web, asegúrese de migrarla al servicio de identidad de Google, ya que el primero quedará obsoleto.
Espero que este artículo le ayude a integrar One Tap Login en sus proyectos. Para obtener información más detallada, puede consultar el oficial
También publicado aquí