SELFPHP: Version 5.8.2 Befehlsreferenz - Tutorial – Kochbuch – Forum für PHP Einsteiger und professionelle Entwickler

SELFPHP


Professional CronJob-Service

Suche



CronJob-Service    
bei SELFPHP mit ...



 + minütlichen Aufrufen
 + eigenem Crontab Eintrag
 + unbegrenzten CronJobs
 + Statistiken
 + Beispielaufrufen
 + Control-Bereich

Führen Sie mit den CronJobs von SELFPHP zeitgesteuert Programme auf Ihrem Server aus. Weitere Infos



:: Buchempfehlung ::

TYPO3 Kochbuch

TYPO3 Kochbuch zur Buchempfehlung
 

:: Anbieterverzeichnis ::

Globale Branchen

Informieren Sie sich über ausgewählte Unternehmen im Anbieterverzeichnis von SELFPHP  

 

:: Newsletter ::

Abonnieren Sie hier den kostenlosen SELFPHP Newsletter!

Vorname: 
Name:
E-Mail:
 
 

Zurück   PHP Forum > SELFPHP > PHP für Fortgeschrittene und Experten

PHP für Fortgeschrittene und Experten Fortgeschrittene und Experten können hier über ihre Probleme und Bedenken talken

Antwort
 
Themen-Optionen Ansicht
  #1  
Alt 27.01.2013, 16:28:17
Tuxman Tuxman ist offline
Anfänger
 
Registriert seit: Dec 2006
Beiträge: 83
Twitter/OAuth: Autorisierung immer zweimal nötig

Ich betreibe aus Jux http://stupsbot.org. Dort ist es unter anderem möglich, seinen Twitteraccount zu verifizieren, um erweiterte Funktionen nutzen zu können. Generell ist das Anmelden kein Problem, jedoch muss ein Nutzer die Rechte für Stupsbot.org immer zweimal bestätigen (er gelangt zweimal auf Twitters Autorisieren-Seite).

Der Code für die userlogin.php, die bei Klick auf "Anmelden" ausgelöst wird, ist (außer den Zugriffskeys in der config.php) dieser:

PHP-Code:
<?php
session_start
();

// ( ... hier div. Debugausgaben ... )

require_once('config.php');

if (isset(
$_GET["denied"])) {
    
// Benutzer hat die Anmeldung abgebrochen. Schade.
    
session_unset();
    
session_destroy();
}
elseif (!isset(
$_SESSION["oauth_request_token"])) {
    
// Der Benutzer hat noch keine Anmeldung.
    
$oauth = new OAuth($consumer_key,$consumer_secret,OAUTH_SIG_METHOD_HMACSHA1,OAUTH_AUTH_TYPE_URI);

    
$requestUrl   'http://api.twitter.com/oauth/request_token';
    
$authorizeUrl 'http://api.twitter.com/oauth/authorize';

    
$tokenInfo                       $oauth->getRequestToken($requestUrl);
    
$_SESSION['oauth_request_token'] = $tokenInfo['oauth_token_secret'];

    
$location $authorizeUrl '?oauth_token=' $tokenInfo['oauth_token'];
    
header('Location: ' $location);
}
elseif (!isset(
$_SESSION["oauth_token"])) {
    if (!isset(
$_GET['oauth_token'])) {
        
// Der Benutzer ist noch angemeldet, aber seine Session ist irgendwie verschwunden. o_O
        // Vermutlich Browser neu gestartet oder so etwas. ;-)
        // Daher bekommt er auch kein neues oauth_token. Kein Problem, holen wir ihm halt ein neues.
        
session_unset();
        
session_destroy();
        
header("Location: index.php");
    }
    
$oauth = new OAuth($consumer_key,$consumer_secret,OAUTH_SIG_METHOD_HMACSHA1,OAUTH_AUTH_TYPE_URI);

    
$accessUrl 'http://api.twitter.com/oauth/access_token';

    
$oauth->setToken($_GET['oauth_token'], $_SESSION['oauth_request_token']);
    
$tokenInfo $oauth->getAccessToken($accessUrl);

    
$_SESSION["oauth_token"]  = $tokenInfo['oauth_token'];
    
$_SESSION['oauth_token_secret'] = $tokenInfo['oauth_token_secret'];

    
$oauth->setToken($_SESSION['oauth_token'], $_SESSION['oauth_token_secret']);

    
$oauth->fetch('https://api.twitter.com/1.1/account/verify_credentials.json');
    
$json json_decode($oauth->getLastResponse());
    
$_SESSION["username"] = (string)$json->screen_name// got it. ;-)
    
header("Location: index.php");
}
elseif (isset(
$_SESSION["username"])) {
    
// Sollte doch alles in Ordnung sein. :-)
    // Alle anderen Fälle werden mir hoffentlich gemeldet. ;-)
    
header("Location: index.php");
}
?>
Wo liegt mein Denkfehler?
__________________
tuxproject.de
Mit Zitat antworten
  #2  
