Skip to content

Instantly share code, notes, and snippets.

@noriyukitakei
Created April 3, 2018 02:49
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save noriyukitakei/fc3560679f368da41c3bfc545b72ff9b to your computer and use it in GitHub Desktop.
Save noriyukitakei/fc3560679f368da41c3bfc545b72ff9b to your computer and use it in GitHub Desktop.
OAuthコンシューマーのメッセージ一覧&投稿画面
<?php
// セッションを開始します。
session_start();
// usernameというセッション変数に何もセットされていなかったら、
// すなわち未認証だったら、ログイン画面にリダイレクトします。
if (!isset($_SESSION['username'])) {
// ログイン画面にリダイレクトする前に、ログイン後に
// 戻る画面の戻り先のURL(つまり本画面のURL)をセッションに格納します。
$_SESSION['back'] = $_SERVER["REQUEST_URI"];
header('Location: /login.php');
exit;
}
// データベースの接続に必要なPDOインスタンスを作成します。
$pdo = new PDO('mysql:dbname=consumer;host=localhost', 'root', 'password');
// メッセージが投稿されたらデータベースに反映します。
if (!empty($_POST["post"])) {
// OAuthコンシューマー(Twitter)に投稿を反映します
$stmt = $pdo->prepare('INSERT INTO messages VALUES(:username,:message)');
$stmt->execute(array(':message' => $_POST["message"], ':username' => 'ntakei'));
// ここからはOAuthプロバイダー(Facebook)側の投稿APIを叩いて、OAuthコンシューマー(Twitter)に
// 投稿された内容をOAuthプロバイダー(Facebook)側にも反映する処理を行います。
// ログインユーザーに紐づくアクセストークンを取得します。
$stmt2 = $pdo->prepare('SELECT access_token FROM consumer_users WHERE username = ?');
$stmt2->execute(array($_SESSION['username']));
$result = $stmt2->fetch(PDO::FETCH_ASSOC);
// なぜか明示的にこのpplication/x-www-form-urlencodedヘッダーを入れないとエラーになるので、入れます
$header = [
'Content-Type: application/x-www-form-urlencoded'
];
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, 'https://[OAuthプロバイダーのホスト名]/post_message.php'); // 投稿APIのURLを指定します
curl_setopt($curl, CURLOPT_POST, true); // POSTリクエストを有効にします
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); // 出力を有効にします
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); // SSL証明書の検証を無効にします(オレオレ証明書対策)
curl_setopt($curl, CURLOPT_HTTPHEADER, $header); // HTTPヘッダーを送ります。
curl_setopt($curl, CURLOPT_POSTFIELDS, "message=".$_POST["message"]."&access_token=".$result["access_token"]); // 投稿内容とアクセストークンをPOSTでリクエストするためのリクエストレスポンスを生成します。
// 投稿APIを実行します。
$result = curl_exec($curl);
curl_close($curl);
}
$stmt3 = $pdo->prepare('SELECT * FROM messages');
$stmt3->execute();
?>
<html>
<head>
<meta charset="UTF-8">
<title>Twitterメッセージ一覧画面</title>
</head>
<h1>Twitterメッセージ一覧画面</h1>
<body>
<form action="/messages.php" method="POST">
<input type="text" name="message" value="">
<input type="submit" name="post" value="投稿">
</form>
<table border="1">
<tr>
<td>ユーザー名</td><td>メッセージ</td>
</tr>
<?php
while($result = $stmt3->fetch(PDO::FETCH_ASSOC)){
echo("<tr>");
echo("<td>".$result['username']."</td>");
echo("<td>".$result['message']."</td>");
echo("</tr>");
}
?>
</table>
</body>
</html>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment