使用Laravel Passport登录第三方网站

SPQRInc

我需要解决以下问题:我使用Laravel创建了两个应用程序。

  • 应用程序A可通过以下方式达到https://test.example.org,并提供了护照实例和所有的用户数据(型号:User)。
  • 可以通过https://test.orgAPI来访问应用程序B并使用API​​。应用程序A使用存在于应用程序A中的“ api-user”来获取“公共”数据

现在,我想为应用程序B的用户提供一种登录方法使用应用程序B的所有用户都存在于应用程序A中因此,登录到应用程序B的用户正在使用保存在应用程序A中的凭据应用程序A中对用户所做的所有更改应在应用程序B上可见

现在我不知道该怎么办。任何想法如何解决这个问题?我可以想象将API调用与

        $client = $this->client;
        try {
            return $client->request('POST',
                'https://'.config('server').'/oauth/token', [
                    'headers'     => [
                        'cache-control' => 'no-cache',
                        'Content-Type'  => 'application/x-www-form-urlencoded',
                    ],
                    'form_params' => [
                        'client_id'     => ...,
                        'client_secret' => ...,
                        'grant_type'    => 'password',
                        'username'      => $users-username,
                        'password'      => $users-password,
                    ],
                ]);
        } catch (BadResponseException $e) {
            return $e->getResponse();
        }
    }

但是我不知道是否需要为Application A上的每个用户创建一个client_id在这种情况下,我需要将这些信息存储在某个地方,以便最终Application B本身上创建一个模型client_secretUser

我的问题是:

  • 如何以最简洁的方式应用程序A上现有的用户登录应用程序B
  • 是否可以从客户端(应用程序B使用Laravel / Socialite
设计

最优雅的方法是在应用程序B中使用Laravel Socialite充当应用程序A的OAuth客户端,该应用程序A充当OAuth服务器(使用Laravel Passport)。

  1. 应用程序A上,您需要在Passport上为应用程序B创建一个客户端
php artisan passport:client --password

首先,将询问您Which user ID should the client be assigned to?如果您不想将客户端限制为特定用户,请按Enter键。

然后,将要求您为客户提供名称,您应输入Application B

最后,将要求您提供客户端的重定向URL。您应该输入https://test.org/oauth/callback,这是Socialite将在用户通过身份验证后将其重定向回的URL。

如果需要在计算机上进行测试,请输入您的本地域,例如https://application-b.test/oauth/callback

创建客户端后,请对客户端ID和客户端保密,因为以后将需要它们。

您还需要一个API端点来提供已认证用户的详细信息,例如https://test.example.org/user

  1. Application B上,在安装Laravel Socialite之后,您需要配置文件中设置Application A的凭据services.php例如:
'passport' => [
    'client_id' => env('PASSPORT_CLIENT_ID'),
    'client_secret' => env('PASSPORT_CLIENT_SECRET'),
    'redirect' => 'oauth/callback',
],

.env文件中,为在应用程序A中创建的Passport客户端设置客户端ID和密码

PASSPORT_CLIENT_ID=...
PASSPORT_CLIENT_SECRET=...
  1. 现在,您需要使用的自定义提供程序扩展Socialite Application A

PassportProviderapp/Socialite目录中创建一个app如果需要,可以在内部的任何地方)。

<?php

namespace App\Socialite;

use Laravel\Socialite\Two\AbstractProvider;
use Laravel\Socialite\Two\ProviderInterface;
use Laravel\Socialite\Two\User;
use Illuminate\Support\Arr;

class PassportProvider extends AbstractProvider implements ProviderInterface
{
    /**
     * {@inheritdoc}
     */
    protected function getAuthUrl($state)
    {
        return $this->buildAuthUrlFromBase('https://test.example.org/oauth/authorize', $state);
    }

    /**
     * {@inheritdoc}
     */
    protected function getTokenUrl()
    {
        return 'https://test.example.org/oauth/token';
    }