Alt 27.01.2013, 20:39:10
Benutzerbild von meikel (†)
meikel (†) meikel (†) ist offline
SELFPHP Guru
 
Registriert seit: Dec 2003
Ort: Erfurt
Alter: 75
Beiträge: 4.001
AW: Twitter/OAuth: Autorisierung immer zweimal nötig

Der Link auf die verwendete OAuth Klasse fehlt.
Mit Zitat antworten
  #3  
Alt 27.01.2013, 21:51:53
Tuxman Tuxman ist offline
Anfänger
 
Registriert seit: Dec 2006
Beiträge: 83
AW: Twitter/OAuth: Autorisierung immer zweimal nötig

Ist die normale ("normale") OAuth-Klasse: http://pecl.php.net/package/oauth
__________________
tuxproject.de
Mit Zitat antworten
  #4  
Alt 27.01.2013, 22:46:33
Benutzerbild von meikel (†)
meikel (†) meikel (†) ist offline
SELFPHP Guru
 
Registriert seit: Dec 2003
Ort: Erfurt
Alter: 75
Beiträge: 4.001
AW: Twitter/OAuth: Autorisierung immer zweimal nötig

Zitat:
Zitat von Tuxman Beitrag anzeigen
Ist die normale ("normale") OAuth-Klasse: http://pecl.php.net/package/oauth
OK.

Teste mal folgendes:
PHP-Code:
    $_SESSION['oauth_request_token'] = $tokenInfo['oauth_token_secret'];
    
$location $authorizeUrl '?oauth_token=' $tokenInfo['oauth_token'];

session_write_close();

    
header('Location: ' $location); 

exit; 
...
PHP-Code:
#        session_unset();
#        session_destroy();

$_SESSION = array();
session_write_close();
        
header("Location: index.php");  # korrekten URI verwenden (siehe Handbuch)
exit; 
PHP-Code:
    $_SESSION["username"] = (string)$json->screen_name// got it. ;-)
session_write_close();
    
