{"id":3699,"date":"2026-04-23T10:49:32","date_gmt":"2026-04-23T10:49:32","guid":{"rendered":"https:\/\/nut.secture-test.com\/?page_id=3699"},"modified":"2026-04-29T12:36:57","modified_gmt":"2026-04-29T12:36:57","slug":"callback","status":"publish","type":"page","link":"https:\/\/nut.secture-test.com\/eu\/auth\/apple\/callback\/","title":{"rendered":"callback"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"3699\" class=\"elementor elementor-3699\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-b4d4ccc e-flex e-con-boxed e-con e-parent\" data-id=\"b4d4ccc\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;,&quot;jet_parallax_layout_list&quot;:[]}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-element elementor-element-f31f77f e-con-full e-flex e-con e-child\" data-id=\"f31f77f\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;jet_parallax_layout_list&quot;:[],&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-ad89d18 elementor-invisible elementor-widget elementor-widget-image\" data-id=\"ad89d18\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;_animation&quot;:&quot;pulse&quot;}\" data-widget_type=\"image.default\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img fetchpriority=\"high\" decoding=\"async\" width=\"800\" height=\"983\" src=\"https:\/\/nut.secture-test.com\/wp-content\/uploads\/2026\/04\/Apple_logo_black.svg\" class=\"attachment-large size-large wp-image-3702\" alt=\"\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-f0234d4 elementor-widget elementor-widget-html\" data-id=\"f0234d4\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<div style=\"width:100%; max-width:none; margin:16px 0; padding:0 24px; font-family:inherit; box-sizing:border-box;\">\r\n  <p id=\"apple-callback-status\" style=\"margin:0; font-size:22px; font-weight:600; color:#1f1f1f; text-align:right; line-height:1.35;\">\r\n    Procesando acceso con Apple\u2026\r\n  <\/p>\r\n<\/div>\r\n\r\n<script>\r\n(function () {\r\n  if (window.__nutAppleCallbackPageHooked) return;\r\n  window.__nutAppleCallbackPageHooked = true;\r\n\r\n  const API_BASE = \"https:\/\/nutrition.lipiwell.com\";\r\nconst APPLE_REDIRECT_URI = \"https:\/\/nutrition.lipiwell.com\/auth-social\/apple-web\";\r\n\r\n  const GENERIC_APPLE_ERROR = \"No se ha podido iniciar sesi\u00f3n. Int\u00e9ntalo de nuevo o prueba con otro m\u00e9todo.\";\r\n  const APPLE_CANCELLED_MESSAGE = \"Inicio de sesi\u00f3n cancelado.\";\r\n\r\n  const statusEl = document.getElementById(\"apple-callback-status\");\r\n\r\nfunction setStatus(text, ok) {\r\n  if (!statusEl) return;\r\n\r\n  statusEl.textContent = text || \"\";\r\n  statusEl.style.color = ok ? \"#0f7a3a\" : \"#b42318\";\r\n  statusEl.style.fontWeight = \"600\";\r\n  statusEl.style.fontSize = \"22px\";\r\n  statusEl.style.lineHeight = \"1.25\";\r\n  statusEl.style.textAlign = \"left\";\r\n  statusEl.style.margin = \"0\";\r\n  statusEl.style.width = \"100%\";\r\n}\r\n  function parseJwtPayload(token) {\r\n    try {\r\n      if (!token) return {};\r\n\r\n      const base64Url = token.split(\".\")[1];\r\n      if (!base64Url) return {};\r\n\r\n      let base64 = base64Url.replace(\/-\/g, \"+\").replace(\/_\/g, \"\/\");\r\n\r\n      while (base64.length % 4) {\r\n        base64 += \"=\";\r\n      }\r\n\r\n      const jsonPayload = decodeURIComponent(\r\n        atob(base64)\r\n          .split(\"\")\r\n          .map(function (c) {\r\n            return \"%\" + (\"00\" + c.charCodeAt(0).toString(16)).slice(-2);\r\n          })\r\n          .join(\"\")\r\n      );\r\n\r\n      return JSON.parse(jsonPayload);\r\n    } catch (_) {\r\n      return {};\r\n    }\r\n  }\r\n\r\n  async function runAppleCallback() {\r\n    const params = new URLSearchParams(window.location.search);\r\n\r\n    const code = params.get(\"code\") || \"\";\r\n    const idToken = params.get(\"id_token\") || \"\";\r\n    const error = params.get(\"error\") || \"\";\r\n\r\n    if (error) {\r\n      if (error === \"user_cancelled_authorize\" || error === \"access_denied\") {\r\n        setStatus(APPLE_CANCELLED_MESSAGE, false);\r\n        return;\r\n      }\r\n\r\n      setStatus(GENERIC_APPLE_ERROR, false);\r\n      return;\r\n    }\r\n\r\n    if (!code) {\r\n      setStatus(GENERIC_APPLE_ERROR, false);\r\n      return;\r\n    }\r\n\r\n    setStatus(\"Procesando acceso con Apple\u2026\", true);\r\n\r\n    try {\r\n      const applePayload = idToken ? parseJwtPayload(idToken) : {};\r\n      const emailFromApple = applePayload && applePayload.email ? applePayload.email : \"\";\r\n\r\n      const res = await fetch(API_BASE + \"\/v2\/auth-social\", {\r\n        method: \"POST\",\r\n        headers: {\r\n          \"Content-Type\": \"application\/json\",\r\n          \"Accept\": \"application\/json\"\r\n        },\r\n        body: JSON.stringify({\r\n          username: emailFromApple,\r\n          provider: \"apple\",\r\n          providerAuthorizationCode: code,\r\n          authorizationCode: code,\r\n          providerToken: idToken || undefined,\r\n          token: idToken || undefined,\r\n          clientId: \"com.nutritionlw.web\",\r\n          redirectUri: APPLE_REDIRECT_URI\r\n        })\r\n      });\r\n\r\n      const raw = await res.text();\r\n      let data = {};\r\n\r\n      try {\r\n        data = raw ? JSON.parse(raw) : {};\r\n      } catch (_) {}\r\n\r\n      console.log(\"APPLE CALLBACK STATUS:\", res.status);\r\n      console.log(\"APPLE CALLBACK BODY:\", raw);\r\n\r\n      if (!res.ok) {\r\n        setStatus(GENERIC_APPLE_ERROR, false);\r\n        return;\r\n      }\r\n\r\n      if (!data.token || !data.refreshToken) {\r\n        setStatus(GENERIC_APPLE_ERROR, false);\r\n        return;\r\n      }\r\n\r\n      localStorage.setItem(\"nutrition_token\", data.token);\r\n      localStorage.setItem(\"nutrition_refresh_token\", data.refreshToken);\r\n\r\n      const finalEmail =\r\n        (data && data.username) ||\r\n        emailFromApple ||\r\n        \"\";\r\n\r\n      if (finalEmail) {\r\n        localStorage.setItem(\"nutrition_user_email\", finalEmail);\r\n      }\r\n\r\n      setStatus(\"Sesi\u00f3n iniciada correctamente con Apple. Redirigiendo\u2026\", true);\r\n\r\n      setTimeout(function () {\r\n        window.location.replace(\"\/comprar\/\");\r\n      }, 300);\r\n    } catch (err) {\r\n      console.log(\"APPLE CALLBACK ERROR:\", err);\r\n      setStatus(GENERIC_APPLE_ERROR, false);\r\n    }\r\n  }\r\n\r\n  if (document.readyState === \"loading\") {\r\n    document.addEventListener(\"DOMContentLoaded\", runAppleCallback);\r\n  } else {\r\n    runAppleCallback();\r\n  }\r\n})();\r\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Procesando acceso con Apple\u2026<\/p>","protected":false},"author":1,"featured_media":0,"parent":3697,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-3699","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/nut.secture-test.com\/eu\/wp-json\/wp\/v2\/pages\/3699","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nut.secture-test.com\/eu\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/nut.secture-test.com\/eu\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/nut.secture-test.com\/eu\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/nut.secture-test.com\/eu\/wp-json\/wp\/v2\/comments?post=3699"}],"version-history":[{"count":46,"href":"https:\/\/nut.secture-test.com\/eu\/wp-json\/wp\/v2\/pages\/3699\/revisions"}],"predecessor-version":[{"id":3982,"href":"https:\/\/nut.secture-test.com\/eu\/wp-json\/wp\/v2\/pages\/3699\/revisions\/3982"}],"up":[{"embeddable":true,"href":"https:\/\/nut.secture-test.com\/eu\/wp-json\/wp\/v2\/pages\/3697"}],"wp:attachment":[{"href":"https:\/\/nut.secture-test.com\/eu\/wp-json\/wp\/v2\/media?parent=3699"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}