Laravel Passport - 功能测试返回未经授权的 401

2023-12-26

我正在尝试测试我的登录端点,其中成功的响应将返回access_token除其他事项外。

我在用着RefreshDatabase,所以我更改了控制器上的登录方法来检索client_secret via a DB称呼。我测试了一个dd()我可以确认 client_secret 在每个phpunit在终端中运行。凭据正确并且 API 端点可以工作 - 只是在通过测试运行时不行。例如,我在 mysql 服务器上设置了护照表,并且在运行 Postman 时可以成功登录。只有当尝试运行测试时我才会得到401 error.

这是我的AuthTest

<?php

namespace Tests\Feature;

use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithFaker;
use Tests\TestCase;

class AuthTest extends TestCase
{
    use RefreshDatabase;



    /**
     * @test
     */
    public function a_user_receives_an_access_token()
    {

         \Artisan::call('passport:install');

        $user = factory('App\User')->create();

        $response = $this->json('POST', '/api/login', [
            'username' => $user->email,
            'password' => 'password'
        ]);



        $response
            ->assertJson([
                'access_token' => true
            ]);


    }
}

路线/api.php

Route::post('login', 'AuthController@login');

AuthController@登录:

    public function login(Request $request) {
        $http = new \GuzzleHttp\Client;

        try {
            $response = $http->post(config('services.passport.login_endpoint'), [
                'form_params' => [
                    'grant_type' => 'password',
                    'client_id' =>  '2', //config('services.passport.client_id')
                    'client_secret' => DB::table('oauth_clients')->where('id', 2)->pluck('secret')[0], //config('services.passport.client_secret'),
                    'username' => $request->username,
                    'password' => $request->password
                ]
            ]);

            return $response->getBody();

        } catch (\GuzzleHttp\Exception\BadResponseException $e) {



            if ($e->getCode() == 400 || $e->getCode() == 401) {
                return response()
                ->json([
                    'status' => $e->getCode(),
                    'message' => 'Your email and/or password are incorrect',
                    'expanded' => $e->getMessage()
                ]);
            }

            return response()
                ->json([
                    'status' => $e->getCode(),
                    'message' => $e->getMessage()
                ]);
        }

    }

我看了一下这个问题和接受的答案:如何使用 Laravel Passport 通过 API 测试身份验证? https://stackoverflow.com/questions/50113508/how-to-test-authentication-via-api-with-laravel-passport

我无法使用以下内容

public function setUp() {
    parent::setUp();
    \Artisan::call('migrate',['-vvv' => true]);
    \Artisan::call('passport:install',['-vvv' => true]);
    \Artisan::call('db:seed',['-vvv' => true]);
}

这会导致错误:

PHP Fatal error: Declaration of Tests\Feature\AuthTest::setUp() must be compatible with Illuminate\Foundation\Testing\TestCase::setUp()

编辑:我刚刚添加

    public function setUp() :void {
        parent::setUp();
        \Artisan::call('migrate',['-vvv' => true]);
        \Artisan::call('passport:install',['-vvv' => true]);
        \Artisan::call('db:seed',['-vvv' => true]);
    }

但问题仍然存在

再次编辑:

如果我直接测试oauth路由,它passes.

    public function testOauthLogin() {
        $oauth_client_id = 2;
        $oauth_client = OAuthClient::findOrFail($oauth_client_id);

        $user = factory('App\User')->create();

        $body = [
            'username' => $user->email,
            'password' => 'password',
            'client_id' => $oauth_client_id,
            'client_secret' => $oauth_client->secret,
            'grant_type' => 'password',
            'scope' => '*'
        ];
        $this->json('POST','/oauth/token',$body,['Accept' => 'application/json'])
            ->assertStatus(200)
            ->assertJsonStructure(['token_type','expires_in','access_token','refresh_token']);
    }

但是我使用 guzzle 的自定义端点失败了。我不知道为什么

再次编辑:

我认为问题出在 Guzzle 上,但我不确定。我找到了我想要做的事情的另一个实现,如下:

 public function login(Request $request) {
        $request->request->add([
            'username' => $request->username,
            'password' => $request->password,
            'grant_type' => 'password',
            'client_id' => $this->client->id,
            'client_secret' => $this->client->secret,
            'scope' => '*'
        ]);

        $response = Route::dispatch(Request::create(
            'oauth/token',
            'POST'
        ));


    }

以上有效。


