smallhadroncollider/social-login

此包已被弃用且不再维护。未建议替代包。

一个简化API中心化PHP应用程序社交登录的包

0.6.3 2015-09-22 12:53 UTC

This package is not auto-updated.

Last update: 2020-07-08 15:47:30 UTC


README

Version Build Status

Laravel Socialite 非常好。但它不是针对 API中心化 PHP应用程序而设计的:它依赖于会话(无状态API将缺少)和特定的 GET 参数(可能不理想)。

社交登录包旨在简化在具有OAuth 2受保护API的应用程序中添加社交登录的过程。

使用OAuth 2 API的典型用法

  • 客户端:生成会话并从API请求授权URL
/*
 * GET https://mysite.com/login
 */

// start a session
session_start();
$sessionID = session_id();

// get the list of supported social login urls
$urls = $http->get("https://api.mysite.com/v1/auth/social/urls", [
    "session_id" => $sessionID,
]);
  • API:使用会话ID创建新的 SocialLogin 实例
/*
 * GET https://api.mysite.com/v1/auth/social/urls
 */

use SmallHadronCollider\SocialLogin\SocialLogin;
use SmallHadronCollider\SocialLogin\Storers\MemcachedStorer;

$config = [
    "facebook" => [
        "client_id" => "1",
        "client_secret" => "secret",
        "redirect_url" => "https://mysite.com/login/social?platform=facebook",
    ],
];

$storer = new MemcachedStorer();

$login = new SocialLogin($config, $storer);
$login->setSessionID($_GET["session_id"]);

return json_encode($login->getAuthUrls());
  • 客户端:将用户发送到第三方授权页面
/*
 * GET https://mysite.com/login
 */

<a href="<?= $urls["facebook"] ?>">Login With Facebook</a>
  • 客户端:获取返回重定向的授权码
/*
 * GET https://mysite.com/login/social?platform=facebook&code=blahblahblah&state=rhubarbrhubarb
 */

$code = $_GET["code"];
$state = $_GET["state"];

$userDetails = $http->post("https://api.mysite.com/v1/auth/social", [
    "code" => "{$code}:{$state}",
    "platform" => $_GET["platform"],
    "session_id" => $sessionID,
]);
  • API:使用授权码请求用户
/*
 * POST https://api.mysite.com/v1/auth/social
 */

// Setup SocialLogin as before... (see above)
$login = (new SocialLogin($config, $storer))->setSessionID($_POST["session_id"]);

$code = $_POST["code"];

$platform = $login->platform($_POST["platform"]);
$token = $platform->getTokenFromCode($code);
$user = $platform->getUserFromToken($code);
  • API:检查用户是否存在于用户数据库中
    • 如果用户不存在,则创建用户
/*
 * POST https://api.mysite.com/v1/auth/social
 */

if (/* user does not exist in database */) {
    // Create a new user from
    // $user->id, $user->name, $user->email
}

if (/* user in database has different social id to logged in user */) {
    // return a 401 page
}
  • API:返回带有平台前缀的用户ID和令牌
/*
 * POST https://api.mysite.com/v1/auth/social
 */

return json_encode([
    "user_id" => $user->id,
    "token" => $platform->addPlatform($token),
]);
  • 客户端:使用登录详情授权用户
/*
 * GET https://mysite.com/login/social?platform=facebook&code=blahblahblah&state=rhubarbrhubarb
 */

$loggedIn = $http->post("https://api.mysite.com/v1/auth", [
    "client_id" => "oauthclientid",
    "client_secret" => "blahblahblah",
    "grant_type" => "password",
    "username" => $userDetails->user_id,
    "password" => $userDetails->token,
]);
  • API:检查用户名是否与存储的会话ID相匹配
/*
 * POST https://api.mysite.com/v1/auth
 */

function checkUserLoggedIn($username, $password) {
    if (/* $user using social login */) {
        $login = new SocialLogin($config, $storer);
        $platform = $login->platformFromToken($token);
        $token = $platform->stripPlatform($token);
        $user = $platform->getUserFromToken($token);

        if ($username === $user->id) {
            return true;
        }

        return false;
    } else {
        // Login normally (e.g. check the password)
    }
}

许可证

MIT许可证 (MIT)

版权所有 (c) 2015 小型强子对撞机

特此授予任何获得此软件及其相关文档副本(“软件”)的人,免费使用软件的权利,不受任何限制,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或出售软件副本的权利,并允许将软件提供给他人以便他们这样做,前提是符合以下条件

上述版权声明和本许可声明应包含在软件的所有副本或主要部分中。

软件按“原样”提供,不提供任何明示或暗示的保证,包括但不限于适销性、特定目的的适用性和非侵权性。在任何情况下,作者或版权所有者均不对任何索赔、损害或其他责任承担责任,无论此类责任是基于合同、侵权或其他方式,源于、因或与软件或软件的使用或其他交易有关。