Como ver si estás Logueado en WordPress desde Go
1 min de lectura

Como ver si estás Logueado en WordPress desde Go

167 palabras
Categorías:

Como prueba de concepto estoy haciendo una pequeña API en Golang que, en un Apache con mod_proxy, sirve ciertos contenidos a un WordPress.

El pequeño reto, que es realmente pequeño, es saber desde esa mini aplicación en Go, y mediante la cookie wordpress_logged_in_XXXXXX quien es el usuario (si está logueado).

Para ver como compone la cookie el WP sólo hay que ver el código fuente y es así como se podría resolver en Go

GitHub Gist
package main
import (
"crypto/hmac"
"crypto/md5"
"crypto/sha256"
"encoding/hex"
"fmt"
"strings"
)
type cookieWP struct {
User string
Scheme string
Expiration string
Token string
Hmac string
}
func main() {
// cookieName -> wordpress_logged_in + md5( domain )
// cookieName := `wordpress_logged_in_d33f7171d85009b773bd2aab4967e7f8`
// wp-config.php define('LOGGED_IN_KEY', [...]);
loggedKey := "TLA$Zt1tTX5&{V,`sa8^I&p%dA^CJ~,0t?]*dG}V8gW=5lGc1l{0hO3=.vJ+qbi-"
// wp-config.php define('LOGGED_IN_SALT', [...]);
loggedSalt := "=B^Bd+prt?@UVG=NClBUbq;}iY{d|5m 7Y4R3sws-+5ddEJHW,3J`{=.]OUGY1Hb"
// the content of cookie
cookieValue := `admin%7C1427358559%7Cg3JkuKWnFFTsynJkHRb7zplvCKQJH8rvmqPdOXDnctB%7Cc3510f74afcd0fd0ddb8e5096dd59d00f6843e5df645081723afa091286cef6a`
elements := strings.Split(cookieValue, `%7C`)
cookie := &cookieWP{
Scheme: "logged_in",
User: elements[0],
Expiration: elements[1],
Token: elements[2],
Hmac: elements[3],
}
// passFragment is the substring (8, 4 ) of db wp_users, field user_pass
// where user_login = cookie.User
// substring 8:4
passFragment := `a938`
fromKey := cookie.User + `|` + passFragment + `|` + cookie.Expiration + `|` + cookie.Token
hasher := hmac.New(md5.New, []byte(loggedKey+loggedSalt))
hasher.Write([]byte(fromKey))
hashed := hex.EncodeToString(hasher.Sum(nil))
hashercheck := hmac.New(sha256.New, []byte(hashed))
hashercheck.Write([]byte(cookie.User + `|` + cookie.Expiration + `|` + cookie.Token))
hashedcheck := hex.EncodeToString(hashercheck.Sum(nil))
fmt.Println("hashed ", cookie.Hmac, " -> ", hashedcheck)
if cookie.Hmac == hashedcheck {
fmt.Println("hello ", cookie.User)
} else {
fmt.Println("bad cookie for ", cookie.User)
}
}

Notas:

  1. No compruebo el valor de Expiration en este ejemplo

  2. Este código no me funcionará en el proyecto ya que cambiaré, mediante un hook en WP, el como se crea y como se valida la cookie añadiendo 2 más al método de hash ( para dar un poco de seguridad extra ): La IP del usuario validado y el Navegador utilizado (Agent), ya que considero demasiado “débil” el formato por defecto de WP.

Comentarios

Últimas Entradas

5 min

1031 palabras

Hace unos días me topé con un artículo que me dejó literalmente con la boca abierta. No es que sea nuevo - en realidad es de enero de 2026, pero bueno, a veces llega tarde a mi radar - pero la combinación de tecnologías y la historia detrás me parecen fascinantes.

Se trata de TinyEMU-Go: un emulador de RISC-V escrito completamente en Go, portado desde C usando Claude. Y lo mejor: puedes ejecutar un Linux completo con un solo comando.

1 min

106 palabras

Options Pattern in Golang

Option pattern is a functional programming pattern that is used to provide optional arguments to a function that can be used to modify its behavior.

How to create a simple event streaming in Laravel?

Event streams provide you with a way to send events to the client without having to reload the page. This is useful for things like updating the user interface in real-time changes are made to the database.

5 min

982 palabras

Momentos de cambios, momentos de evolución, una constante en mi vida, con el 25 aniversario de la creación de la web he entrado en modo “revisión” y estoy altamente desconcertado.

Llevo el mismo tiempo (25 años) haciendo cosas, disfrutando, siempre con el mismo concepto y particularidad: Disfrute y resultado, pero ya hace mucho que no es relevante (cosa que tambien es poco relevante).

Me he dado cuenta que lo habitual es hacer cosas dentro de tu zona de confort, y yo nunca he tenido una ni he sabido que podía existir, de ahí que haya tocado y hecho cosas poco usuales o quizás a “destiempo”, cuando cierta tecnología se podía de moda “Buzz” hacía tiempo que no lo utilizaba porque no me aportaba lo que me aportaba otra cosa, …

1 min

58 palabras

Desde Cayley podemos hacer consultas vía REST en dos “lenguajes”: MQL y una versión reducida de Gremlin

Con el siguiente ejemplo podemos obtener los skills más habituales de personas que pertenezcan a una industria, dentro del sector “Edu”

GitHub Gist
var c = { } ;
var x = graph.V("edu").In('in_sector').In('in_industry').Out('has_skill').Tag("id").ForEach(
function ( d ) {
if ( c[d.id] ) {
c[d.id] ++;
} else {
c[d.id] = 1 ;
}
d.count = c[d.id] ;
}
) ;
g.Emit( c ) ;
1 min

144 palabras

Theme My Login, es un plugin que nos permite adaptar a nuestras necesidades todos los elementos relativos al: Registro, Entrada, … de un WordPress.

Dentro de la carpeta del plugin encontramos las plantillas en la carpeta “templates”, como es de rigor, no debemos modificar esas plantillas, podemos copiarlas a el raiz de nuestra plantilla y ahí modificarlas, momento a partir del cual esas plantillas serán las utilizadas por nuestra web, sin que una actualización del plugin afecte a los cambios realizados.