En esta serie de instructivos, se ilustran todas las partes móviles de un complemento de Classroom en funcionamiento. Cada paso del instructivo aborda conceptos específicos y los implementa en una sola aplicación web. El objetivo es ayudarte a configurar, iniciar y lanzar un complemento funcional.
Tu complemento debe interactuar con un proyecto de Google Cloud. Si no estás familiarizado con Google Cloud, te recomendamos que leas las guías de introducción. Puedes administrar las credenciales, el acceso a la API y el SDK de Google Workspace Marketplace en la consola de Google Cloud. Para obtener más información sobre el SDK de Marketplace, visita la página de la guía de la ficha de Google Workspace Marketplace .
En esta guía, se abarcan los siguientes temas:
- Usa Google Cloud para crear una página que se muestre en un iframe en Classroom.
- Agrega el inicio de sesión único (SSO) de Google y permite que los usuarios accedan.
- Realiza llamadas a la API para adjuntar tu complemento a una tarea.
- Aborda los requisitos clave de envío de complementos y las funciones obligatorias.
En esta guía, se supone que estás familiarizado con la programación y los conceptos fundamentales de desarrollo web. Te recomendamos que leas la Guía de configuración del proyecto antes de comenzar con los instructivos. Esta página contiene detalles de configuración importantes que no se abarcan por completo en los instructivos.
Implementaciones de ejemplo
Hay un ejemplo de referencia completo disponible en Python. También hay implementaciones parciales disponibles en Java y Node.js. Estas implementaciones son las fuentes del código de ejemplo que se encuentra en las páginas posteriores.
Dónde descargar
Los ejemplos de Python y Java están disponibles en los repositorios de GitHub:
La muestra de Node.js se puede descargar como un archivo ZIP:
Requisitos previos
Revisa las siguientes secciones para preparar un nuevo proyecto de complementos.
Certificado HTTPS
Si bien puedes alojar tu app en cualquier entorno de desarrollo, tu complemento de Classroom solo está disponible a través de https://. Por lo tanto, necesitas un servidor con encriptación SSL para implementar tu app o probarla dentro del iframe del complemento.
Es posible usar localhost con un certificado SSL. Considera mkcert si
necesitas crear un certificado para el desarrollo local.
Proyecto de Google Cloud
Debes configurar un proyecto de Google Cloud para usarlo con estos ejemplos. Consulta la guía de creación de proyectos de Google Cloud para obtener una descripción general de los pasos necesarios para comenzar. En la sección Configura un proyecto de Google Cloud del primer instructivo, también se explican las acciones de configuración específicas que debes realizar.
Cuando termines, descarga tu ID de cliente de OAuth 2.0 como un archivo JSON. Debes agregar este archivo de credenciales al directorio de ejemplo descomprimido. Consulta Interpreta los archivos para conocer las ubicaciones específicas.
Credenciales de OAuth
Sigue estos pasos para crear credenciales de OAuth nuevas:
- Navega a la página Credenciales de Google Cloud. Asegúrate de tener seleccionado el proyecto correcto en la parte superior de la pantalla.
- Haz clic en CREAR CREDENCIALES y elige ID de cliente de OAuth en el menú desplegable.
- En la siguiente página, sigue estos pasos:
- Configura Tipo de aplicación como Aplicación web.
- En URIs de redireccionamiento autorizados, haz clic en AGREGAR URI. Agrega la ruta de acceso completa para una ruta de devolución de llamada para tu aplicación. Por ejemplo,
https://my.domain.com/auth-callbackohttps://localhost:5000/callback. Crearás y controlarás esta ruta más adelante en este instructivo. Puedes editar o agregar más rutas de este tipo en cualquier momento. - Haz clic en CREAR.
- Luego, recibirás un diálogo con las credenciales recién creadas. Elige la opción DESCARGAR JSON. Copia el archivo JSON descargado en el directorio del servidor.
Requisitos previos específicos del lenguaje
Consulta el archivo README en cada repositorio para obtener la lista más actualizada de requisitos previos.
Python
Nuestro ejemplo de Python usa el framework de Flask. Puedes descargar el código fuente completo desde los vínculos proporcionados.
Si es necesario, instala Python 3.7 o versiones posteriores y asegúrate de que pip esté disponible.
python3 -m ensurepip --upgradeTambién te recomendamos que configures y actives un nuevo entorno virtual de Python.
python3 -m venv .classroom-addon-envsource .classroom-addon-env/bin/activate
Hay un archivo requirements.txt en cada subdirectorio del instructivo en los ejemplos descargados. Puedes instalar rápidamente las bibliotecas requeridas con pip. Usa los siguientes comandos para instalar las bibliotecas requeridas para el primer instructivo.
cd flask/01-basic-apppip install -r requirements.txt
Node.js
Nuestro ejemplo de Node.js usa el framework de Express. Puedes descargar el código fuente completo desde los vínculos proporcionados.
En este ejemplo, se requiere Node.js v16.13 o versiones posteriores.
Instala los módulos de nodo requeridos con npm.
npm installJava
Nuestro ejemplo de Java usa el framework de Spring Boot. Puedes descargar el código fuente completo desde los vínculos proporcionados.
Instala Java 11 o versiones posteriores si aún no lo tienes instalado en tu máquina.
Las aplicaciones de Spring Boot pueden usar Gradle o Maven para controlar las compilaciones y administrar las dependencias. En este ejemplo, se incluye el wrapper de Maven que garantiza una compilación exitosa sin necesidad de instalar Maven.
En el directorio en el que descargaste o clonaste el proyecto, ejecuta los siguientes comandos para asegurarte de tener los requisitos previos para ejecutar el proyecto.
java --version./mvnw --version
O en Windows:
java -versionmvnw.cmd --version
Interpreta los archivos
En las siguientes secciones, se describe el diseño de los directorios de ejemplo.
Nombres de directorios
Cada repositorio contiene varios directorios cuyos nombres comienzan con un número, como /01-basic-app/. Los números corresponden a pasos específicos del instructivo.
Cada directorio contiene una app web completamente funcional que implementa las funciones descritas en un instructivo en particular. Por ejemplo, el /01-basic-app/
directorio contiene la implementación final del instructivo Crea un complemento.
Contenido del directorio
El contenido del directorio varía según el lenguaje de implementación:
Python
La raíz del directorio contiene los siguientes archivos:
main.py: El punto de entrada de la aplicación de Python. Especifica la configuración del servidor que deseas usar en este archivo y, luego, ejecútalo para iniciar el servidor.requirements.txt: Los módulos de Python necesarios para ejecutar la app web. Se pueden instalar automáticamente conpip install -r requirements.txt.client_secret.json: El archivo de secreto del cliente descargado de Google Cloud. Ten en cuenta que no se incluye en el archivo de ejemplo. Debes cambiar el nombre y copiar el archivo de credenciales descargado en cada raíz del directorio.
config.py: Opciones de configuración para el servidor de Flask.El directorio
webappcontiene el contenido de la aplicación web. Incluye lo siguiente:El directorio
/templates/con plantillas Jinja para varias páginas.El directorio
/static/con imágenes, CSS y archivos JavaScript auxiliares.routes.py- Los métodos de controlador para las rutas de la aplicación web.__init__.py: El inicializador del módulowebapp. Este inicializador inicia el servidor de Flask y carga las opciones de configuración establecidas enconfig.py.Archivos adicionales según lo requiera un paso específico del instructivo.
Node.js
Cada paso del instructivo se puede encontrar en su propia <step>
subcarpeta. Cada paso contiene lo siguiente:
- Los archivos estáticos, como JavaScript, CSS y las imágenes, se encuentran en la
./<step>/publiccarpeta. - Los routers de Express se encuentran en las carpetas
./<step>/routes. - Las plantillas HTML se encuentran en las carpetas
./<step>/views. - La aplicación del servidor es
./<step>/app.js.
Java
El directorio del proyecto incluye lo siguiente:
- El directorio
src.maincontiene el código fuente y la configuración para ejecutar la aplicación correctamente. Este directorio incluye lo siguiente: + El directoriojava.com.addons.springcontiene los archivosApplication.javayController.java. El archivoApplication.javaes responsable de ejecutar el servidor de aplicaciones, mientras que el archivoController.javacontrola la lógica del extremo. + El directorioresourcescontiene el directoriotemplatescon archivos HTML y JavaScript. También contiene elapplication.propertiesarchivo que especifica el puerto para ejecutar el servidor, la ruta de acceso al archivo de almacén de claves y la ruta de acceso altemplatesdirectorio. En este ejemplo, se incluye el archivo de almacén de claves en el directorioresources. Puedes almacenarlo donde prefieras, pero asegúrate de actualizar elapplication.propertiesarchivo con la ruta de acceso correspondiente.pom.xmlcontiene la información necesaria para compilar el proyecto y definir las dependencias requeridas..gitignorecontiene nombres de archivos que no se deben subir a Git. Asegúrate de agregar la ruta de acceso a tu almacén de claves en este archivo.gitignore. En el ejemplo proporcionado, essecrets/*.p12(el propósito del almacén de claves se analiza en la siguiente sección). Para el instructivo 2 y versiones posteriores, también debes incluir la ruta de acceso a tu archivoclient_secret.jsonpara asegurarte de no incluir tus secretos en un repositorio remoto. Para el instructivo 3 y versiones posteriores, debes agregar la ruta de acceso al archivo de base de datos H2 y a la fábrica de almacenes de datos de archivos. Puedes encontrar más información sobre la configuración de estos almacenes de datos puede encontrarse en el tercer instructivo sobre el manejo de visitas repetidas.mvnwymvnw.cmdson los ejecutables del wrapper de Maven para Unix y Windows, respectivamente. Por ejemplo, ejecutar./mvnw --versionen Unix genera la versión de Apache Maven, entre otra información.- El directorio
.mvncontiene la configuración del wrapper de Maven.
Ejecuta el servidor de muestra
Debes iniciar el servidor para probarlo. Sigue estas instrucciones para ejecutar el servidor de ejemplo en el idioma que elijas:
Python
Credenciales de OAuth
Crea y descarga tus credenciales de OAuth como se describió anteriormente. Coloca el archivo JSON en el directorio raíz junto con el archivo de inicio del servidor de tu aplicación.
Configura el servidor
Tienes varias opciones para ejecutar el servidor web. Al final de tu archivo de Python, agrega una de las siguientes opciones:
localhostno seguro. Ten en cuenta que esto es adecuado solo para pruebas directas en una ventana del navegador. No se pueden cargar dominios no seguros en el iframe del complemento de Classroom.if __name__ == "__main__": # Disable OAuthlib's HTTPs verification. os.environ["OAUTHLIB_INSECURE_TRANSPORT"] = "1" # Run the web app at http://localhost:5000. app.run(debug=True)localhostseguro. Debes especificar una tupla de archivos de claves SSL para el argumentossl_context.if __name__ == "__main__": # Run the web app at https://localhost:5000. app.run(host="localhost", ssl_context=("localhost.pem", "localhost-key.pem"), debug=True)Servidor de Gunicorn. Esto es adecuado para un servidor listo para producción o una implementación en la nube. Te recomendamos que establezcas una variable de entorno
PORTpara usarla con esta opción de inicio.if __name__ == "__main__": # Run the web app at https://<your domain>:<server_port>. # Defaults to https://<your domain>:8080. server_port = os.environ.get("PORT", "8080") app.run(debug=True, port=server_port, host="0.0.0.0")
Inicia el servidor
Ejecuta tu aplicación de Python para iniciar el servidor como se configuró en el paso anterior.
python main.pyHaz clic en la URL que aparece para ver tu app web en un navegador y confirmar que se ejecuta correctamente.
Node.js
Configura el servidor
Para ejecutar el servidor a través de HTTPS, debes crear un certificado autofirmado que se use para ejecutar la aplicación a través de HTTPS. Estas credenciales se deben guardar como sslcert/cert.pem y sslcert/key.pem en la carpeta raíz del repositorio. Es posible que debas agregar estas claves a tu cadena de claves del SO para que el navegador las acepte.
Asegúrate de que *.pem esté en tu archivo .gitignore, ya que no quieres confirmar el archivo en Git.
Inicia el servidor
Puedes ejecutar la aplicación con el siguiente comando y sustituir step01 por el paso correcto que deseas ejecutar como servidor (por ejemplo, step01 para 01-basic-app y step02 para 02-sign-in).
npm run step01o
npm run step02Esto inicia el servidor web en https://localhost:5000.
Puedes finalizar el servidor con Control + C en tu terminal.
Java
Configura el servidor
Para ejecutar el servidor a través de HTTPS, debes crear un certificado autofirmado que se use para ejecutar la aplicación a través de HTTPS.
Considera usar mkcert para el desarrollo local. Una vez que instales mkcert, los siguientes comandos generarán un certificado almacenado localmente para ejecutarse a través de HTTPS.
mkcert -installmkcert -pkcs12 -p12-file <path_to_keystore> <domain_name>
En este ejemplo, se incluye el archivo de almacén de claves en el directorio de recursos. Puedes almacenarlo donde prefieras, pero asegúrate de actualizar el archivo application.properties con la ruta de acceso correspondiente. El nombre de dominio es el dominio en el que ejecutas el proyecto (por ejemplo, localhost).
Asegúrate de que *.p12 esté en tu archivo .gitignore, ya que no quieres confirmar el archivo en Git.
Inicia el servidor
Para iniciar el servidor, ejecuta el método main en el archivo Application.java. En IntelliJ, por ejemplo, puedes hacer clic con el botón derecho en
Application.java > Run 'Application' en el directorio
src/main/java/com/addons/spring o abrir el Application.java
archivo para hacer clic en la flecha verde a la izquierda de la firma del método main(String[] args). Como alternativa, puedes ejecutar el proyecto en una ventana de terminal:
./mvnw spring-boot:runo en Windows:
mvnw.cmd spring-boot:runEsto inicia el servidor en https://localhost:5000 o en el puerto que especificaste en application.properties.