ホームページ >バックエンド開発 >PHPチュートリアル >複数のソーシャル アカウントの拘束力の設計に関する簡単な説明

複数のソーシャル アカウントの拘束力の設計に関する簡単な説明

WBOY
WBOYオリジナル
2016-09-28 08:54:131156ブラウズ

DearmadmanはLaravel Socialiteの詳細説明でlarastarscn/socialiteを使用して、サードパーティアカウントのログイン統合の問題を解決します。 では、ユーザー情報を取得した後はどうなりますか?複数のソーシャルアカウントを統合するにはどうすればよいですか?この記事では、統合ログインについて説明します。

まずは

最初に、単一のソーシャル ログインのみを統合する必要がある場合は、タスクを迅速に完了するために、単純に open_id または github_id のような属性をユーザー モデルに追加します。次に、データベースで、対応するフィールドをテーブルに追加する必要があります。 。これは、仕事を迅速かつ効率的に完了する方法です。

しかし、さらに多くの要求が来て、1 つ以上のソーシャル ログインを追加で統合する必要がある場合、どうすればよいでしょうか?やはり対応するフィールドを意図的にテーブル構造に追加する必要があるのでしょうか?

リーリー

これは明らかにオープン性とクロージャ性の原則に違反します。これを行うと、別のログインを統合するたびにデータ テーブル構造を修正する必要があり、ログイン認証コールバックの検証中に、ドライバーとフィールドクエリのマッチングを統合するプロセスを追加することも必要です。

どうすればいいですか?

想像してください

このように考えると、User テーブルは、これらのソーシャル ID の管理にエネルギーを浪費する必要があるのでしょうか?ユーザーとソーシャル アカウント間の関係を具体的に管理するために SocialiteUser を配置してはどうでしょうか?さまざまなドライバーのソーシャル ログインを管理するための簡単にスケーラブルなソリューションを設計する必要があるため、このテーブル構造を簡単に設計できます:

リーリー

SocialiteUser はどのような責任を負う必要がありますか?明らかに、これは主にソーシャル ログイン識別子とユーザー モデルの間の関係を維持するために使用されます。次に、次の機能が必要になります:

  • ソーシャルログインアカウントをユーザーモデルにバインドする

  • 一致するユーザーモデルを取得

以下は簡単なコードのデモです:

リーリー

使用する

認証ログイン プロセスでは、ユーザーは認証に同意し、サードパーティ アプリケーションはコールバック ルートにリダイレクトされ、Socialite はユーザー情報の取得を積極的に要求し、ユーザーのソーシャル ID ID を id 属性にマッピングします。 Userモデルの。

その後、コールバック ルートでドライバー ID とユーザーの対応するソーシャル ID ID を使用して、クエリ ライブラリにバインドされたユーザーが存在するかどうかを照合できます。存在する場合は、一致したユーザーで直接ログインします。存在しない場合は、ユーザーを生成し、このユーザーにソーシャル アカウント情報を添付します。次に、新しく生成されたアカウントを使用してログインします。

リーリー

新しいソーシャル ログイン統合が必要な場合は、他のコードを変更する必要はなく、ドライバーを直接設定するだけのようです。

追記: Jianshu Laravel のトピックに注目することを歓迎します。また、Laravel 関連の記事の投稿も歓迎します。作者の知識とスキルには限界がありますので、より良い設計プランがある場合は、ぜひ議論して交換してください。間違いがある場合は、ここで批判して修正してください。ありがとうございます:)

返信内容:

DearmadmanはLaravel Socialiteの詳細説明でlarastarscn/socialiteを使用して、サードパーティアカウントのログイン統合の問題を解決します。 では、ユーザー情報を取得した後はどうなりますか?複数のソーシャルアカウントを統合するにはどうすればよいですか?この記事では、統合ログインについて説明します。

まずは

最初に、単一のソーシャル ログインのみを統合する必要がある場合は、タスクを迅速に完了するために、単純に open_id または github_id のような属性をユーザー モデルに追加します。次に、データベースで、対応するフィールドをテーブルに追加する必要があります。 。これは、仕事を迅速かつ効率的に完了する方法です。

しかし、さらに多くの要求が来て、1 つ以上のソーシャル ログインを追加で統合する必要がある場合、どうすればよいでしょうか?やはり対応するフィールドを意図的にテーブル構造に追加する必要があるのでしょうか?

リーリー

これは明らかにオープン性とクロージャ性の原則に違反します。これを行うと、別のログインを統合するたびにデータ テーブル構造を修正する必要があり、ログイン認証コールバックの検証中に、ドライバーとフィールドクエリのマッチングを統合するプロセスを追加することも必要です。

どうすればいいですか?

想像してください

このように考えると、User テーブルは、これらのソーシャル ID の管理にエネルギーを浪費する必要があるのでしょうか?ユーザーとソーシャル アカウント間の関係を具体的に管理するために SocialiteUser を配置してはどうでしょうか?さまざまなドライバーのソーシャル ログインを管理するための簡単にスケーラブルなソリューションを設計する必要があるため、このテーブル構造を簡単に設計できます:

リーリー

SocialiteUser はどのような責任を負う必要がありますか?明らかに、これは主にソーシャル ログイン識別子とユーザー モデルの間の関係を維持するために使用されます。次に、次の機能が必要になります:

  • 将社交登录账户绑定到用户模型上

  • 获取匹配的用户模型

以下为简单的代码演示:

<code class="php"><?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class SocialiteUser extends Model
{
    public $guarded = ['id'];

    /**
     * Get user instance by driver and openid.
     *
     * @param  $driver  string
     * @param  $openid  string
     * @return /App/User|null
     */
    public function getUser($driver, $openid)
    {
        $finder =  $this->where([
            'driver' => $driver,
            'open_id' => $openid
        ])->first();

        return $finder ? $finder->user : $finder;
    }

    /**
     * get related user model.
     *
     * @return /App/User||null
     */
    public function user()
    {
        return $this->belongsTo('App\User');
    }

    /**
     * Save a new record.
     *
     * @param  $userId  integer
     * @param  $driver  string
     * @param  $id  string
     * @return /App/SocialiteUser
     */
    public function saveOne($userId, $driver, $id)
    {
        return $this->create([
            'user_id' => $userId,
            'driver' => $driver,
            'open_id' => $id
       ]);
    }
}
</code>

使用

在授权登录流程中,用户同意授权,第三方应用将重定向到回调路由,回调路由中 Socialite 会主动请求获取用户资料,并将用户的社交标识 ID 映射到 User 模型的 id 属性上。

那么我们就可以在回调路由中根据驱动标识和用户相应的社交标识 ID 来匹配查询库中是否已存在绑定的用户。如果存在那就直接使用匹配到的用户登录,如果不存在,那么就生成一个用户,并为这个用户附加社交账户信息。然后使用新生成的账户登录。

<code class="php"><?php

namespace App\Http\Controllers;

use App\SocialiteUser;
use App\User;
use Socialite;

class OAuthAuthorizationController extends Controller
{
    //
    public function redirectToProvider($driver)
    {
        return Socialite::driver($driver)->redirect();
    }

    public function handleProviderCallback($driver)
    {
        $user =  Socialite::driver($driver)->user();

        $model = new User();
        $socialiteUser = new SocialiteUser();
        $finder = $socialiteUser->getUser($driver, $user->id);
        if (! $finder) {
            $finder = $model->generateUserInstance();
            $finder->save();
            $socialiteUser->saveOne($finder->id, $driver, $user->id);
        }
        
        Auth::login($finder);

        return view('home');
    }
}
</code>

这样看来,如果需求一种新的社交登录的集成,那么完全不需要做出其它代码的改动,直接配置驱动就可以了。

PS: 欢迎关注简书 Laravel 专题,也欢迎 Laravel 相关文章的投稿 :),作者知识技能水平有限,如果你有更好的设计方案欢迎讨论交流,如果有错误的地方也请批评指正,在此表示感谢谢谢 :)

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。