HTTP/2.0 400 Bad Request PUTting a page
Asked by Francisco Mendez Losada:

Hello all:

I'm trying to launch the following request (sorry for the big post I was not able to find anything smaller):

*** ** * ** ***

```
2023-11-02 13:00:38.365 TRACE rest: PUT /wiki/rest/api/content/XXXX HTTP/1.1
Host: XXXX.atlassian.net
Authorization: Basic XXXX
Content-Type: application/json

{"ancestors":[{"id":"17856824786"}],"body":{"storage":{"representation":"storage","value":"\u003cp\u003e[[\u003cem\u003eTOC\u003c/em\u003e]]\u003c/p\u003e\n\u003ch1 id=\"introduccin\"\u003eIntroducci?n\u003c/h1\u003e\n\u003cp\u003eEn el presente documento se desarrolla t?cnicamente la propuesta de Autenticaci?n para Magenda indicando las referencias y los trabajos a realizar.\u003c/p\u003e\n\u003cp\u003etl;dr -\u0026gt; Ir directamente a An?lisis T?cnico para saber los trabajos a realizar.\u003c/p\u003e\n\u003ch1 id=\"propuesta-inicial\"\u003ePropuesta inicial\u003c/h1\u003e\n\u003ch2 id=\"api-de-usuarios\"\u003eAPI de usuarios\u003c/h2\u003e\n\u003cp\u003eSe requiere modificar la API de Magenda para incluir, en las llamadas a la API de usuarios, todos los campos que pueda necesitar Cognito para realizar su operaci?n (por ejemplo, email).\nLa API de Magenda usar?, a su vez, la API de AWS para crear y modificar usuarios en Cognito.\u003c/p\u003e\n\u003ch2 id=\"autenticacin\"\u003eAutenticaci?n\u003c/h2\u003e\n\u003cp\u003eSe requiere modificar el sistema de autenticaci?n en la API de Magenda para integrarla con la autenticaci?n de Cognito.\nEllo requiere cambiar los endpoints de obtenci?n de token de usuario para delegarlos en Cognito.\u003c/p\u003e\n\u003ch2 id=\"frontend\"\u003eFrontend\u003c/h2\u003e\n\u003cp\u003eSe requiere la modificaci?n del Frontend de Magenda para permitir la autenticaci?n mediante Cognito, que se realizar? de dos formas:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eLogin desde la aplicaci?n: se validar? el login con los usuarios propios de Cognito.\u003c/li\u003e\n\u003cli\u003eToken de autenticaci?n: se validar? el token de autenticaci?n con el backend de Magenda.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eEl Login desde la aplicaci?n Magenda se realizar ?nicamente para que puedan acceder usuarios que no existen en la Web del Profesional, por ejemplo, Operarios o Empresas (futuro). En ese caso el Id de usuario ser?, probablemente, un email.\u003c/p\u003e\n\u003ch2 id=\"llamadas-api-desde-systematheootros\"\u003eLlamadas API desde Systema/Theo/Otros\u003c/h2\u003e\n\u003cp\u003ePara realizar llamadas a la API de Magenda se usar? el tipo de autenticaci?n Client Credentials, que requiere un client_id y un client_secret asociados al usuario que realiza la llamada.\nPara la obtenci?n del token de acceso se llamar? al endpoint ?token? definido en Cognito que ser? similar al mostrado:\nhttps://\u003cyour-domain\u003e/oauth2/token\nEste usuario estar? asociado a una aplicaci?n concreta de Cognito que le otorgar? ciertos permisos:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eAdministrador (para Theo/Systema).\u003c/li\u003e\n\u003cli\u003eProveedor (para uso por proveedores externos).\u003c/li\u003e\n\u003cli\u003eOtros: para uso futuro, a definir, por ejemplo, administrador de empresa.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"autorizacin-de-usuarios-desde-systemaweb-del-profesional\"\u003eAutorizaci?n de usuarios desde Systema/Web del Profesional\u003c/h2\u003e\n\u003cp\u003eSe requiere la delegaci?n de la autenticaci?n de los usuarios que accedan a Magenda para poder permitir el acceso de los usuarios de Systema/Web del profesional sin necesidad de realizar login en Magenda.\u003c/p\u003e\n\u003cp\u003ePara ello desde la web del profesional se deber? realizar la siguiente secuencia de autorizaci?n, que es un SSO (Single Sign-on) personalizado:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eMultiasistencia realizar? una llamada con el flujo ?Client Credentials? para obtener un token de acceso.\u003c/li\u003e\n\u003cli\u003eEse token de acceso implica que hay una relaci?n de confianza entre Systema/Theo y Magenda, por lo que posteriores operaciones con ese token no requerir?n que sea validada en Cognito.\u003c/li\u003e\n\u003cli\u003eMultiasistencia realizar? una llamada a un endpoint de impersonaci?n en Magenda (todav?a por definir), en la que enviar? un usuario de la web del profesional con el que impersonarse.\u003c/li\u003e\n\u003cli\u003eMagenda generar? un nuevo token de acceso que podr? ser usado en la integraci?n de Magenda dentro de la Web del Profesional.\no\tEl token de acceso a Magenda puede ser recibido tanto en la cabecera de Authorization de HTTP, como en la URL, como un Query Param de HTTP (ejemplo \u003ca href=\"https://magenda.com/home?token=12345678)\"\u003ehttps://magenda.com/home?token=12345678)\u003c/a\u003e.\no\tMagenda se encargar? de gestionar y validar ese token y las operaciones que puede realizar, que ser?n las que otorgue el rol/grupo del usuario con el que se ha impersonado.\no\tLa validez del token de acceso a MAgenda desde la web del profesional se establecer?, en principio en 24 horas.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eLo importante a destacar en este punto es que, una vez que Systema obtiene un token de acceso desde Cognito se establece una Relaci?n de Confianza entre los dominios de MAgenda y Systema/Theo.\u003c/p\u003e\n\u003ch2 id=\"sincronizacin-de-usuarios-desde-systema\"\u003eSincronizaci?n de usuarios desde Systema\u003c/h2\u003e\n\u003cp\u003eEl sistema de autenticaci?n de Magenda necesita conocer los usuarios de Systema y almacenarlos en su base de datos para poder realizar la impersonaci?n y gestionar el acceso.\nPara ello es necesario que Systema realice llamadas a la API de Magenda cada vez que se agrega o elimina un usuario.\nMagenda habilita una API de creaci?n, modificaci?n y borrado de usuarios que puede ser accedida por sistema mediante autenticaci?n de tipo Client Credentials.\u003c/p\u003e\n\u003cp\u003ePara la primera carga masiva de usuarios desde Systema se recomienda la generaci?n de un fichero CSV que incluya su nombre de usuario y, como m?nimo, su grupo (administrador o proveedor).\nLos datos pueden ser cargados despu?s mediante un script de bash/powershell que realice llamadas a la API de Magenda (usando Client Credentials para la autorizaci?n).\u003c/p\u003e\n\u003ch1 id=\"anlisis-tcnico\"\u003eAn?lisis t?cnico\u003c/h1\u003e\n\u003ch2 id=\"observaciones\"\u003eObservaciones\u003c/h2\u003e\n\u003ch2 id=\"aws-cognito-api-aws-cli\"\u003eAWS Cognito API (aws cli)\u003c/h2\u003e\n\u003cp\u003ePara el manejo de usuarios se conectar? la API actual con Cognito, tanto para la autorizaci?n como para el alta/baja y modificaci?n de los mismos.\u003c/p\u003e\n\u003cp\u003ePara el acceso a la API de AWS se usar? la librer?a boto3 y en este documento se presentar?n los comandos equivalentes de la aws cli que se han de ejecutar.\u003c/p\u003e\n\u003cp\u003eMuestra de comandos a ejecutar:\u003c/p\u003e\n\u003cac:structured-macro ac:name=\"code\"\u003e\u003cac:parameter ac:name=\"language\"\u003e\u003c/ac:parameter\u003e\u003cac:parameter ac:name=\"collapse\"\u003efalse\u003c/ac:parameter\u003e\u003cac:plain-text-body\u003e\u003c![CDATA[# Crear user\naws cognito-idp admin-create-user --user-pool-id us-west-2_aaaaaaaaa --username diego --user-attributes Name=email,Value=diego@example.com Name=phone_number,Value=\"+15555551212\" --message-action SUPPRESS\n\n# Add user to group\naws cognito-idp admin-add-user-to-group --user-pool-id us-west-2_aaaaaaaaa --username Jane --group-name MyGroup\n\n# Cambiar password\naws cognito-idp admin-set-user-password --region eu-west-1 --user-pool-id eu-west-1_dZGTfAWJx --username impalah --password Temporary2! --permanent\n\n# Autorizar user\naws cognito-idp initiate-auth --region eu-west-1 --auth-flow USER_PASSWORD_AUTH --client-id b7g15gh2uhumbk580prm9ve60 --auth-parameters USERNAME=impalah,PASSWORD=Temporary2!]]\u003e\u003c/ac:plain-text-body\u003e\u003c/ac:structured-macro\u003e\u003ch2 id=\"client-credentials-login\"\u003eClient credentials login\u003c/h2\u003e\n\u003cp\u003eCuando una API quiere operar con magenda (server-to-server) ha de usar el flujo Client Credentials de OAuth, que devolver? una token JWT que puede ser validada en backend y el grupo de funcionalidades al que tiene acceso puede ser validado en su scope.\u003c/p\u003e\n\u003cp\u003eLa token se enviar? despu?s en cada llamada a la API.\u003c/p\u003e\n\u003ch3 id=\"obtener-access-token\"\u003eObtener access token\u003c/h3\u003e\n\u003cp\u003eSe enviar? una petici?n POST hacia \u003ca href=\"https://magenda-dev.auth.eu-west-1.amazoncognito.com/oauth2/token\"\u003ehttps://magenda-dev.auth.eu-west-1.amazoncognito.com/oauth2/token\u003c/a\u003e con el ContenType application/x-www-form-urlencoded y los siguientes par?metros:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003egrant_type: client_credentials\u003c/li\u003e\n\u003cli\u003eclient_id\u003c/li\u003e\n\u003cli\u003eclient_secret\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eSi la operaci?n tiene ?xito se devolver? una token JWT que puede ser validad y examinada (por ejemplo en jwt.io). A continuaci?n est? una muestra de la informaci?n de la misma:\u003c/p\u003e\n\u003cac:structured-macro ac:name=\"code\"\u003e\u003cac:parameter ac:name=\"language\"\u003e\u003c/ac:parameter\u003e\u003cac:parameter ac:name=\"collapse\"\u003efalse\u003c/ac:parameter\u003e\u003cac:plain-text-body\u003e\u003c![CDATA[{\n \"sub\": \"5736qi3i63b30h2eaud2p0g7s0\",\n \"token_use\": \"access\",\n \"scope\": \"http://magenda-dev-web.s3-website-eu-west-1.amazonaws.com/admin\",\n \"auth_time\": 1685957358,\n \"iss\": \"https://cognito-idp.eu-west-1.amazonaws.com/eu-west-1_rOLfFdxMG\",\n \"exp\": 1685960958,\n \"iat\": 1685957358,\n \"version\": 2,\n \"jti\": \"9d407569-27c4-46d8-a428-17f6ae49d978\",\n \"client_id\": \"5736qi3i63b30h2eaud2p0g7s0\"\n}]]\u003e\u003c/ac:plain-text-body\u003e\u003c/ac:structured-macro\u003e\u003cp\u003eLas partes importantes aqu? son \u0026quot;sub\u0026quot;, que indica el usuario que hace la operaci?n y \u0026quot;scope\u0026quot;, que indica su \u0026quot;grupo\u0026quot; o a qu? operaciones tiene acceso (se ha de eliminar la url del inicio).\u003c/p\u003e\n\u003ch2 id=\"login-cognito\"\u003eLogin Cognito\u003c/h2\u003e\n\u003cp\u003ePara aceder a la pantalla de login de Cognito se usa la URL de login, que es:\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003ehttps://magenda-dev.auth.eu-west-1.amazoncognito.com/oauth2/authorize?response_type=token\u0026amp;client_id=56jfer20n3u8t2ap9smv72oulo\u0026amp;redirect_uri=http://localhost\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eTras una respuesta correcta redireccionar? a la redirect_uri enviando los par?metros en la URL. Por ejemplo:\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003ehttp://localhost/#id_token=BIG_BIG_JWT_TOKEN\u0026amp;expires_in=3600\u0026amp;token_type=Bearer\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eEl contenido de la token ha de incluir los datos del usuario, tal como se muestra en este ejemplo:\u003c/p\u003e\n\u003cac:structured-macro ac:name=\"code\"\u003e\u003cac:parameter ac:name=\"language\"\u003e\u003c/ac:parameter\u003e\u003cac:parameter ac:name=\"collapse\"\u003efalse\u003c/ac:parameter\u003e\u003cac:plain-text-body\u003e\u003c![CDATA[{\n \"at_hash\": \"ZvBJ8Rvg1jcGfnC5S1M-yA\",\n \"sub\": \"bdba6c75-de6b-445a-bac9-6ad114a7d2ef\",\n \"cognito:groups\": [\n \"admin\"\n ],\n \"iss\": \"https://cognito-idp.eu-west-1.amazonaws.com/eu-west-1_7ufxB5ewH\",\n \"cognito:username\": \"godzilla\",\n \"aud\": \"56jfer20n3u8t2ap9smv72oulo\",\n \"token_use\": \"id\",\n \"auth_time\": 1685965294,\n \"exp\": 1685968894,\n \"iat\": 1685965294,\n \"jti\": \"cb666841-38c3-4b52-aff5-be8a025b06f5\",\n \"email\": \"lino.figueroa@softwareone.com\"\n}]]\u003e\u003c/ac:plain-text-body\u003e\u003c/ac:structured-macro\u003e\u003cp\u003eA destacar los campos:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eiss\u003c/strong\u003e que contiene el identificador de usuario.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003ecognito:groups\u003c/strong\u003e que contiene los grupos a los que pertenece el usuario\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"distinguir-el-tipo-de-conexin\"\u003eDistinguir el tipo de conexi?n\u003c/h2\u003e\n\u003cp\u003eA la hora de distinguir el tipo de conexi?n que se ha efectuado, y poder averiguar los grupos de usuarios, se ha de comprobar que en la token JWT se recibe o no el par?metro \u0026quot;client_id\u0026quot;.\u003c/p\u003e\n\u003cp\u003eDe esta forma, en Backend se redirigir? a un m?todo u otro para cargar en el objeto \u0026quot;user\u0026quot; el grupo del usuario:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eclient_id usar el par?metro \u0026quot;scope\u0026quot;.\u003c/li\u003e\n\u003cli\u003eno client_id usar el par?metro \u0026quot;cognito:groups\u0026quot;.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"modificacin-usuarios\"\u003eModificaci?n usuarios\u003c/h2\u003e\n\u003ch3 id=\"backend-modelo-de-datos\"\u003eBackend: Modelo de datos\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eAgregar nuevos campos a usuario:\nemail (opcional): de tipo email, con regex adecuada\norigin (default \u0026quot;system\u0026quot;): enum de string con valores \u0026quot;system\u0026quot;, \u0026quot;external\u0026quot;, \u0026quot;api\u0026quot;\n--\u0026quot;system\u0026quot; - Proviene de sistemas de Multiasistencia.\n--\u0026quot;external\u0026quot; - Solo login externo (operarios).\n--\u0026quot;api\u0026quot; - Autenticaci?n con client credentials: api externa\nclient_id (opcional): asociaci?n de usuario con \u0026quot;client_id\u0026quot; de JWT, para poder realizar filtros mediante la API. Uso futuro.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAgregar nuevos tipos de usuarios:\n\u0026quot;api\u0026quot; - Usuario de tipo API\n\u0026quot;operator\u0026quot; - Usuario de tipo operario.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eModificar tests en repositorio (y quiz?s mocks en servicios).\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"backend-api\"\u003eBackend: API\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eAgregar nuevos par?metros en Settings (preguntar a Lino los valores de estos par?metros):\nAWS_COGNITO_USER_POOL_ID: string, default ''\nAWS_COGNITO_USER_POOL_REGION: string, default ''\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAgregar nuevos campos de usuario (email) en Request, Response y domain entities.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eModificar tests de servicios y mocks.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"backend-domain\"\u003eBackend: Domain\u003c/h3\u003e\n\u003cp\u003e(hablar con Lino para solicitar claves de conexi?n a AWS)\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eAgregar boto3 a dependencias de poetry.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSe asume que la configuraci?n de AWS est? establecida en las variables de entorno de AWS.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eCrear clase AwsCognito (aws_cognito.py) en magenda/infrastructure/aws para conexi?n con sistema Cognito e implementar m?todos b?sicos.\ncreate_user: crea usuario en cognito.\nadd_group: a?ade un usuario a un grupo.\nchange_password: cambia la password del usuario por una password fija especificada.\nauthorize_user: inicia la autorizaci?n de un usuario (usado para la impersonaci?n).\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eCrear servicio de negocio en domain UserService para llamar a la clase AwsCognito y realizar operaciones de creaci?n/modificaci?n/eliminaci?n de usuario. Recibir? siempre una entidad de dominio User.\ncreate: crea un usuario, lo a?ade a un grupo y, dependiendo de su tipo, le resetea la password o env?a una confirmaci?n por email. \u003cstrong\u003e(PTE definir reglas)\u003c/strong\u003e\nupdate: modifica un usuario, pero por el momento solo cambiar? su grupo.\ndelete: desactiva un usuario (cambia su estado a deactivated).\nget_by_id: obtiene datos de usuario por su id.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"configurar-cognito-en-aws-arquitecto\"\u003eConfigurar Cognito en AWS: Arquitecto\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eConfigurar sistema: activar tipos de autenticaci?n (para usuarios y aplicaciones), configurar roles/grupos AWS de acceso para Magenda, configurar flujos.\u003c/li\u003e\n\u003cli\u003eCrear scripts IaC (Terraform) y pruebas.\u003c/li\u003e\n\u003cli\u003eCrear usuario Master para Magenda.\u003c/li\u003e\n\u003cli\u003eCrear client credentials de aplicaci?n para Magenda.\u003c/li\u003e\n\u003cli\u003eCrear usuario en tabla MAgenda.\u003c/li\u003e\n\u003cli\u003eDocumentaci?n para administradores del sistema.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"backend-autenticacin\"\u003eBackend: Autenticaci?n\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eLa password de settings (USERS_MASTER_PASSWORD) ha de cambiar, ya que necesita min?sculas, may?sculas, n?meros y s?mbolos.\u003c/li\u003e\n\u003cli\u003eCrear nuevo par?metro de settings con nombre AUTH_PASSWORD_SALT , de tipo string e incluir una cadena aleatoria.\u003c/li\u003e\n\u003cli\u003eAgregar par?metro para descargar certificado de validaci?n de JWT. Es la JWKS URI: https://cognito-idp.\u003cRegion\u003e.amazonaws.com/\u003cuserPoolId\u003e/.well-known/jwks.json (preguntar a Lino el UserPoolId)\u003c/li\u003e\n\u003cli\u003eValidaci?n de token JWT contra cognito: \u003ca href=\"https://gntrm.medium.com/jwt-authentication-with-fastapi-and-aws-cognito-1333f7f2729e\"\u003ehttps://gntrm.medium.com/jwt-authentication-with-fastapi-and-aws-cognito-1333f7f2729e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eManejo de usuarios de flujo Client Credentials (APIs externas)\nAl validar la token se ha de comprobar en la base de datos su grupo usando su id de usuario y asignarlo a la clase User.\u003c/li\u003e\n\u003cli\u003eReconstrucci?n de usuario interno User (grupo, permisos, nombre, etc.) para su uso en la gesti?n de API (current_user)\u003c/li\u003e\n\u003cli\u003eAgregar funcion de generaci?n de password ?nica para usuario usando AUTH_PASSWORD_SALT, cuyo algoritmo ser?:\nf\u0026quot;MA{hashlib.sha256(f\u0026quot;{username}{USERS_MASTER_PASSWORD}{AUTH_PASSWORD_SALT}\u0026quot;)}!\u0026quot;\nEs decir, concatena los campos, hace algoritmo SHA256 y a?ade MA al principio y ! al final.\u003c/li\u003e\n\u003cli\u003eAgregar endpoint de impersonaci?n (POST).\nRecibe en la request un id de usuario ({\u0026quot;username\u0026quot;: \u0026quot;1234567890\u0026quot;}), ha de realizar la operaci?n de \u0026quot;initiate-auth\u0026quot; (ver m?s arriba en comandos cli), la password ser? la indicada en el algoritnmo anterior.\nSolo el tipo de usuario \u0026quot;admin\u0026quot; puede realizar la impersonaci?n.\nDevuelve la token JWT recibida desde cognito.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"frontend-modificar-autenticacin\"\u003eFrontend: Modificar Autenticaci?n\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eAgregar par?metro de configuraci?n de URL de Login de cognito.\u003c/li\u003e\n\u003cli\u003eAgregar par?metro para descargar certificado de validaci?n de JWT. Es la JWKS URI: https://cognito-idp.\u003cRegion\u003e.amazonaws.com/\u003cuserPoolId\u003e/.well-known/jwks.json (preguntar a Lino el UserPoolId)\u003c/li\u003e\n\u003cli\u003eValidaci?n de Token JWT contra cognito usando aws-amplify (\u003ca href=\"https://dev.to/rodrigokamada/authentication-using-the-amazon-cognito-to-an-angular-application-ilh)\"\u003ehttps://dev.to/rodrigokamada/authentication-using-the-amazon-cognito-to-an-angular-application-ilh)\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003eRedirecci?n a pantalla de login de cognito si no est? loggeado.\u003c/li\u003e\n\u003cli\u003e?Crear URL de entrada en aplicaci?n para post-login?\u003c/li\u003e\n\u003cli\u003eAdmitir token en URLs (/?id_token=12345) y validarlas como si viniesen en header token.\nA valorar: se agregar? la token como Authorization Bearer y se eliminar? de la URL o se seguir? manteniendo SIEMPRE?\u003c/li\u003e\n\u003cli\u003ePersonalizaci?n pantalla de login para usuarios externos (modificar CSS y a?adir en AWS): \u003ca href=\"https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pools-app-ui-customization.html\"\u003ehttps://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pools-app-ui-customization.html\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n"}},"id":"XXXX","metadata":{"labels":[],"properties":{"content-appearance-published":{"value":"full-width"}}},"title":"ID 24 Autenticaci?n","type":"page","version":{"minorEdit":false,"number":2}}
```

