HybridAuth-ソーシャルネットワークとのWebサイト統合

はじめに



私のサイトのphpでは、最近Loginzaサービスを使用してユーザーを認証しました。 すべてが非常にクールで快適でしたが、この素晴らしいサービスを放棄するという考えが頭に浮かび始めました。それが理由です。



  1. Loginzaを閉じるか拒否した場合のユーザーの承認-この場合、リンクされたプロファイルで電子メールプロファイルが指定されていないユーザーは失われます。
  2. たとえば、VKontakteは、正方形のアバターなど、いくつかの方法でユーザーの写真を提供できます。 Loginzaでこのデータを取得することはできません;サービス自体が、どのデータを要求し、どのデータを提供するかを決定します。
  3. Yandexへの販売の瞬間から、Loginzaは死に始めました。ユーザーのリクエストに誰も応答せず、サービスは開発されませんが、1〜2年前の形式です。


代替サービスを置き換えて使用するという問題は、もはや欲求を生じさせませんでした。ソーシャルサービスと「通信」する機会を誰も想像していませんでした。 ネットワークに直接接続し、拡張プロファイルフィールドは通常有料サービスに含まれます。 要求されたフィールドを柔軟に構成できるスタンドアロンソリューションが必要だったため、最終的にはPHPライブラリのHybridAuthに決めました。



HybridAuth



HybridAuthは、OAuth1、OAuth2、およびOpenIDを使用して認証を使用できるようにするオープンソースライブラリです。 ライブラリには、ほとんどの一般的なソーシャルネットワークの設定が既に含まれています。 Google、Facebook、Twitter、VKontakteなどのネットワーク。 現在の安定バージョンは2.0.11、開発中のバージョンは2.1.0です。記事の最後にgithubへのリンクがあります。 これは、MITおよびGPLライセンスの下で配布されています 。これについては、 こちらで読むことができます



ライブラリには、使用例と最も一般的な認可サービスのセットが含まれています。 Twitterを介した認証の例を考えてみましょう。このために、最新の安定バージョンを取得して、ローカルサーバーにインストールします。 すべてのサンプルはexamples



ディレクトリにあり、サービス設定はhybridauth/config.php



install.php



もそこにあります。これにより、設定ファイルを自動的に作成し、開くことができます。







最初に、エンドポイントURLを指定する必要があります。これは、プラグインのルートディレクトリへのフルパスであり、一部のサービスがサイトに戻るために使用します。 次は、すべての承認サービスの設定と、IDとシークレットを取得するための手順です。







この例では、Twitterでアプリケーションを作成します。 その後、それらをライブラリの設定に追加して保存します。 承認の例を考えて、サイトのルートにtest.php



ファイルを作成します。



 <?php session_start(); $config = dirname(__FILE__) . '/hybridauth/config.php'; require_once( "hybridauth/Hybrid/Auth.php" ); if( isset( $_GET["login"] ) ) { try { $hybridauth = new Hybrid_Auth( $config ); $adapter = $hybridauth->authenticate( "twitter" ); $user_profile = $adapter->getUserProfile(); } catch( Exception $e ) { die( "<b>got an error!</b> " . $e->getMessage() ); } } if( ! isset( $user_profile ) ) { ?> <p>   .</p> <h2><a href ="test.php?login=1"></a></h2> <?php } else { ?> <fieldset> <legend>twitter </legend> <b> <?php echo $user_profile->displayName; ?></b> <hr /> <b>Hybridauth access tokens for twitter:</b> <pre><?php print_r( $adapter->getAccessToken() ); ?></pre> </fieldset> <?php } ?>
      
      





彼が何をするか考えてみてください:

  1. GETログインパラメータを確認し、存在しない場合は、承認オファーのあるページを開きます。
  2. リンクmysite.ru/twitter.php?login=1をクリックすると、承認プロセスが開始されます。 Hybrid_Authクラスのインスタンスが作成され、認証メソッドはログインするサービスの名前を渡します。
  3. Facebookは、ユーザーがアクセスを許可した場合に承認のオファーが表示され、getUserProfileメソッドがプロファイルデータを返します。そうでない場合、エラーが発生します。


すべてが非常に簡単です! 次に、Twitterの場合にgetUserProfile



どのようなデータを受け取るかを見てみましょう。 これを行うには、認証サービスの設定がファイルの形式で保存されているhybridauth/Hybrid/Providers



ディレクトリを開きますhybridauth/Hybrid/Providers



が必要です。 getUserProfile



メソッドを見つけ、受信したデータを確認します。



 $this->user->profile->identifier = (property_exists($response,'id'))?$response->id:""; $this->user->profile->displayName = (property_exists($response,'screen_name'))?$response->screen_name:""; $this->user->profile->description = (property_exists($response,'description'))?$response->description:""; $this->user->profile->firstName = (property_exists($response,'name'))?$response->name:""; $this->user->profile->photoURL = (property_exists($response,'profile_image_url'))?$response->profile_image_url:""; $this->user->profile->profileURL = (property_exists($response,'screen_name'))?("http://twitter.com/".$response->screen_name):""; $this->user->profile->webSiteURL = (property_exists($response,'url'))?$response->url:""; $this->user->profile->region = (property_exists($response,'location'))?$response->location:"";
      
      





データを変更したり、独自のデータを追加したりできます。プロファイルの連絡先を取得し、ステータスを変更する方法もこのファイルに実装されています。 つまり、必要に応じて、ソーシャルネットワークで必要なデータのセットを変更できるだけでなく、APIに基づいて独自の機能を追加することもできます。



