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

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

Artículos relacionados

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.