header("Location: index.php");   # korrekten URI verwenden (siehe Handbuch)
exit; 
...
PHP-Code:
elseif (isset($_SESSION["username"])) {
    
// Sollte doch alles in Ordnung sein. :-)
    // Alle anderen Fälle werden mir hoffentlich gemeldet. ;-)
    
header("Location: index.php");   # korrekten URI verwenden (siehe Handbuch)
exit;

http://de1.php.net/manual/de/function.header.php
Zitat:
HTTP/1.1 verlangt einen absoluten URI inklusive dem Schema, Hostnamen und absoluten Pfad als Argument von » Location:, aber manche Clients akzeptieren auch relative URIs. Gewöhnlich können Sie mittels $_SERVER['HTTP_HOST'], $_SERVER['PHP_SELF'] und dirname() aus einem relativen Link einen absoluten URI selbst erstellen:
http://de1.php.net/manual/de/functio...rite-close.php
Zitat:
session_write_close — Speichert die Session-Daten und beendet die Session
Ein session_write_close() vor einem Location Header ist angeraten, weil man dann sicher sein kann, daß die Session auch im File gebunkert wird.

Das exit nach einem Location Header ist erforderlich, weil in dem Fall kein Content mehr kommen darf, das den Client verwirren könnte.
Mit Zitat antworten
  #5  
Alt 27.01.2013, 22:58:47
Tuxman Tuxman ist offline
Anfänger
 
Registriert seit: Dec 2006
Beiträge: 83
AW: Twitter/OAuth: Autorisierung immer zweimal nötig

Ah, wusste ich nicht.

Ich teste das mal eben, Moment.
__________________
tuxproject.de
Mit Zitat antworten
  #6  
Alt 27.01.2013, 23:08:16
Tuxman Tuxman ist offline
Anfänger
 
Registriert seit: Dec 2006
Beiträge: 83
AW: Twitter/OAuth: Autorisierung immer zweimal nötig

Danke, das war genau das Problem! :-) (Na ja, eines der Probleme.)
Es funktioniert nun generell.

ABER:

Ein Fehler bleibt aber bestehen:
Nach einem Schließen des Browsers (ohne manuelles Ausloggen) muss man sich weiterhin zweimal bei Twitter autorisieren bzw. mein Code leitet weiterhin zweimal auf die Autorisierenseite...?

Aktuelle Version:

PHP-Code:
<?php
// ...

require_once('config.php');

$indexurl "http://" $_SERVER['HTTP_HOST'] . rtrim(dirname($_SERVER['PHP_SELF']), '/\\') . "/index.php";

if (isset(
$_GET["denied"])) {
    
// Benutzer hat die Anmeldung abgebrochen. Schade.
    
session_unset();
    
session_destroy();
}
elseif (!isset(
$_SESSION["oauth_request_token"])) {
    
// Der Benutzer hat noch keine Anmeldung.
    
$oauth = new OAuth($consumer_key,$consumer_secret,OAUTH_SIG_METHOD_HMACSHA1,OAUTH_AUTH_TYPE_URI);

    
$requestUrl   'http://api.twitter.com/oauth/request_token';
    
$authorizeUrl 'http://api.twitter.com/oauth/authorize';

    
$tokenInfo                       $oauth->getRequestToken($requestUrl);
    
$_SESSION['oauth_request_token'] = $tokenInfo['oauth_token_secret'];

    
$location $authorizeUrl '?oauth_token=' $tokenInfo['oauth_token'];

    
session_write_close();
    
    
header('Location: ' $location);
    exit;
}
elseif (!isset(
$_SESSION["oauth_token"])) {
    if (!isset(
$_GET['oauth_token'])) {
        
// Der Benutzer ist noch angemeldet, aber seine Session ist irgendwie verschwunden. o_O
        // Vermutlich Browser neu gestartet oder so etwas. ;-)
        // Daher bekommt er auch kein neues oauth_token. Kein Problem, holen wir ihm halt ein neues.
        
$_SESSION = array(); // Sitzung leeren

        
session_write_close();

        
header("Location: $indexurl");
        exit;
    }
    
$oauth = new OAuth($consumer_key,$consumer_secret,OAUTH_SIG_METHOD_HMACSHA1,OAUTH_AUTH_TYPE_URI);

    
$accessUrl 'http://api.twitter.com/oauth/access_token';

    
$oauth->setToken($_GET['oauth_token'], $_SESSION['oauth_request_token']);
    
$tokenInfo $oauth->getAccessToken($accessUrl);

    
$_SESSION["oauth_token"]  = $tokenInfo['oauth_token'];
    
$_SESSION['oauth_token_secret'] = $tokenInfo['oauth_token_secret'];

    
$oauth->setToken($_SESSION['oauth_token'], $_SESSION['oauth_token_secret']);

    
$oauth->fetch('https://api.twitter.com/1.1/account/verify_credentials.json');
    
$json json_decode($oauth->getLastResponse());
    
$_SESSION["username"] = (string)$json->screen_name// got it. ;-)

    
session_write_close();
    
    
header("Location: $indexurl");
    exit;
}
elseif (isset(
$_SESSION["username"])) {
    
// Sollte doch alles in Ordnung sein. :-)
    // Alle anderen Fälle werden mir hoffentlich gemeldet. ;-)
    
header("Location: $indexurl");
    exit;
}
?>
__________________
tuxproject.de
Mit Zitat antworten
  #7  
