资讯专栏INFORMATION COLUMN

浅谈多个社交账号的绑定设计

wean / 1686人阅读

摘要:在详解中使用解决了第三方账号登录集成的问题,那么在获取到用户资料之后呢集成多个社交账号,该如何绑定同一个账号本篇就让我们来探讨一下集成登录的那点事。

Dearmadman 在 Laravel Socialite 详解 中使用 larastarscn/socialite 解决了第三方账号登录集成的问题,那么在获取到用户资料之后呢?集成多个社交账号,该如何绑定同一个账号?本篇就让我们来探讨一下集成登录的那点事。

起初

起初,当我们只需要集成单个社交登录时,我们可能会为了快速的完成任务简单粗暴的在用户模型中加入 open_id 或者 github_id 类似的属性,那么在数据库中,我们需要在表中添加相应的字段。这是可以快速有效的完成任务的做法。

但是,当更多的需求来临时,要求我们额外的集成一种或者多种社交登录,那该怎么办?难道我们还要任性的在表结构中添加相应的字段?

Schema::table("users", function ($table) {
  $table->string("github_id");
  $table->string("douban_id");
});

这很明显的违背了开放封闭原则,假如我们这么做,那么可以想象的当每多集成一种登录时,我们就需要对数据表结构做出一次修正,并且,在登录授权回调验证时,还要增加一道集成驱动与字段查询匹配的工序。

那应该怎么做?

设想

这么想来,User 表是否承担了过多的能力,它是否应该浪费自己的精力来管理这些社交标识?那不如我们安排 SocialiteUser 来专门管理用户与社交账号之间的关系?我们需要设计一种易扩展的方案来管理不同驱动的社交登录,那么我们很容易的设计出这种表结构:

- socialite_users
  - id
  - user_id
  - driver
  - open_id

SocialiteUser 应该具有哪些职责?很显然,它主要用来维护社交登录标识和用户模型之间的关系。那么它应该具有以下能力:

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

获取匹配的用户模型

以下为简单的代码演示:

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("AppUser");
    }

    /**
     * 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
       ]);
    }
}
使用

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

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

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");
    }
}

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

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/30484.html

相关文章

  • 浅谈多个社交账号登录注册设计

    摘要:本篇文章,主要讲述了用户登录注册的逻辑及如何用社交账号登录。仅供参考,具体情况依据产品需求而定。社交账号登录参数参数平台渠道社交平台开放验证数据的合法性。若存在,直接进行登录。若本站不存在账号,引导用户注册,成功后与当前关联即可。 本篇文章,主要讲述了用户登录注册的逻辑及如何用社交账号登录。 仅供参考,具体情况依据产品需求而定。 开放平台有哪些? 微信 Sina微博 QQ 163 3...

    Mr_houzi 评论0 收藏0
  • 互联网业务安全之通用安全风险模型

    摘要:验证码安全参考信息重放登录注册找密等入口,可能通过短信验证码邮箱验证码之类的进行确认操作,如果末对操作进行次数及频率上的限制,则会产生大量的重放攻击。高并发缺陷交易类重放攻击,高并发的情况下末对用户操作行为加锁,导致购买限制的绕过。 showImg(https://segmentfault.com/img/bVBVVR); 业务安全从流程设计维度可划分为账户体系安全、交易体系安全、支付...

    liaorio 评论0 收藏0
  • OAuth 2.0协议在SAP产品中应用

    摘要:阮一峰老师曾经在他的博文理解里对这个概念有了深入浅出的阐述。注这是阮一峰老师文章里提到的中的认证模式之一简化模式客户听起来不错这样我就不需要把我们公司的用户的密码提供给您了。这下您放心了吧注这种方式即阮一峰文章里介绍的授权码模式。 阮一峰老师曾经在他的博文理解OAuth 2.0里对这个概念有了深入浅出的阐述。 http://www.ruanyifeng.com/blo... 本文会结合...

    qiangdada 评论0 收藏0
  • OAuth 2.0协议在SAP产品中应用

    摘要:阮一峰老师曾经在他的博文理解里对这个概念有了深入浅出的阐述。注这是阮一峰老师文章里提到的中的认证模式之一简化模式客户听起来不错这样我就不需要把我们公司的用户的密码提供给您了。这下您放心了吧注这种方式即阮一峰文章里介绍的授权码模式。 阮一峰老师曾经在他的博文理解OAuth 2.0里对这个概念有了深入浅出的阐述。 http://www.ruanyifeng.com/blo... 本文会结合...

    princekin 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<