    /**
     * {@inheritdoc}
     */
    protected function getUserByToken($token)
    {
        $response = $this->getHttpClient()->get(
            'https://test.example.org/user',
            $this->getRequestOptions($token)
        );

        return json_decode($response->getBody(), true);
    }

    /**
     * {@inheritdoc}
     */
    protected function mapUserToObject(array $user)
    {
        return (new User)->setRaw($user)->map([
            'id' => $user['id'],
            'name' => Arr::get($user, 'name'),
            'email' => Arr::get($user, 'email'),
        ]);
    }

    /**
     * Get the default options for an HTTP request.
     *
     * @param string $token
     * @return array
     */
    protected function getRequestOptions($token)
    {
        return [
            'headers' => [
                'Accept' => 'application/json',
                'Authorization' => 'token '.$token,
            ],
        ];
    }
}

接下来,在您的ApplicationServiceProvider(或在单独的服务提供商中)添加以下内容:

use App\Socialite\PassportProvider;
use Illuminate\Support\Facades\URL;
use Laravel\Socialite\Facades\Socialite;

public function boot()
{
    Socialite::extend('passport', function (function ($app) {
        $config = $app['config']['services.passport'];

        return new PassportProvider(
            $app['request'],
            $config['client_id'],
            $config['client_secret'],
            URL::to($config['redirect'])
        );
    });
}

现在,您可以在客户端应用程序的登录控制器中使用自定义的Socialite提供程序:

<?php

namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller;
use Laravel\Socialite\Facades\Socialite;

class LoginController extends Controller
{
    /**
     * Redirect the user to the GitHub authentication page.
     *
     * @return \Illuminate\Http\RedirectResponse
     */
    public function redirectToProvider()
    {
        return Socialite::driver('passport')->redirect();
    }

    /**
     * Obtain the user information from GitHub.
     *
     * @return \Illuminate\Http\Response
     */
    public function handleProviderCallback()
    {
        $user = Socialite::driver('passport')->user();
    }
}

不要忘记在routes/web.php文件中注册登录路由

Route::get('oauth/redirect', 'Auth\LoginController@redirectToProvider');
Route::get('oauth/callback', 'Auth\LoginController@handleProviderCallback');

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何使用AngularJs构建可嵌入第三方网站的小部件?

来自分类Dev

第三方登录是否可以在iframe中使用?

来自分类Dev

使用sbt发布jar文件(第三方)

来自分类Dev

在angular指令中使用第三方lib

来自分类Dev

计算类的实例-使用Firebug将jQuery注入第三方网站吗?

来自分类Dev

使用第三方登录提供程序保护Rest API

来自分类Dev

使用第三方库(sbpl)

来自分类Dev

使用jquery cookie的第三方cookie

来自分类Dev

如何使用Google Analytics(分析)针对第三方网站创建跟踪像素?

来自分类Dev

使用GIT进行协作-第三方库

来自分类Dev

使用Firebase隐藏第三方API密钥

来自分类Dev

使用第三方登录的Auth0 LoopbackJS API访问令牌

来自分类Dev

在Jint中使用第三方js库

来自分类Dev

如何使用第三方@ConfigurationProperties @Bean?

来自分类Dev

使用第三方认证的Laravel Auth

来自分类Dev

防止使用第三方基类

来自分类Dev

ImageJ:如何使用第三方插件API?

来自分类Dev

在NetBeans中使用第三方库

来自分类Dev

使用sbt发布jar文件(第三方)

来自分类Dev

第三方登录是否可以在iframe中使用?

来自分类Dev

使用C#更好的方法来在第三方网站上搜索数据

来自分类Dev

使用第三方控件

来自分类Dev

使用第三方付款产生的错误

来自分类Dev

如何使用django的基本访问身份验证将客户端登录到第三方网站

来自分类Dev

使用第三方库进行Python部署

来自分类Dev

跟踪第三方应用程序的使用

来自分类Dev

使用第三方控件

来自分类Dev

如何使用php从第三方网站解析格式错误的RSS feed?

来自分类Dev

第三方库的使用