【问题标题】:laravel phpunit test with api token authenticationlaravel phpunit 测试与 api 令牌认证
【发布时间】:2018-03-27 22:53:19
【问题描述】:

如何在 phpunit 中添加授权标头?我正在测试一个需要 api_token 的 json api。 laravel 文档提供了一个 actuatorAs 方法。但这在我的情况下不起作用,因为 api 令牌与 users 表没有直接关系。

编辑:

public function test_returns_response_with_valid_request()
    {
        $response = $this->json('post', '/api/lookup', [
            'email' => 'user@gmail.com'
        ]);
        $response->assertStatus(200);
        $response->assertJsonStructure([
            'info' => [
                'name'
            ]
        ]);
    }

【问题讨论】:

    标签: laravel phpunit


    【解决方案1】:

    根据documentation.

    您还可以通过将保护名称作为第二个参数传递给actingAs 方法来指定应该使用哪个保护来验证给定用户:

    $this->actingAs($user, 'api');
    

    【讨论】:

      【解决方案2】:

      您可以使用 withHeader 方法并传入您的令牌,这适用于我的本地(Laravel 6)

      public function test_returns_response_with_valid_request()
      {
          // define your $token here
          $response = $this->withHeader('Authorization', 'Bearer ' . $token)
              ->json('post', '/api/lookup', [
                  'email' => 'user@gmail.com'
              ]);
      
          $response->assertStatus(200);
          $response->assertJsonStructure([
              'info' => [
                  'name'
              ]
          ]);
      }
      

      或者你可以使用actingAs 来查看docs here with api guard

      public function test_returns_response_with_valid_request()
      {
          $user = factory(User::class)->create();
          $response = $this->actingAs($user, 'api')
              ->json('post', '/api/lookup', [
                  'email' => 'user@gmail.com'
              ]);
      
          $response->assertStatus(200);
          $response->assertJsonStructure([
              'info' => [
                  'name'
              ]
          ]);
      }
      

      【讨论】:

        【解决方案3】:

        根据documentation

        public function test_returns_response_with_valid_request()
        {
             $user = factory(User::class)->create();
        
             $response = $this->actingAs($user)
                 ->post('/api/lookup',[
                     'email' => 'user@gmail.com'
                 ]);
        
             $response->assertStatus(200);
             $response->assertJsonStructure([
                     'info' => [
                         'name'
                     ]
                 ]);
        }
        

        【讨论】:

          【解决方案4】:

          根据本文档 https://laravel.com/docs/5.8/api-authentication#passing-tokens-in-requests & https://laravel.com/docs/8.x/http-tests

          有多种方法可以将 API 令牌传递给您的应用程序。 您可以根据应用程序的需要选择这些方法中的任何一种。

          • (查询字符串) 您可以将令牌指定为 api_token 查询字符串值
          $response = $this->json('POST', '/api/sth?api_token='.$token, $test_data)->assertSussessful();
          
          • (请求有效负载)您可以将令牌作为 api_token 包含在请求的表单参数中
               $response = $this->json('GET', '/api/sth', [
                      'headers' => [
                          'Accept' => 'application/json',
                      ],
                      'form_params' => [
                          'api_token' => $token,
                      ],
                  ]);
          
          • (Bearer token) 请求的 Authorization 标头中的 Bearer token:
              $response = $this->json('GET', '/api/sth', [
                          'headers' => [
                              'Authorization' => 'Bearer '. $token,
                              'Accept' => 'application/json'
                          ]
                      ]);
          
          • (Bearer token) 你可以在请求的 Authorization 标头中使用 withHeaders 方法和 Bearer 令牌:
              $response = $this->withHeaders([
                      'Authorization' => 'Bearer '. $token,
                      'Accept' => 'application/json'
                  ])->post('/api/sth', $test_data);
          

          【讨论】:

          • 请解释您的答案,以便下一位用户知道为什么此解决方案对您有效。另外,总结一下您的答案,以防链接将来停止工作。
          • 我想在request中传递一个token,消费者拿到token后可以和api通信。在我的测试代码中,当我使用身份验证令牌调用 get/post/... api 时,出现了问题。如果有人遇到这种无法传递token来请求的问题,请阅读并按照上面的文档进行操作;
          猜你喜欢
          • 2020-08-18
          • 1970-01-01
          • 1970-01-01
          • 2017-04-20
          • 1970-01-01
          • 1970-01-01
          • 2013-02-25
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多