当前位置: 首页 > 知识库问答 >
问题:

如何使用Laravel Passport为密码授予客户端创建令牌?

鲁昕
2023-03-14

我正在构建一个API,并使用Laravel Passport进行身份验证。

API正在用于我们的移动应用程序,因此我们正在使用密码授予客户端。

一切都很好,用户可以登录以获得访问令牌。我们创建了一个注册endpoint,允许用户注册。此时,我们也需要API返回访问令牌。

通过查看文档,无法通过编程方式创建访问令牌。

如何在控制器中为密码授予客户端创建访问令牌?我显然不想对自己的API执行HTTP请求来获取它。

我知道我可以使用个人访问授权客户端并在用户模型上调用createToken,但这意味着访问令牌与不同的客户端相关联。这对我来说似乎不对。

共有3个答案

宗政鸿志
2023-03-14

Patrick有了正确的想法,这就是我最终所做的:(我不认为Sanju的答案是对的,因为你需要提出超文本传输协议请求)

<?php

namespace MyApp\Http\Controllers\API;

use Illuminate\Http\Request;
use Laravel\Passport\Http\Controllers\ConvertsPsrResponses;
use League\OAuth2\Server\AuthorizationServer;
use MyApp\Http\Controllers\APIController;
use Illuminate\Auth\AuthenticationException;
use Zend\Diactoros\ServerRequest;
use Zend\Diactoros\Response as Psr7Response;

class LoginController extends APIController
{

    use ConvertsPsrResponses;

    /**
     *
     * @param Request $request
     * @param AuthorizationServer $authServer
     * @return \Illuminate\Http\JsonResponse
     * @throws AuthenticationException
     * @throws \League\OAuth2\Server\Exception\OAuthServerException
     */
    public function login(Request $request, AuthorizationServer $authServer)
    {
        $token = $this->getPasswordToken($request, $authServer);
        $data = [
            "token_details" => $token,
        ];

        return $this->successResponse(
            'Successful Login',
            200,
            $data
        );

    }


    /**
     * @param $request
     * @param AuthorizationServer $authServer
     * @return mixed
     * @throws \League\OAuth2\Server\Exception\OAuthServerException
     */
    private function getPasswordToken($request, AuthorizationServer $authServer)
    {
        $parsedBody = [
            'grant_type' => 'password',
            'client_id' => config('app.client_id'),
            'client_secret' => config('app.client_secret'),
            'username' => $request->username,
            'password' => $request->password,
            'scope' => '',
        ];

        $serverRequest = new ServerRequest(
            $request->server(),
            [],
            null,
            $request->method(),
            'php://input',
            $request->header(),
            [],
            [],
            $parsedBody
        );

        $response = $this->convertResponse(
            $authServer->respondToAccessTokenRequest($serverRequest, new Psr7Response)
        );
        return json_decode($response->getContent());
    }

}
邹修真
2023-03-14

我已经玩弄Passport几个星期了,从我在留档中看到的来看,它并没有公开它用于创建令牌的许多方法。虽然您可能无法轻松地在我的控制器中为密码授予客户端创建访问令牌-但您可以使用Route::dispatch将令牌请求转发到您的Passport Password Grant路由...

要在用于颁发令牌的控制器中执行此操作,请使用AuthenticatesUsers特征,以便您可以访问密码授予路由,创建请求,并将该请求发送到密码授予路由:

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Route;
use Illuminate\Foundation\Auth\AuthenticatesUsers;

class IssueTokensController extends Controller
{

    use AuthenticatesUsers;

    protected function issueApiToken(Request $request)
    {
        // forward the request to the oauth token request endpoint
        $tokenRequest = Request::create(
            '/oauth/token',
            'post'
        );
        return Route::dispatch($tokenRequest);
    }

}

当然,此方法需要您设置Passport和密码授予客户端。

这个答案是基于雷蒙德·拉贡达对类似问题的另一个答案——见https://stackoverflow.com/a/40433000/4991377

梅耘豪
2023-03-14

试试这样的

class UserController extends Controller
{
    protected function login(Request $request)
    {

         $request->request->add([
            'grant_type'    => 'password',
            'client_id'     => '3',
            'client_secret' => '6BHCRpB4tpXnQvC1DmpT7CXCSz7ukdw7IeZofiKn',
            'scope' => '*'
        ]);

        // forward the request to the oauth token request endpoint
        $tokenRequest = Request::create('/oauth/token','post');
        return Route::dispatch($tokenRequest);
    }

}
 类似资料:
  • 我试图弄清楚如何处理Passport包中的密码授予令牌。我是否应该将客户id和客户机密存储在中。env文件或在请求令牌时直接从数据库获取值?

  • 我刚读了报纸https://laravel.com/docs/5.6/passport我有一些疑问,希望有人能帮助我: 首先,在某些上下文中,我想使用Passport为我的移动应用程序(第一方应用程序)提供Oauth身份验证。 > 要向我的应用程序注册用户,我使用:

  • null 用户在登录表单中输入凭据->应用程序1将使用用户凭据从应用程序2获取令牌,其具有密码授予类型->使用令牌访问应用程序1的资源。 问题是Spring Security 5是否支持客户端的密码授予类型?我在Spring Security 5实现中找到了所有rest授予类型,但没有找到密码。

  • 问题内容: 我正在使用一组受oAuth2保护的服务。当前它是这样工作的:客户端使用其用户名和密码登录。我用这些交换令牌。我将令牌保存在会话中,并在每次调用服务时提交。它可以工作,但是问题是我完全手动执行此操作,而没有使用很多Spring Security oAuth2支持。外观如下: 如您所见,我自己创建了身份验证提供程序。它正在接受该标准,但正在产生自己的扩展,该扩展也保留了实际内容,因此将其保

  • 问题内容: 根据规范,不要求使用授权码补助金的令牌的请求作为要被认证,只要是包含在请求和所述是相同的一个用于生成所述代码。但是,使用Spring Security OAuth 2.0实现,即使从未为客户端分配秘密,端点上始终总是需要基本身份验证。 似乎由于接口中的方法,似乎支持允许客户端没有秘密。为了使没有秘密的客户端能够在上进行身份验证,我该怎么做? 4.1.3。访问令牌请求 客户端通过 按照附

  • 我想使用证书凭据将文件上载到s3。是否可以使用certifcate获取s3 bucket的客户机对象? 最初,我尝试使用下面的命令上传一个文件, 现在,我不想使用ACCESS_KEY | SECRET_KEY来创建客户机对象,因为它正在边缘设备上运行。相反,我已经生成了证书(IOT)。我想使用此证书创建客户端对象。因此,最后我有了临时访问权|密钥|秘密|会话|令牌。我想传递这些临时凭据以创建客户端