Hilfe zum CSRFTOKEN benötigt (alte API)



  • Ich nutze die API für den Abruf von Kalenderdaten und habe mir das Script mit Hilfe einiger Beispielscripts zusammengebaut. Allerdings enthalten die Beispielscripts noch nicht den Abruf des Tokens.

    In der Hilfe heißt es:
    Um den Token zu bekommen, ruft man, nachdem man eingeloggt ist die Api /api/csrftoken auf.

    Könnte mir jemand auf die Sprünge helfen, wie das in PHP aussehen würde?

    Danke für eure Mühe, einem Laien auf die Sprünge zu helfen.



  • Hi,
    bin da auch gerade drüber gestolpert.. hab das jetzt mal so gelöst:

    function CT_getCoreDomain($domain) {
        $pos = strpos($domain, "://");
        if($pos !== false)
            $domain = substr($domain, $pos + 3);
        
        $pos = strpos($domain, "/");
        if($pos !== false)
            $domain = substr($domain, 0, $pos);
        
        $pos = strpos($domain, "?");
        if($pos !== false)
            $domain = substr($domain, 0, $pos);
        
        return $domain;
    }
    
    function &getCookies(){
    	static $CT_cookies = array();
    	return $CT_cookies;
    }
    
    function CT_getCookies() {
    	$CT_cookies = &getCookies();
    	$res = "";
    	foreach ($CT_cookies as $key => $cookie) {
    		$res .= "$key=$cookie; ";
    	}
    	return $res;
    }
    
    function CT_saveCookies($r) {
    	$CT_cookies = &getCookies();
    	foreach ($r as $hdr) {
    		if (preg_match('/^Set-Cookie:\s*([^;]+)/', $hdr, $matches)) {
    			parse_str($matches[1], $tmp);
    			$CT_cookies += $tmp;
    		}
    	}
    }
    
    function CTNew_getRequest($url, $data) {
        $header = "Cookie: ". CT_getCookies() . "\r\nContent-type: application/x-www-form-urlencoded\r\n";
           
        $options = array(
    		'http'=>array(
    			'header' => $header,
    			'method' => 'GET',
    			'content' => http_build_query($data),
                'ignore_errors' => true,
    		)
    	);
    	$context = stream_context_create($options);
    	$result = file_get_contents($url, false, $context);
        
        $status_line = $http_response_header[0];
        preg_match('{HTTP\/\S*\s(\d{3})}', $status_line, $match);
        $status = $match[1];
            if($status !== "200")
            throw new Exception("$url request failed, with $status.");
            
        $obj = json_decode($result);
    	CT_saveCookies($http_response_header);
    	return $obj;
    }
    
    function CT_getCSRFToken($url){
        static $token = ""; // cache
        if(!empty($token))
            return $token;
        try {
            $result = CTNew_getRequest("https://" . CT_getCoreDomain($url) . "/api/csrftoken", array());
            $token = $result->data;
            return $token;
        } catch(Exception $ex) {
            echo 'CT Error: ' .  $ex->getMessage() . "";
        }
        return "";
    }
    
    function CT_sendRequest($url, $data, $csrf_token_required = true) {
        $header = "Cookie: ". CT_getCookies() . "\r\nContent-type: application/x-www-form-urlencoded\r\n";
        if($csrf_token_required)
            $header .= "csrf-token: " . CT_getCSRFToken($url) . "\r\n";
    	$options = array(
    		'http'=>array(
    			'header' => $header,
    			'method' => 'POST',
    			'content' => http_build_query($data),
    		)
    	);
        $context = stream_context_create($options);
    	$result = file_get_contents($url, false, $context);
        $obj = json_decode($result);
    	if ($obj->status == 'error') {
    		echo "There is an error: $obj->message";
    	}
    	CT_saveCookies($http_response_header);
    	return $obj;
    }
    
    function CT_login($domain){
    	$url = $domain . 'login/ajax';
    
    	// Login info of EGP Bot's account
    	$token = ""; // todo - fill me
    	$id = 0; // todo - fill me
    
    	// Now use token to login 
    	$data = array('func' => 'loginWithToken', 
    				  'token' => $token,
    				  'id' => $id,
    				  'directtool' => 'Me' // todo: fillme
    			);
    	$result = CT_sendRequest($url, $data, false);
    	return ($result->status == "success");
    }
    
    function CT_logout($domain){
    	$url = $domain . 'login/ajax';
    
    	$data = array('func' => 'logout');
    	$result = CT_sendRequest($url, $data);
    }
    

    merke: beim Login, kann man noch kein CSRF Token angeben -> extra parameter bei CT_sendRequest

    Die $domain parameter von CT_logout und CT_login sind jeweils https://xxx/?q= daher muss für CTNew_getRequest der query teil abgeschnitten werden..

    Hoffe das hilft, viele Grüße,
    Joachim

    Edit: solltest du zufälligerweise irgenwelche von meinen Beispielen (https://github.com/fodinabor/) herangezogen haben: die sind jetzt alle up-to-date.



  • @fodinabor
    HERZLICHEN DANK! Das hat mir sehr geholfen.


Log in to reply