1<?php 2 3namespace OAuth\Plugin; 4 5use OAuth\OAuth2\Service\EveOnline; 6use helper_plugin_evesso; 7 8/** 9 * Class DoorkeeperAdapter 10 * 11 * This is an example on how to implement your own adapter for making DokuWiki login against 12 * a custom oAuth provider. The used Generic Service backend expects the authorization and 13 * token endpoints to be configured in the DokuWiki backend. 14 * 15 * Your custom API to access user data has to be implemented in the getUser function. The one here 16 * is setup to work with the demo setup of the "Doorkeeper" ruby gem. 17 * 18 * @link https://github.com/doorkeeper-gem/doorkeeper 19 * @package OAuth\Plugin 20 */ 21class EveOnlineAdapter extends AbstractAdapter { 22 23 /** 24 * Retrieve the user's data 25 * 26 * The array needs to contain at least 'user', 'mail', 'name' and optional 'grps' 27 * 28 * @return array 29 */ 30 public function getUser() { 31 $http = new \DokuHTTPClient(); 32 $data = array(); 33 34 //Get access_token 35 $access_token = $this->oAuth->getStorage()->retrieveAccessToken($this->oAuth->service())->getAccessToken(); 36 37 //Split JWT into 3 parts > Take the 2nd part (payload) > base64 decode it > json decode it 38 $jwt_payload = json_decode(base64_decode(str_replace('_', '/', str_replace('-','+',explode('.', $access_token)[1])))); 39 40 //Get character name and id 41 $character_name=$jwt_payload->name; //Character Name 42 $character_id=explode(":",$jwt_payload->sub)[2]; //Charater ID (remove the extra stuff) 43 44 if (!isset($character_id)) { 45 return $data; 46 } 47 48 //Set character name and id 49 $data['user'] = $character_name; 50 $data['name'] = $character_name; 51 $data['mail'] = $character_id . '@eveonline.com'; 52 53 //Get character corporation, alliance, and faction 54 $affiliation_post = $http->post('https://esi.evetech.net/latest/characters/affiliation/?datasource=tranquility', '[' . $character_id . ']'); 55 if ($affiliation_post === false) { 56 return $data; 57 } 58 $affiliation_result = json_decode($affiliation_post, true); 59 60 $ids = array(); 61 foreach ($affiliation_result as $entry) { 62 if (isset($entry['alliance_id'])) { 63 $ids[] = $entry['alliance_id']; 64 } 65 if (isset($entry['faction_id'])) { 66 $ids[] = $entry['faction_id']; 67 } 68 $ids[] = $entry['corporation_id']; 69 } 70 71 //Convert ids to names 72 $names_post = $http->post('https://esi.evetech.net/latest/universe/names/?datasource=tranquility', '[' . implode(",", $ids) . ']'); 73 if ($names_post === false) { 74 return $data; 75 } 76 $names_result = json_decode($names_post, true); 77 78 foreach ($names_result as $entry) { 79 $category = $entry['category']; 80 if ($category == 'corporation') { 81 $data['grps'][] = helper_plugin_evesso::CORPORATION_PREFIX . $entry['name']; 82 } elseif ($category == 'alliance') { 83 $data['grps'][] = helper_plugin_evesso::ALLIANCE_PREFIX . $entry['name']; 84 } elseif ($category == 'faction') { 85 $data['grps'][] = helper_plugin_evesso::FACTION_PREFIX . $entry['name']; 86 } 87 } 88 89 return $data; 90 } 91 92 public function getScope() { 93 return array(EveOnline::SCOPE_PUBLIC_DATA); 94 } 95 96 public function login() { 97 $parameters = array(); 98 $parameters['state'] = urlencode(base64_encode(json_encode(array('state' => md5(rand()))))); 99 $this->storage->storeAuthorizationState($this->oAuth->service(), $parameters['state']); 100 $url = $this->oAuth->getAuthorizationUri($parameters); 101 send_redirect($url); 102 } 103}