Alt 28.01.2013, 01:43:35
Benutzerbild von meikel (†)
meikel (†) meikel (†) ist offline
SELFPHP Guru
 
Registriert seit: Dec 2003
Ort: Erfurt
Alter: 75
Beiträge: 4.001
AW: Twitter/OAuth: Autorisierung immer zweimal nötig

Zitat:
Zitat von Tuxman Beitrag anzeigen
Danke, das war genau das Problem! :-) (Na ja, eines der Probleme.)
Ich kenne das Handling der Twitter-API nur oberflächlich und habe ein paar Fragen:
1. wie lautet der URI für authentifizierte User?
2. wie lautet der URI für nicht authentifizierte User?
3. ist für den Loginstatus nur ausschließlich die Twitter Abfrage entscheidend oder gibts noch andere Formen?

Um die Fensterkiller auszusortieren, müßte man ggf. noch einige Parameter ändern.
3. hast Du ggf. Zugriff auf die Session-Config? Root oder Popeluser?
3. welche ServerAPI:
apache2handler: sind PHP_* varname value in .htaccess gestattet?
(fast)CGI?: .user.ini erlaubt bzw. wirksam?

Ich klier da mal rum
PHP-Code:
<?php
// ...

# Declare

require_once('config.php');

define('ONLINE'get_ini('session.gc_maxlifetime'));
define('INDEX''/index.php');
define('NO_AUTH''/login.php');

$url sprintf('http://%s%s',
  
$_SERVER['HTTP_HOST'],
  
rtrim(dirname($_SERVER['SCRIPT_NAME]'), '/\\'));

$indexurl .=  INDEX;
$noauthurl .= NO_AUTH;

$requestUrl   'http://api.twitter.com/oauth/request_token';
$authorizeUrl 'http://api.twitter.com/oauth/authorize';
$accessUrl     'http://api.twitter.com/oauth/access_token';

# main

if (! empty($_SESSION['online'])){
    if (
time() - $_SESSION['online'] > ONLINE){
        
$_SESSION = array();
        
session_write_close();
        
header("Location: $authorizeUrl");    
        exit;
    }
}

if (isset(
$_GET["denied"])) {
    
// Benutzer hat die Anmeldung abgebrochen. Schade.
    
$_SESSION = array();
    
session_write_close();
    
header("Location: $authorizeUrl");    
    exit;
}

if ( empty(
$_SESSION["oauth_request_token"])) {
    
// Der Benutzer hat noch keine Anmeldung.
    
$oauth = new OAuth
        
$consumer_key,
        
$consumer_secret,
        
OAUTH_SIG_METHOD_HMACSHA1,
        
OAUTH_AUTH_TYPE_URI);

    
$tokenInfo                       $oauth->getRequestToken($requestUrl);
    
$_SESSION['oauth_request_token'] = $tokenInfo['oauth_token_secret'];
    
$_SESSION['online'] = time();
    
$location "$authorizeUrl?oauth_token=$tokenInfo[oauth_token]";
    
session_write_close();
    
header('Location: ' $location);
    exit;
}

if (empty(
$_SESSION["oauth_token"])) {
    if (empty(
$_GET['oauth_token'])) {
        
$_SESSION = array(); // Sitzung leeren
        
session_write_close();
        
header("Location: $indexurl");
        exit;
    }
    
$oauth = new OAuth
        
$consumer_key,
        
$consumer_secret,
        
OAUTH_SIG_METHOD_HMACSHA1,
        
OAUTH_AUTH_TYPE_URI);
    
