Laravel Passport Route重定向到登录页面

时间:2017-02-08 14:55:53

标签: php laravel-5.3 laravel-passport

我正在使用Laravel 5.3&护照。

当使用Postman测试我在api.php文件中设置的任何路径时,它总是返回登录页面。以下是我的测试路线示例:

Route::get('/getKey', function() {
    return 'hello';
})->middleware('client_credentials');

Postman params:

Accept application/json
Authorization Bearer <then my key>

我在搜索答案时找到了另一个解决方案,将中间件设置为'auth:api'。

protected function mapApiRoutes()
    {
        Route::prefix('api')
             ->middleware('auth:api')
             ->namespace($this->namespace)
             ->group(base_path('routes/api.php'));
    }

我已经尝试过几乎所有适用于其他人但仍然没有运气的解决方案。任何建议都会非常感激。

UPDATE 所以我终于有了一些工作要做。我创建了一个消费者应用程序并创建了一些测试功能。通过验证令牌,我能够使用api。但是,点击此路线不再返回我的登录页面,而是现在不返回任何内容。因此无论出于何种原因,它仍无法正常工作。

Route::get('/user', function (Request $request) {

    return $request->user();
})->middleware('client_credentials');

8 个答案:

答案 0 :(得分:26)

定义的登录路由的重定向发生在app \ Exceptions \ Handler.php类中。

protected function unauthenticated($request, AuthenticationException $exception)
{
    if ($request->expectsJson()) {
        return response()->json(['error' => 'Unauthenticated.'], 401);
    }

    return redirect()->guest(route('login'));
}

该函数试图检测它是否是从API调用的(在哪种情况下它会返回带有JSON消息的401 Unauthorized reponse),如果不是,它将根据注释重定向到登录页面

  

将身份验证例外转换为未经身份验证的响应

要解决邮递员的问题,请在请求中单击“标题”选项卡并添加:

key:   Accept
value: application/json

我对此非常陌生,所以我不确定这是否是我们应该在使用Postman测试所有API调用时添加的标头,或者仅仅是如何设置这种laravel方法。

无论如何,这可以解决您重定向到登录页面的问题,但它标志着您的基础身份验证无法正常工作

答案 1 :(得分:4)

您需要在每个请求的标头中添加Authorization: Bearer YOUR_TOKEN。此外,最新版Laravel 5.5或更高版本。您还需要添加Accept: application/json来请求标题。

答案 2 :(得分:4)

在邮递员的标题上添加此代码。

key           Value
Accept        application/json

答案 3 :(得分:3)

编码以检查请求是否来自Ajax。在这种情况下,如果身份验证失败,您将收到以下json:

{
"error": "Unauthenticated."
}

否则它将假设您正在使用浏览器,它将重定向到Html登录页面进行身份验证。

您可以将以下标头添加到请求中以模拟Ajax请求:

X-Requested-With = XMLHttpRequest

答案 4 :(得分:0)

如果您使用username代替email作为凭据;在User模型中插入此方法:

function findForPassport($username) {
     return $this->where('username', $username)->first();
}

答案 5 :(得分:0)

这是这行代码中的问题所在

  protected function mapApiRoutes()
{
    Route::prefix('api')
         ->middleware('auth:api')
         ->namespace($this->namespace)
         ->group(base_path('routes/api.php'));
}

眼印

->middleware('auth:api')

'auth:api'中间件具有关键字AUTH ===经过身份验证的用户,因此发生在该中间件下的所有请求,即使是不需要身份验证用户的请求也将在

因此,当邮递员向auth:api下的路由发出请求时,它将首先重定向到登录页面以进行身份​​验证(先登录)

因此,我建议您将auth:api中间件用于根据您的设计和应用程序的安全性需要经过身份验证的用户的路由

如果您的Http / kernel.php文件上有“ auth:api”,则类似

 'api' => [
        'throttle:60,1',
        'bindings',
        'auth:api"

    ],

您已经设计了SPA,并且所有路由都在route / api.php上,即使到达登录/注册页面也需要经过身份验证的用户,这很奇怪。

因此,在适当的时候添加'auth:api'中间件。

答案 6 :(得分:0)

从laravel 5.8到当前的6.0版本之间,在app / http / Middleware处有一个中间件,它是\ App \ Http \ Middleware \ Authenticate,它具有方法

  

redirectTo

带有代码

@Test(description = "Screenshot in Step")
public void screenshotInStepTest() {
    driver.get("https://www.google.com");
    step1();
    step2();
    step3();
}

@Step("Step 1")
public void step1(){
    System.out.println("step 1");
}
@Step("Step 2 with screenshot")
public void step2(){
    System.out.println("step 2");
    screenshot();
}
@Step("Step 3")
public void step3(){
    System.out.println("step 3");
}

@Attachment(value = "Screenshot", type = "image/png")
public byte[] screenshot() {
    return ((TakesScreenshot) driver).getScreenshotAs(OutputType.BYTES);
}
  

将其重写为

import java.io.ByteArrayInputStream;
//...
@Step("Step 1")
public void step1(){
    //...

    Allure.addAttachment("Any text", new ByteArrayInputStream(((TakesScreenshot) driver).getScreenshotAs(OutputType.BYTES)));
}

此代码的作用是返回一个protected function redirectTo($request) { if (! $request->expectsJson()) { return route('login'); } } 实例并将其设置为 protected function redirectTo($request) { if (! ($request->expectsJson() || collect($request->route()->middleware())->contains('api'))) { return route('login'); } } 。 laravel传递给Illuminate\Routing\Redirector

在render函数中,您可以编写逻辑来捕获\Illuminate\Auth\AuthenticationException $redirectTo parameter异常。

这是我自己的实现

\App\Exceptions@render

答案 7 :(得分:0)

在许多答案中都指出,发生这种情况的原因确实是代码:

import qrcodeParser from "qrcode-parser"

describe('This is sample tests', () => {
  it('should read the QR code successfully', () => {
    browser.call(() =>qrcodeParser(imageUrl).then(res => {
        console.log(res.data)
      })
    )
  })
})

在app \ Http \ Middleware \ Authenticate.php

一个优雅的解决方案是将您的api请求包装在中间件中,并在这些请求的标头中添加“ Accept:application / json”。

我从这篇文章中得到了这个主意:https://medium.com/@martin.riedweg/laravel-5-7-api-authentification-with-laravel-passport-92b909e12528