icemix / laravel-passport-social-grant

Icemix 社交授权,用于 Laravel Passport

1.0 2019-11-02 09:06 UTC

This package is auto-updated.

Last update: 2024-08-29 05:12:45 UTC


README

此软件包为您的 OAuth2 服务器添加了社交授权。如果您有一个 API 并且想为用户提供通过社交网络登录/注册的能力,这可能非常有用。

因此,您将能够将任何社交提供商的 OAuth2 服务器发布的 access_token 交换为您的 OAuth2 服务器发布的 access_tokenrefresh_token。您将收到此 access_token,并在您的服务器上返回与其对应的用户实例。

安装

您可以通过以下命令使用 composer 安装此软件包

composer require icemix/laravel-passport-social-grant

该软件包将自动注册自身。

配置

作为第一步,您需要实现 SocialUserResolverInterface

<?php

namespace App\Resolvers;

use Icemix\SocialGrant\Resolvers\SocialUserResolverInterface;
use Illuminate\Contracts\Auth\Authenticatable;
use Laravel\Socialite\Facades\Socialite;

class SocialUserResolver implements SocialUserResolverInterface
{
    /**
     * Resolve user by provider credentials.
     *
     * @param string $provider
     * @param string $accessToken
     *
     * @return Authenticatable|null
     */
    public function resolveUserByProviderCredentials(string $provider, string $accessToken): ?Authenticatable
    {
        // Return the user that corresponds to provided credentials.
        // If the credentials are invalid, then return NULL.
    }
}

下一步是将 SocialUserResolverInterface 绑定到您的实现。

您可以通过在 AppServiceProvider 中的 $bindings 属性中添加适当的键值对来完成此操作

<?php

namespace App\Providers;

use App\Resolvers\SocialUserResolver;
use Icemix\SocialGrant\Resolvers\SocialUserResolverInterface;
use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    /**
     * All of the container bindings that should be registered.
     *
     * @var array
     */
    public $bindings = [
        SocialUserResolverInterface::class => SocialUserResolver::class,
    ];
}

完成!

用法

使用 axios 的示例用法

axios.post('/oauth/token', {
    grant_type: 'social', // static 'social' value
    client_id: clientId, // client id
    client_secret: clientSecret, // client secret
    provider: providerName, // name of provider (e.g., 'facebook', 'google' etc.)
    access_token: providerAccessToken, // access token issued by specified provider
  })
  .then((response) => {
    const {
      access_token: accessToken,
      expires_in: expiresIn,
      refresh_token: refreshToken,
    } = response.data;

    // success logic
  })
  .catch((error) => {
    const {
      message,
      hint,
    } = error.response.data;

    // error logic
  });

使用 guzzle 的示例用法

<?php

use GuzzleHttp\Client;
use Illuminate\Support\Arr;

$http = new Client;

$response = $http->post($domain . '/oauth/token', [
    RequestOptions::FORM_PARAMS => [
        'grant_type' => 'social', // static 'social' value
        'client_id' => $clientId, // client id
        'client_secret' => $clientSecret, // client secret
        'provider' => $providerName, // name of provider (e.g., 'facebook', 'google' etc.)
        'access_token' => $providerAccessToken, // access token issued by specified provider
    ],
    RequestOptions::HTTP_ERRORS => false,
]);
$data = json_decode($response->getBody()->getContents(), true);

if ($response->getStatusCode() === Response::HTTP_OK) {
    $accessToken = Arr::get($data, 'access_token');
    $expiresIn = Arr::get($data, 'expires_in');
    $refreshToken = Arr::get($data, 'refresh_token');

    // success logic
} else {
    $message = Arr::get($data, 'message');
    $hint = Arr::get($data, 'hint');

    // error logic
}

测试

您可以使用以下命令运行测试

composer test

变更日志

请参阅 CHANGELOG 以获取有关最近更改的更多信息。

贡献

请参阅 CONTRIBUTING 以获取详细信息。

许可证

MIT 许可证 (MIT)。请参阅 许可证文件 以获取更多信息。