$oauth->setToken($_GET['oauth_token'], $_SESSION['oauth_request_token']);
    
$tokenInfo $oauth->getAccessToken($accessUrl);

    
$_SESSION["oauth_token"]  = $tokenInfo['oauth_token'];
    
$_SESSION['oauth_token_secret'] = $tokenInfo['oauth_token_secret'];
    
$_SESSION['online'] = time();
    
$oauth->setToken($_SESSION['oauth_token'], $_SESSION['oauth_token_secret']);

    
$oauth->fetch('https://api.twitter.com/1.1/account/verify_credentials.json');
    
$json json_decode($oauth->getLastResponse());
    
$_SESSION["username"] = (string)$json->screen_name// got it. ;-)
    
session_write_close();
    
header("Location: $indexurl");
    exit;
}

if (isset(
$_SESSION["username"])) {
    
$_SESSION['online'] = time();
    
header("Location: $indexurl");
    exit;
}
?>
Vielleicht bringts ja was. Die Sessionhaltezeit richtet sich nach session.gc_maxlifetime.

btw: nicht getestet. Syntax- und semantische Fehler sind nicht ausgeschlossen.
Mit Zitat antworten
  #8  
Alt 28.01.2013, 01:50:35
Tuxman Tuxman ist offline
Anfänger
 
Registriert seit: Dec 2006
Beiträge: 83
AW: Twitter/OAuth: Autorisierung immer zweimal nötig

Zitat:
Zitat von meikel Beitrag anzeigen
1. wie lautet der URI für authentifizierte User?
2. wie lautet der URI für nicht authentifizierte User?
Du meinst: Von mir? Sind identisch.

Zitat:
Zitat von meikel Beitrag anzeigen
3. ist für den Loginstatus nur ausschließlich die Twitter Abfrage entscheidend oder gibts noch andere Formen?
Gewünscht ist: Auf meiner Seite ist man eingeloggt, sobald man bei Twitter authentifiziert ist.

Zitat:
Zitat von meikel Beitrag anzeigen
3. hast Du ggf. Zugriff auf die Session-Config? Root oder Popeluser?
Popeluser leider.

Zitat:
Zitat von meikel Beitrag anzeigen
apache2handler: sind PHP_* varname value in .htaccess gestattet?
(fast)CGI?: .user.ini erlaubt bzw. wirksam?
Ich kann eine eigene php.ini verwenden, wenn nötig. Bzw. tue ich das bereits.
__________________
tuxproject.de
Mit Zitat antworten
  #9  
Alt 28.01.2013, 01:58:09
Tuxman Tuxman ist offline
Anfänger
 
Registriert seit: Dec 2006
Beiträge: 83
AW: Twitter/OAuth: Autorisierung immer zweimal nötig

Dein Code führt beim Klick auf "login" (ruft die userlogin.php auf) übrigens zu einer leeren SESSION-Variable und somit zu einer leeren Seite.
__________________
tuxproject.de
Mit Zitat antworten
  #10  
Alt 28.01.2013, 08:18:34
Benutzerbild von meikel (†)
meikel (†) meikel (†) ist offline
SELFPHP Guru
 
Registriert seit: Dec 2003
Ort: Erfurt
Alter: 75
Beiträge: 4.001
AW: Twitter/OAuth: Autorisierung immer zweimal nötig

Zitat:
Zitat von Tuxman Beitrag anzeigen
Dein Code führt beim Klick auf "login" (ruft die userlogin.php auf) übrigens zu einer leeren SESSION-Variable und somit zu einer leeren Seite.
Jo. Da waren ein Fehlerchen drin. Leider darf ich meinen Text nachträglich nicht mehr editieren.
PHP-Code:
<?php
// ...

# Declare

require_once('config.php');

define('ONLINE'get_ini('session.gc_maxlifetime'));
define('INDEX''/index.php');