None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Laravel Passport - 功能测试返回未经授权的 401 的相关文章

  • 为什么 PHPUnit 将一些右大括号显示为未被覆盖?

    我正在使用 PHPUnit 3 6 7 PHP CodeCoverage 1 1 1 和 Xdebug 2 1 2 当我让 PHPUnit 将代码覆盖率统计信息写入 clover 样式的 XML 文件时 它偶尔会显示一个右花括号 表示测试未
  • 如何在 Laravel 中 session_write_close() ?

    Running session write close before sleep 在 Laravel 中似乎不起作用 因为会话仍然被其他请求阻止 直到当前连接完成 我试图sleep 在 Laravel 中 不会阻止其他请求 发现 sessi
  • 在 Laravel 中按数据透视表 create_at 排序

    在我的数据库中 我有以下表格 courses id 名称 创建时间 更新时间 students id 名称 创建时间 更新时间 课程 学生 id course id student id created at updated at 我正在尝
  • Laravel Passport,通过密码客户端进行多个连接

    我无法理解如何使用 Laravel Passport 通过密码客户端为同一用户实现多个连接 我有一个移动应用程序 需要与基于 Laravel 的 API 进行通信 我的用户在首次启动应用程序时必须输入他们的login and passwor
  • 运行一个特定的 Laravel 迁移(单个文件)

    我的项目中有 5 次迁移 我只想运行这些迁移之一 是否可以将单个文件的名称传递给php artisan migrate命令 您可以将迁移放入更多文件夹中并运行如下命令 php artisan migrate path app databas
  • PHPunit - 错误

    当 PHPunit 框架不希望发生的错误发生时 测试会停止 PHP 会抛出错误 但 PHPunit 不会记录这是一个错误 我如何确保 PHPunit 将其记录为错误 免责声明 我是 PHPUnit 的新手 我也试图弄清楚 发生错误时会发生什
  • Laravel - 停止并发访问记录

    在 Laravel 中 有什么方法可以停止同时与同一条记录交互 例如 如果用户 A 正在编辑一条记录 那么我同时需要阻止用户 B 编辑同一条记录 注意 我在 Laravel 5 2 中使用 SESSION DRIVER file 目前大约有
  • 来自本地 XML 的模拟 SoapClient 响应

    我想用文件中的 XML 来模拟 SoapClient 的响应 我如何创建一个 stdClass 对象 就像 SoapClient 从文件返回一样 客户端已经包装了 SoapClient 因此可以轻松模拟响应 我的模拟是这样的 soapCli
  • 在 Laravel 中动态设置数据库连接和语言

    我有 3 个域指向同一个Laravel应用 我想要的是每个人都连接到自己的数据库并根据 TLD 加载自己的语言文件 我可以在哪个文件中设置这些设置 我可以直接在配置文件中执行此操作 或者可以在加载配置之前执行某些事件 我拥有的是一个简短的函
  • 模拟/存根在 PHPUnit 中实现 arrayaccess 的类的对象

    这是我正在为其编写测试套件的类的构造函数 它扩展了 mysqli function construct Config c store config file this gt config c do mysqli constructor pa
  • 在 null laravel 上调用成员函数 save()

    大家好 我正在使用 laravel 5 多态关系将数据保存在数据库中 但我遇到了一些问题 当我尝试将数据保存在数据库中时 它会抛出此错误 对 null 调用成员函数 save 我不知道为什么我会遇到这个错误 我正在关注多态关系的本教程在 L
  • 使用 PHPUnit 测试抽象类的方法

    我有一个抽象类 其中包含我希望测试的通用方法 因此我不必在扩展该类的每个类中继续测试它们 abstract class Class1 implements iClass1 const VALUE A private Return publi
  • 修复 laravel 5 会话在刷新或进入另一个页面后过期的问题?

    我正在使用 laravel 默认身份验证 当我登录我的网站时 一切都很好 当我尝试刷新或转到另一个页面 仍然使用身份验证中间件 时 我的会话已过期 我直接注销 必须再次登录 如何解决此问题 以便在刷新页面或浏览另一个页面时保持登录状态 值得
  • 此集合实例上不存在属性 [子类别]

    第一次与eloquent关系 我正在尝试访问subcategory method但我收到这个错误 此集合实例上不存在属性 子类别 Laravel 新手 因此任何帮助将不胜感激 blade table class table thead tr
  • 如何将条件聚合 mysql 转换为 laravel 查询?

    我的sql查询是这样的 SELECT a number a description MAX CASE WHEN b attribute code brand then b attribute value END as brand MAX C
  • Laravel/Homestead - OSX - Vagrant 连接超时

    Problem 我正在尝试让 Laravel Homestead 在我的 Mac Book Air 上运行 我已按照以下指示进行操作http laravel com docs 4 2 homestead http laravel com d
  • 是否可以使用 GitHub Action 和 GitHub FTP Deploy 将 Laravel Web 应用程序部署到共享托管?

    是否可以deploy the Laravel网络应用程序到共享主机使用 GitHub Action 和 GitHub FTP 部署 如果可能的话我应该如何更改 github workflows master yml on push bran
  • 使用 Laravel 和 Eloquent 从表中选择全部

    我正在使用 Laravel 4 设置我的第一个模型 以从名为的表中提取所有行posts 在标准 MySQL 中我会使用 SELECT FROM posts 如何在 Laravel 4 模型中实现这一目标 我的完整模型源代码如下
  • Laravel 读写连接不同步

    我在 Laravel 5 2 应用程序中使用读写 MySQL 连接设置 mysql gt write gt host gt env DB HOST WRITE localhost read gt host gt env DB HOST RE
  • 优雅地退出 Laravel 作用域

    我有一个范围 它根据用户角色以限制方式起作用 您可以将一组规则转发到限制数据库最终输出的范围 一个非常简化的角色限制示例 first name foo 只会返回其记录first name开始于foo 这实际上意味着我已禁止具有该角色的用户查

随机推荐