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
|
:: Anbieterverzeichnis ::
Globale Branchen
Informieren Sie sich über ausgewählte Unternehmen im Anbieterverzeichnis von SELFPHP
:: Newsletter ::
Abonnieren Sie hier den kostenlosen
SELFPHP Newsletter!
|
PHP für Fortgeschrittene und Experten Fortgeschrittene und Experten können hier über ihre Probleme und Bedenken talken |
27.01.2013, 15:28:17
|
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
|
27.01.2013, 19:39:10
|
|
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.
|
27.01.2013, 20:51:53
|
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
|
27.01.2013, 21:46:33
|
|
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
|
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.
|
27.01.2013, 21:58:47
|
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
|
27.01.2013, 22:08:16
|
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
|
28.01.2013, 00:43:35
|
|
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
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.
|
28.01.2013, 00:50:35
|
Anfänger
|
|
Registriert seit: Dec 2006
Beiträge: 83
|
|
AW: Twitter/OAuth: Autorisierung immer zweimal nötig
Zitat:
Zitat von meikel
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
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
3. hast Du ggf. Zugriff auf die Session-Config? Root oder Popeluser?
|
Popeluser leider.
Zitat:
Zitat von meikel
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
|
28.01.2013, 00:58:09
|
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
|
28.01.2013, 07:18:34
|
|
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
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:
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
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.
HTML-Code ist aus.
|
|
|
Alle Zeitangaben in WEZ +2. Es ist jetzt 09:18:46 Uhr.
|