$url sprintf('http://%s%s',
  
$_SERVER['HTTP_HOST'],
  
rtrim(dirname($_SERVER['SCRIPT_NAME]'), '/\\'));

$indexurl .=  INDEX;
$noauthurl .= NO_AUTH;

$requestUrl   'http://api.twitter.com/oauth/request_token';
$authorizeUrl 'http://api.twitter.com/oauth/authorize';
$accessUrl     'http://api.twitter.com/oauth/access_token';

# main

# Session noch gültig?
if (! empty($_SESSION['online'])){
    if (
time() - $_SESSION['online'] > ONLINE){
        
$_SESSION = array();
        
session_write_close();
        
header("Location: $indexurl");    # <--
        
exit;
    }
}

if (isset(
$_GET["denied"])) {
    
// Benutzer hat die Anmeldung abgebrochen. Schade.
    
$_SESSION = array();
    
session_write_close();
    
header("Location: $indexurl");  # <--
    
exit;
}

if ( empty(
$_SESSION["oauth_request_token"])) {
    
// Der Benutzer hat noch keine Anmeldung.
    
$oauth = new OAuth
        
$consumer_key,
        
$consumer_secret,
        
OAUTH_SIG_METHOD_HMACSHA1,
        
OAUTH_AUTH_TYPE_URI);

    
$tokenInfo                       $oauth->getRequestToken($requestUrl);
    
$_SESSION['oauth_request_token'] = $tokenInfo['oauth_token_secret'];
# Timestamp setzen
    
$_SESSION['online'] = time();
    
$location "$authorizeUrl?oauth_token=$tokenInfo[oauth_token]";
    
session_write_close();
    
header('Location: ' $location);
    exit;
}

if (empty(
$_SESSION["oauth_token"])) {
    if (empty(
$_GET['oauth_token'])) {
        
$_SESSION = array(); // Sitzung leeren
        
session_write_close();
        
header("Location: $indexurl");
        exit;
    }
    
$oauth = new OAuth
        
$consumer_key,
        
$consumer_secret,
        
OAUTH_SIG_METHOD_HMACSHA1,
        
OAUTH_AUTH_TYPE_URI);
    
$oauth->setToken($_GET['oauth_token'], $_SESSION['oauth_request_token']);
    
$tokenInfo $oauth->getAccessToken($accessUrl);

    
$_SESSION["oauth_token"]  = $tokenInfo['oauth_token'];
    
$_SESSION['oauth_token_secret'] = $tokenInfo['oauth_token_secret'];
# timestamp setzen
    
$_SESSION['online'] = time();
    
$oauth->setToken($_SESSION['oauth_token'], $_SESSION['oauth_token_secret']);

    
$oauth->fetch('https://api.twitter.com/1.1/account/verify_credentials.json');
    
$json json_decode($oauth->getLastResponse());
    
$_SESSION["username"] = (string)$json->screen_name// got it. ;-)
    
session_write_close();
    
header("Location: $indexurl");
    exit;
}

if (isset(
$_SESSION["username"])) {
# timestamp setzen
    
$_SESSION['online'] = time();

################
# User ist authentifiziert
################

   
tu_was();

}
?>
Hoffentlich besser... :-?

Zitat:
Ich kann eine eigene php.ini verwenden, wenn nötig. Bzw. tue ich das bereits.
Hinweis: verwende einen eigenen session.save_path. Sonst kann es passieren, daß ein "Nachbar" die Müllentsorgung (GC) anstößt und ggf. Deine session files mit in die Tonne tritt.

Ich verwende im document_root ein ./tmp Verzeichnis für session.save_path und upload_tmp_dir. Und damit kein Client fremdgehen kann, liegt da ein .htaccess file:
Code:
deny from all
Mit Zitat antworten
Antwort


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind aus.
[IMG] Code ist aus.
HTML-Code ist aus.

Gehe zu


Alle Zeitangaben in WEZ +2. Es ist jetzt 13:03:24 Uhr.


Powered by vBulletin® Version 3.8.3 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.


© 2001-2024 E-Mail SELFPHP OHG, info@selfphp.deImpressumKontakt