Loginza-Vkontakte、FacebookなどのOpenIDサーバーによる認証

参加する代わりに



今日のLoginzaサービスについてはそれほどではありません

利用可能な情報は、主に開発者自身からのものであり、かなり乾燥しています。 それは

変です。 私自身の開発経験についてお話したいと思います。

私は、認証問題の解決策に直面しなければなりませんでした

FacebookおよびVKontakteを介したWebサイト。 グーグルでしばらくの間、Loginzaに出会いました。 よく見て、

試してみることにしました。



ドキュメントは存在しますが、私の意見では、少し貧弱です。 いくつかの例があります。 準備ができています

ねじれのないエンジン用の承認モジュール。 この投稿では、簡単に

プロジェクトで適用したアルゴリズムを教えてください。





準備段階



準備段階全体が最終的なビューを表すためにデモを表示することになります

loginzでの登録。 登録は簡単です。Yandexアカウントで登録しました。

電子メールは、アクティベーションへのリンクが記載された確認メールを即座に受信しました。

個人アカウントLoginzaのインターフェースで、サイトを登録する必要があります。 そして取る

ファイルをサイトに投稿して権利を確認してください。 Yandexのウェブマスターのように(ところで、誰も知らない-

YandexはLoginzを購入しました)。



権限が確認されたら、ウィジェットIDとウィジェットの秘密鍵を取得できます。

認証スクリプトを開発するために必要になります。 また、必要な設定で

[セーフモード]ボックスをオンにします。 「危険な体制」、過去に明らかに、について

セキュリティ投稿の最後にいくつかの言葉。



最後の準備ステップは、ウィジェットのHTMLコードを取得することです。 あなたはそれをすべて行うことができます

同じマイウィジェット管理ページ。



画像



ベース開発



私の実装は完全であると主張しませんが、完全に表示されます

何が起こっているかの本質。



「ログインを介した」承認は、単に次の間の層であることを理解する必要があります

ソーシャルユーザー ネットワークとウェブサイト。 成功したログイン認証はまだ与えません

サイトでの承認。 通常、サイトでの承認のために、ユーザーは入力する必要があります

有効なログインとパスワード。その後、彼はアクセスできます。 私たちの場合、成功した承認

Loginzaを介して-これは一種のログインおよびパスワード入力ですが、まだ承認されていません。



したがって、データベースには2つのテーブルがあります。

1.ユーザー(フィールド:user_id、ニックネーム、パスワード、電子メール)

2. loginza(フィールド:ID、ID、プロバイダー、ニックネーム、メール、ステータス、user_id)



サイトのユーザーは最初のテーブルに保存され、サイトの承認は次のデータに従って正確に行われます

このテーブル。 この表のフィールドでは、すべてが明確だと思います。



2番目のテーブルにはユーザーも格納されます。 しかし、これらは正常にログインしたユーザーです

Loginzu。

identity-loginzaを渡します。 プロバイダーからの一意のキーのようなもの。

プロバイダー-loginzaを渡します。 これは、ユーザーが許可されるサービスです(連絡先、Facebook、

ヤンデックスなど)

ニックネーム、メール-Loginzaを裏切る。 承認プロバイダーが返したニックネーム(メール)。 5月

何であれ。 またはまったくありません。

ステータス-新しいユーザー/古いユーザー

user_id-usersテーブルのユーザーID



これは最小限のテーブルのセットです。



認証スクリプト自体



ログインページ


最初の段階で受け取ったHTMLコードはログインフォームです。 ページに配置

認可。



画像



受信したコードでは、成功した場合にユーザーが移動するアドレスを指定する必要があります

認可。 このスクリプトは認証データを受け取ります!

loginza.ru/api/widget?overlay=loginza&token_url= yoursaytru / auth.php

http://またはhttps://で完全なURLを指定する必要があります。PHPで事前にエンコードされています

urlencode()関数。

応答を受信し、ユーザーを登録および承認するためのスクリプト


このスクリプトは、ログインからの応答を認識し、ユーザーをさらに誘導する必要があります。

スクリプトの内容は次のようなものです。

$loginzaid='ID'; //ID

.

$loginzakey='HASH'; //

.



$token=$_POST['token']; // .

$sig=md5($token.$loginzakey); // .

$kk="http://loginza.ru/api/authinfo?token=".$token."&id=".$loginzaid."&sig=".$sig.""; //

url

$b=file_get_contents($kk); //

$authresult=json_decode($b,true); // PHP









$ authresult配列で、承認されたユーザーに関するデータ。



この例では、タスクを多少簡略化し、ニックネームとメールが送信されると仮定します

承認プロバイダーと、ユーザーテーブルにそのようなユーザーがいるユーザーはまだありません

存在します。 実際には-これを確認する必要があり、データがない場合、または重複している場合

ユーザーデータベース内の既存のログイン-ユーザーに説明を要求します。 しかし、それは違います

物語。



続けて



新しいユーザー



取得したプロバイダーのloginzaテーブルにエントリがあるかどうかを確認し、

アイデンティティ

$res=mysql_query("SELECT * FROM $tbl_l WHERE identity='$authresult[identity]' AND

provider='$authresult[provider]'");






そのようなレコードがない場合は、loginzaテーブルにユーザーを入力します

if(mysql_num_rows($res)==0)

{

mysql_query("INSERT INTO loginza (

`identity`,

`provider`,

`nickname`,

`email`,

`status`,

`soc_user_id`

)

VALUES

(

'$authresult[identity]',

'$authresult[provider]',

'$authresult[nickname]',

'$authresult[email]',

0,

0

)

") ;



}









確かにこのユーザーはそうです。

このようなIDとプロバイダーを持つユーザーについて読みます(readいですが、簡単にするために

ナレーション)。



$res=mysql_query("SELECT * FROM $tbl_l WHERE identity='$authresult[identity]' AND

provider='$authresult[provider]'");

$loginza=mysql_fetch_assoc($res);







これが彼の最初のエントリと回答の場合。 usersテーブルにまだ登録されていない-登録する

そこで、loginzaテーブル情報を更新します。

if($loginza['status']==0)

{

$pwd=md5(' '); // ( ) MD5-

mysql_query("INSERT INTO users (nickname, password, email) VALUES ('$loginza[nickname]',

'$pwd', '$loginza[email]' )"); //

$iid=mysql_insert_id(); // ID . .

// loginza

mysql_query("UPDATE loginza SET status=1, user_id=$iid WHERE id=$loginza[id]"); //

=1 users

}









それだけです! これで、このユーザーの許可とLoginzaの間の接続が確立されました。



usersテーブルでこのユーザーを承認し、サイトに配置するだけです。

if($loginza['status']==1)

{

Someauthorization($iid); //,

}









既存のユーザー。 再ログイン。

このユーザーが(次回)再度ログインするとどうなりますか? 瞬間に戻る

ユーザーの最初の入力にチェックを割り当てたとき:

if($loginza['status']==0)







などなど。

ユーザーが既にサイトに正常にログインしている場合、彼のloginzaテーブルのステータスは1です。

このloginzaエントリのuser_idを知って、承認のために送信する必要があります! そしてそれだけです!

if($loginza['status']==1)

{

Someauthorization($loginza['user_id']); //,

}







セキュリティについて一言


私の意見では、Loginzaは十分なセキュリティを提供し、すべてが重要です

ジャムは-ある種の隠蔽された。 個人的には、潜在的な脆弱性は見当たりません。



私が引用したコードに関しては、これは単なる例であり、イラストであり、既製のコードではありません。 ない

それが存在する形式で私が与えたコードを使用する価値があります。



All Articles