efureev/social

此包的最新版本(v1.3.0)没有可用的许可证信息。

v1.3.0 2020-01-14 05:17 UTC

This package is auto-updated.

Last update: 2024-09-14 18:53:17 UTC


README

Latest Stable Version Total Downloads Latest Unstable Version

信息

Laravel Socialite的包装器

安装

  • composer require efureev/social
  • 运行迁移:./artisan migrate
  • 如果需要,发布配置:./artisan vendor:publish --tag=social

基本用法

  • 已发布资源:php artisan vendor:publish --tag=social
  • 将配置文件social.php填充到config目录中,包含您的社交驱动程序
<?php
return [
    'drivers' => [
        'vk' => [
            'clientId' => env('VK_CLIENT_ID'),
            'clientSecret' => env('VK_CLIENT_SECRET'),
        ],
        'github' => [
            // ...
        ],
        // ...
    ],
];
  • 将变量添加到您的应用.env文件中:VK_CLIENT_ID=...VK_CLIENT_SECRET=...,使用VK凭证。请参阅 https://vk.com/apps?act=manage
  • 运行迁移:php artisan migration
  • 添加到视图中(例如:resources/views/auth/login.blade.php
    • 列表:@include('social::list', ['socials' => app('social')->getProviders()])
    • 图标:@include('social::icons', ['socials' => app('social')->getProviders()])
  • 完成!

要自定义,请参阅配置和文档。

配置

配置属性

  • redirectOnAuth [字符串] 用户认证后重定向的地址。
  • onSuccess [\Closure|array] 认证成功时的操作。参数:\Fureev\Socialite\Two\AbstractProvider
  • drivers [数组] 驱动程序列表 (driverName => driverConfig)
  • userClass [字符串] 认证用户类 (userClass => 'App/Models/User')

驱动程序配置

  • clientId [字符串] 需要
  • clientSecret [字符串] 需要
  • enabled [布尔] 默认,true。
  • label [字符串] 视图中的标题。默认,driverName
  • provider [字符串] 提供者类 (\Fureev\Socialite\Two\AbstractProvider)
  • url_token [字符串] 提供者的令牌URL
  • url_auth [字符串] 提供者的认证URL
  • userInfoUrl [字符串] 获取原始用户数据的URL
  • onSuccess [\Closure|array] 认证成功时的操作。覆盖通用 onSuccess
  • scopeSeparator [字符串]
  • scopes [数组]

示例

文件 config/social.php

<?php

return [
    'onSuccess' => function ($driver) {
        $user = \Fureev\Social\Services\SocialAccountService::setOrGetUser($driver);

        return \Fureev\Social\Services\SocialAccountService::auth($user);
    },
    //'onSuccess' => [\App\Http\Controllers\IndexController::class, 'index'],
    'drivers'   => [
        'gitlab' => [
            'enabled'  => false,
            'provider' => \Fureev\Socialite\Two\GitlabProvider::class,
            //            'enabled'  => false,
            'label'    => '<i class="fab fa-gitlab"></i>'
        ],
        'vk'     => [
            // 'enabled'  => false,
            'label'        => '<i class="fab fa-vk"></i>',
            'clientId'     => env('VK_CLIENT_ID'),
            'clientSecret' => env('VK_CLIENT_SECRET'),
        ],
        'github' => [
            'enabled' => false,
            'label'   => '<i class="fab fa-github-alt"></i>'
        ],
        'custom_auth' => [
            'clientId' => env('SOCIAL_AUTH_CLIENT_ID'),
            'clientSecret' => env('SOCIAL_AUTH_CLIENT_SECRET'),
            'url_auth' => 'http://api.auth.x/auth/authorize',
            'url_token' => 'http://api.auth.x/auth/token',
            'userInfoUrl' => 'http://api.auth.x/users/info',
            'scopeSeparator' => ',',
            'scopes' => ['name','email','photo'],
            'tokenFieldsExtra' => [
                'grant_type' => 'authorization_code',
            ],
            'mapFields' =>
                [
                    'id' => 'id',
                    'name' => ['profile.first_name.v', new \Fureev\Socialite\Separator, 'profile.last_name.v'],
                    'email' => 'profile.email.v',
                    'avatar' => 'photo',
                    'nickname' => 'id',
                    'profileId' => 'profileId',
                ],
            'guzzle' => [
                'query' => [
                    'prettyPrint' => 'false',
                ],
                'headers' => [
                    'Accept' => 'application/json',
                    'Authorization' => 'Bearer {{%TOKEN%}}',
                ],
            ],
        ],
        'google' => [
            // 'enabled'      => false,
            'clientId'         => env('G+_CLIENT_ID'),
            'clientSecret'     => env('G+_CLIENT_SECRET'),
            'url_token'        => 'https://#/o/oauth2/token',
            'url_auth'         => 'https://#/o/oauth2/auth',
            'userInfoUrl'      => 'https://www.googleapis.com/plus/v1/people/me?',
            'label'            => '<i class="fab fa-google"></i>',
            //            'onSuccess'        => [\App\Http\Controllers\HomeController::class, 'index'],
            'scopeSeparator'   => ' ',
            'scopes'           => ['openid', 'profile', 'email',],
            'tokenFieldsExtra' => [
                'grant_type' => 'authorization_code'
            ],
            'mapFields'        =>
                [
                    'id'     => 'id',
                    'name'   => 'displayName',
                    'email'  => 'emails.0.value',
                    'avatar' => 'image.url',
                ],
            'guzzle'           => [
                'query'   => [
                    'prettyPrint' => 'false',
                ],
                'headers' => [
                    'Accept'        => 'application/json',
                    'Authorization' => 'Bearer {{%TOKEN%}}',
                ],
            ]
        ]
    ]
];

文件 \App\Services\SocialAccountService.php

<?php 
use Fureev\Socialite\Contracts\Provider as ProviderContract;
class SocialAccountService
{
    public static function setOrGetUser(ProviderContract $provider)
    {
        $providerUser = $provider->user();

        $providerName = $provider->getName();

        //...

    }
}

在您的视图中自动添加社交提供者

@extends('layouts.login')

@section('content')
  <form method="POST" action="{{ route('login') }}">
    @csrf
    <div class="input-group">
      <input type="text" name="email" id="email"
             class="input-text" autocomplete="email"
             spellcheck="false" required autofocus value="{{ old('email') }}"><i class="ig-helpers"></i>
      <label for="email" class="input-label">E-mail</label>
    </div>
    <div class="input-group">
      <input type="password" name="password" id="password" autocomplete="password"
             class="input-text" required><i class="ig-helpers"></i>
      <label class="input-label" for="password">Пароль</label>
    </div>
    <div class="buttons">
      <button class="btn-rnd" type="submit"><i class="fas fa-sign-in-alt"></i></button>
      <a href="{{ route('password.request') }}" title="забыли пароль?"><i class="far fa-question-circle"></i></a>
    </div>
    @include('social::icons', ['socials' => app('social')->getProviders()])
    // or 
    @include('social::list', ['socials' => app('social')->getProviders()])
  </form>
@endsection