Como ver si estás Logueado en WordPress desde Go

Como ver si estás Logueado en WordPress desde Go

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

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.

Relacionados