PHP library for Mojang's Yggdrasil authentication system.
<?php | |
class Yggdrasil { | |
private $server = 'https://authserver.mojang.com'; | |
private $client_token = null; | |
private $username = null; | |
private $access_token = null; | |
// Construct a new instance for the given username, with optional client token and access token. | |
// Client token can be null, but this will invalidate all other sessions for this user once | |
// successfully authenticated. | |
public function Yggdrasil($username, $client_token = null, $access_token = null) { | |
$this->username = $username; | |
$this->client_token = $client_token; | |
$this->access_token = $access_token; | |
} | |
// Get/set the client token. | |
public function client_token($client_token = null) { | |
if ($client_token != null) | |
$this->client_token = $client_token; | |
return $this->client_token; | |
} | |
// Get/set the access token. | |
public function access_token($access_token = null) { | |
if ($access_token != null) | |
$this->access_token = $access_token; | |
return $this->access_token; | |
} | |
// Used internally to dispatch requests. | |
private function dispatch($uri, $data) { | |
return json_decode( | |
@file_get_contents( | |
$this->server . $uri, | |
false, | |
stream_context_create(array( | |
'http' => array( | |
'method' => 'POST', | |
'header' => 'Content-Type: application/json' . PHP_EOL, | |
'content' => json_encode($data) | |
) | |
)) | |
), | |
true | |
); | |
} | |
// Get an access token. | |
// http://wiki.vg/Authentication#Authenticate | |
public function authenticate($password) { | |
$result = $this->dispatch('/authenticate', array( | |
'clientToken' => $this->client_token, | |
'agent' => array( | |
'name' => 'Minecraft', | |
'version' => 1 | |
), | |
'username' => $this->username, | |
'password' => $password | |
)); | |
$this->client_token = $result['clientToken']; | |
$this->access_token = $result['accessToken']; | |
return $result; | |
} | |
// Refresh an access token. Can also be used to validate an access token. | |
// http://wiki.vg/Authentication#Refresh | |
public function refresh() { | |
$result = $this->dispatch('/refresh', array( | |
'clientToken' => $this->client_token, | |
'accessToken' => $this->access_token | |
)); | |
$this->access_token = $result['accessToken']; | |
return $result; | |
} | |
// Check if an access token is the newest one associated with this account. | |
// http://wiki.vg/Authentication#Validate | |
public function validate() { | |
return $this->dispatch('/validate', array( | |
'accessToken' => $this->access_token | |
)); | |
} | |
// Invalidate all access tokens associated with this account. | |
// http://wiki.vg/Authentication#Signout | |
public function signout($password) { | |
return $this->dispatch('/signout', array( | |
'username' => $this->username, | |
'password' => $password | |
)); | |
} | |
// Invalidate our access token. | |
// http://wiki.vg/Authentication#Invalidate | |
public function invalidate() { | |
return $this->dispatch('/invalidate', array( | |
'clientToken' => $this->client_token, | |
'accessToken' => $this->access_token | |
)); | |
} | |
// Which variables to keep when serialized. | |
public function __sleep() { | |
return array( | |
'client_token', | |
'username', | |
'access_token' | |
); | |
} | |
// What to do when unserialized. | |
public function __wakeup() { | |
} | |
} |
This comment has been minimized.
This comment has been minimized.
JorgenVatle
commented
Apr 28, 2016
There is a typo on line 112 for Also, the |
This comment has been minimized.
This comment has been minimized.
MatsAnd
commented
May 22, 2016
Someone know if this still works? |
This comment has been minimized.
This comment has been minimized.
@Warthelm Keen eye ;) I've not been using those functions myself, so never noticed. This Gist was created before the code was tested. The typo in invalidate() has been fixed, and I suggest you use refresh() to validate tokens. |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
This comment has been minimized.
DeveloperLen commentedOct 19, 2014
at the end, has to added a "?>"