*** ** * ** ***

But I get this answer (HTTP 400). Apart from using a deprecated API (which is fine for me at this moment, because others similar requests work just OK) I think the problem has to do with some content present in the input.

*** ** * ** ***

```
2023-11-02 13:00:38.949 TRACE rest: HTTP/2.0 400 Bad Request
Atl-Confluence-Via: h:confluence-prod-ap-3-3.prod.atl-paas.net
Atl-Traceid: 8754563b5ea74704849c1b0e4a4b46a2
Cache-Control: no-cache, no-store, must-revalidate
Content-Type: application/json
Date: Thu, 02 Nov 2023 12:00:38 GMT
Deprecation: Wed, 1 Mar 2023 00:00:00 GMT
Expires: Thu, 01 Jan 1970 00:00:00 GMT
Link: <https://developer.atlassian.com/cloud/confluence/changelog/#CHANGE-864>; rel="deprecation"
Nel: {"failure_fraction": 0.001, "include_subdomains": true, "max_age": 600, "report_to": "endpoint-1"}
Report-To: {"endpoints": [{"url": "https://dz8aopenkvv6s.cloudfront.net"}], "group": "endpoint-1", "include_subdomains": true, "max_age": 600}
Server: AtlassianEdge
Strict-Transport-Security: max-age=63072000; includeSubDomains; preload
Vary: Accept-Encoding
Warning: 299 - "Deprecated API"
X-Content-Type-Options: nosniff
X-Xss-Protection: 1; mode=block

{"statusCode":400,"data":{"authorized":true,"valid":true,"errors":[],"successful":true},"message":"com.atlassian.confluence.api.service.exceptions.BadRequestException: Content body cannot be converted to new editor format"}
```

*** ** * ** ***

```
?
```

Any ideas are welcome. Perhaps it is something obvious...

Regards.


Answers:
author: Fabio Racobaldo _Herzum_
body: Hi [@Francisco Mendez Losada](/t5/user/viewprofilepage/user-id/5355618) and welcome,

it seems that there are some missing parameters :

* version : current
* type : page

<https://developer.atlassian.com/cloud/confluence/rest/v1/api-group-content/#api-wiki-rest-api-content-id-put>

Please could you verify?

Fabio


author: Francisco Mendez Losada
body: Thank you for your answer [@Fabio Racobaldo _Herzum_](/t5/user/viewprofilepage/user-id/781528). After some trial and error I was able to determine that some HTML tag was unbalanced.


Tags: cloud

confluence-cloud