ヤンデックス



新しい認証サービスを追加する例として、Yandexを追加しようとします。 hybridauth/Hybrid/Providers/Yandex.php



ため、 hybridauth/Hybrid/Providers/Yandex.php



を作成します。 Yandexは認証にOAuth2を使用するため、クラスはそれを継承します。



 class Hybrid_Providers_Yandex extends Hybrid_Provider_Model_OAuth2
      
      





OAuth1の場合はHybrid_Provider_Model_OAuth1を使用し、OpenIDの場合Hybrid_Provider_Model_OpenID



。 次に、Yandexがユーザーを認証し、プロファイルデータにアクセスするために必要なデータを把握する必要があります。 最初に、Yandex APIアプリケーションを作成してIDおよびシークレットフィールドを取得します- ここにアクセスし 、新しいアプリケーションを登録します。 プロファイルデータを取得するには、API Login.Yandexを使用します。ここでは、メールボックスのフィールドとユーザーの名前に注意します。



データ塗りつぶしの例






必要なキーがあります。HybridAuth設定でそれらを作成し、 hybridauth/config.php



を開いて最後に追加します:



 "Yandex" => array ( "enabled" => true, "keys" => array ( "id" => "Id ", "secret" => " " ) ),
      
      





次に、 Yandexのドキュメントを読み、承認のために連絡する必要があることを確認します oauth.yandex.ru/authorize



oauth.yandex.ru/authorize



、およびトークンを取得する oauth.yandex.ru/token



oauth.yandex.ru/token



。 API Login.Yandexのアドレスを見つけることは残っています。このためには、 APIドキュメントを開き、Yandex経由でログインを見つけ、そこにOAuth + Yandex.Loginを見つけます。 ここでは、連絡する必要があるユーザーに関する情報を取得することがわかります login.yandex.ru/info



login.yandex.ru/info



さて、必要なものはすべて揃っています。Yandex.phpに戻り、初期化関数でAPIへのリンクを指定します。



 $this->api->api_base_url = "https://login.yandex.ru/info"; $this->api->authorize_url = "https://oauth.yandex.ru/authorize"; $this->api->token_url = "https://oauth.yandex.ru/token";
      
      





また、受信したトークンをoauth_token



パラメーターで渡す必要があることも示します。



 $this->api->sign_token_name = "oauth_token";
      
      





次に、getProfiles関数でデータ解析を記述し、最初にプロファイルのリクエストを作成します。



 $response = $this->api->api( "?format=json" );
      
      





これで、受信したすべてのデータを含む$応答オブジェクトが作成されました。Twitter.phpと同様に保存します。



 $this->user->profile->identifier = (property_exists($response,'id'))?$response->id:""; $this->user->profile->firstName = (property_exists($response,'real_name'))?$response->real_name:""; $this->user->profile->displayName = (property_exists($response,'display_name'))?$response->display_name:""; $this->user->profile->photoURL = 'http://upics.yandex.net/'. $this->user->profile->identifier .'/normal'; $this->user->profile->gender = (property_exists($response,'sex'))?$response->sex:""; $this->user->profile->email = (property_exists($response,'default_email'))?$response->default_email:""; $this->user->profile->emailVerified = (property_exists($response,'default_email'))?$response->default_email:"";
      
      





その結果、次のファイルが得られました。

Yandex.php
 <?php class Hybrid_Providers_Yandex extends Hybrid_Provider_Model_OAuth2 { function initialize() { parent::initialize(); $this->api->api_base_url = "https://login.yandex.ru/info"; $this->api->authorize_url = "https://oauth.yandex.ru/authorize"; $this->api->token_url = "https://oauth.yandex.ru/token"; $this->api->sign_token_name = "oauth_token"; } function getUserProfile() { $response = $this->api->api( "?format=json" ); if ( !isset( $response->id ) ) { throw new Exception( "User profile request failed! {$this->providerId} returned an invalide response.", 6 ); } $this->user->profile->identifier = (property_exists($response,'id'))?$response->id:""; $this->user->profile->firstName = (property_exists($response,'real_name'))?$response->real_name:""; $this->user->profile->displayName = (property_exists($response,'display_name'))?$response->display_name:""; $this->user->profile->photoURL = 'http://upics.yandex.net/'. $this->user->profile->identifier .'/normal'; $this->user->profile->gender = (property_exists($response,'sex'))?$response->sex:""; $this->user->profile->email = (property_exists($response,'default_email'))?$response->default_email:""; $this->user->profile->emailVerified = (property_exists($response,'default_email'))?$response->default_email:""; return $this->user->profile; } } ?>
      
      







サンプルをTwitterからYandexに変更します。



 $adapter = $hybridauth->authenticate( "yandex" );
      
      





ログインしようとしています:







そして、最終的に次のようになります。







それだけです。Yandexによる認証は成功しました。 必要な残りのサービスを接続することができます。



便利な接続、新しいサービスの簡単な追加、およびオープンソースコード-サードパーティのサービスを操作するときに欠けていたすべて。 また、統合を簡素化するために、ライブラリにはYii、Symfony2、Wordpress、Drupalなどの一般的なフレームワークとCMSのプラグインがあります



追加およびエラーや不正確な点については、PMにお問い合わせください。



関連リンク:



updYandexMail.ruの承認を投稿しました。OdnoklassnikiはPHP> 5.3.0との互換性のために松葉杖を使用しました。








All Articles