はじめに
私のサイトのphpでは、最近Loginzaサービスを使用してユーザーを認証しました。 すべてが非常にクールで快適でしたが、この素晴らしいサービスを放棄するという考えが頭に浮かび始めました。それが理由です。
- Loginzaを閉じるか拒否した場合のユーザーの承認-この場合、リンクされたプロファイルで電子メールプロファイルが指定されていないユーザーは失われます。
- たとえば、VKontakteは、正方形のアバターなど、いくつかの方法でユーザーの写真を提供できます。 Loginzaでこのデータを取得することはできません;サービス自体が、どのデータを要求し、どのデータを提供するかを決定します。
- 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 } ?>
彼が何をするか考えてみてください:
- GETログインパラメータを確認し、存在しない場合は、承認オファーのあるページを開きます。
- リンクmysite.ru/twitter.php?login=1をクリックすると、承認プロセスが開始されます。 Hybrid_Authクラスのインスタンスが作成され、認証メソッドはログインするサービスの名前を渡します。
- 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にお問い合わせください。
関連リンク:
upd : YandexとMail.ruの承認を投稿しました。OdnoklassnikiはPHP> 5.3.0との互換性のために松葉杖を使用しました。
