2016年5月21日土曜日

APPサーバにGoogleアカウントでログインする。

よくサイトで、twitterアカウントでログインとか、facebookアカウントでログインとかありますが、「Googleアカウントでログインする」を実装中です。
google cloud platform上で完結するアプリだと凄く簡単なのですが、APPサーバが別サイトの場合、google cloud platform上でGoogle App Engineを利用したAPPを作成して連携させないといけません。
今回は、google cloud platform上でgoogleアカウント認証サーバを作成して、googleアカウントログイン中なら、ID,ニックネーム,メールアドレスを呼び出し元に帰り、ログインしていなければgoogleのログイン画面が出てログイン後に、呼び出し元に帰るようにしました。

※APPサーバとgoogleアカウント認証サーバの連携には、ワンタイムパスワードを連携させて他から接続できないようにする予定。

作ってみて気が付いたのですが、普通にこれを設置してURL公開して知らないユーザが、もしgoogleアカウントログイン中でアクセスしたら、ID,ニックネーム,メールアドレスがサイトオーナーに知られてしまいます。
(但し、知られるのはこの3種類だけでパスワードとかは、知られませんのでそこは安心して下さい。)

尚、google cloud platformは無料ではありません。有料となりますが、インスタンスとかチューニングして、課金されないようにします。(弱小サイトなので無課金でいけるかと思います。)

=メモ=googleアカウント認証サーバ(そんなに大したものではありません)==
google cloud platformの使い方、Google APP Engine Launcherの使い方とかは他のサイトで。

----------------------------
 =メモ=googleアカウント認証サーバ(そんなに大したものではありません)==
google cloud platformの使い方、Google APP Engine Launcherの使い方とかは他のサイトで。
----------------------------

<?php
require_once 'google/appengine/api/users/UserService.php';

use google\appengine\api\users\User;
use google\appengine\api\users\UserService;

$user = UserService::getCurrentUser();
$login = UserService::createLoginURL($_SERVER['REQUEST_URI']);
if ($user == null) {
       ob_start();
       header('Location: ' . $login);
       ob_flush();
}else{
$op = $_POST['op'];
       $uri = $_SERVER['REQUEST_URI'];
$userid = $user->getUserID();
$nicknme = $user->getNickname();
$email = $user->getEmail();
$str = $userid . "\t" . $nicknme . "\t" . $email . "\t" . $op . "\t" . $uri;
$sstr = var_serialize($str);

       echo "<html><head></head>";
       echo "<body onload='document.returnlogin.submit();'>";
       echo "<form name='returnlogin' method='post' action='https://xxxxx.xxxx/login.php'>";
       echo "<input type='hidden' name='fg' value='" . $sstr . "'>";
       echo "</form>";
       echo "</body></html>";
}
function var_serialize( $obj ){
        //データを暗号化します。受け取り側は複合化する。
}

?>

これだけです。
APPサーバ側は、googleアカウントでログインしたい時は、googleアカウント認証サーバを
formでsubmitとすればOKです。
既にログイン中の時は、https://xxxxx.xxxx/login.phpに戻って来ます。

ログインしていない時は、googleアカウントログイン画面が表示され、
ログイン後、
に必要情報を付加して戻って来る。



Microsoft Azure Windows 2008 Server,SoftEther VPNサーバインストール手順・設定,スマフォ Android L2TP over IPsec VPN接続

け合って、スマフォからとあるサイトにアクセスするのに、米国経由の踏み台サーバが必要だったので、Microsoft Azure Windows 2008 Server(米国西海岸)で運用しているサーバにSoftEther VPNをインストールして、L2TP over IPsec接続できるようにしました。

※前回はLinux CentOS7にPPTPサーバをインストールしています。中国現地グレートファイーウォールを突破するのに利用。

====
1)SoftEther VPNサーバインストール・設定
2)Microsoft Azure Windows 2008 Serverファイアーウォール設定
3)Microsoft Azure 仮想マシンのエンドポイント設定
4)Android VPN接続設定
====

【Microsoft Azure Windows 2008 ServerにSoftEther VPNサーバインストール・設定】
 1) SoftEther VPN のダウンロード
    https://ja.softether.org/5-download
    ここから、ダウンロードして、言いなりにインストールして、後は管理マネージャーから設定する。
  途中、ダイナミックDNS機能の設定ダイアログとか表示されますが、固定IPで運用しているので
  スルー。(動的IPの方は、好きな名前.softether.netが割り当てできます。)



2) 管理マネージャーを起動しlocalhostをダブルクリック
 
  3) VPN Server"localhost"の管理画面が開きます。

  -1) 管理ポートのリスナーは複数ありましたが、5555以外削除しました。
  -2) 仮想HUBは何も変更していなければVPNという名前の仮想HUBができています.
    「仮想HUBの管理」を開いて、
      「ユーザの管理」でVPN接続したいユーザを新規作成する。ユーザ名、パスワードを設定
      「仮想NATおよび仮想DHCPサーバ機能」で「SecureNAT機能を有効にする」を押下

    -3) 「VPN Azure」は必要ないので無効にする。
    -4) 「IPsec/L2TP設定」
             L2TPサーバ機能を有効にする(L2TP over IPsec)にチェックを入れる。
       IPsec事前共有鍵は、適宜8文字程度に変更して設定。

【Microsoft Azure Windows 2008 Serverファイアーウォール設定】
 1) Windows ファイアーウォール設定でUDP 500,1701,4500を許可する。


【Microsoft Azure 仮想マシンのエンドポイント設定】
 1) Microsoft Azure 仮想マシンのエンドポイント UDP 500,1701,4500を割り当てる。


【Android VPN接続設定】
 1) VPN設定
  「設定」-「その他の設定」-「VPN」-「+」で新規作成

   名前:適当
   タイプ:L2TP/IPSec PSKを選択
   サーバアドレス:IPアドレスまたはFQDN
      IPsec事前共有鍵:SoftEther VPNで設定したIPsec事前共有鍵

  以上で接続できます。接続成功したらステータスバーに横鍵アイコンが付きます。
  接続中は全てVPNサーバ経由でアクセスされます。