2017-11-20 25 views
9

Tôi đang sử dụng Laravel 5.4 với API Dingo và tôi đang cố gắng để có được OAuth 2.0 (Hộ chiếu) của Laravel để làm việc với các yêu cầu Dingo nội bộ. Trước đây, tôi đã sử dụng JWT, nhưng bây giờ tôi muốn sử dụng OAuth. Đây là mã điều phối trước đó của tôi đi qua mã thông báo bắt buộc để thực hiện xác thực trên yêu cầu nội bộ.Laravel 5.4 OAuth với yêu cầu nội bộ Dingo

public function getDispatcher() 
{ 
    $token = JWTAuth::fromUser(Auth::user()); 
    return $this->api->header('Authorization','Bearer'.$token)->be(Auth::user()); 
} 

Bây giờ tôi đang sử dụng OAuth để xác thực, mã JavaScript của tôi quản lý để có được chứng thực đơn giản bằng cách passing a cookie using this method trong JavaScript, trong đó hoạt động hoàn hảo.

Bây giờ tôi cần phải sửa đổi phương thức getDispatcher() để nhận mã thông báo OAuth về "yêu cầu nội bộ" trong Dingo. Có ai có bất kỳ lời khuyên về cách làm điều này? Về lý thuyết, tôi có thể tạo mã thông báo truy cập cá nhân cho mọi người dùng nhưng điều này có vẻ như quá mức cần thiết cho một yêu cầu nội bộ. Bất kỳ lời khuyên hay cách tiếp cận nào được đánh giá cao. Làm thế nào tôi có thể nhận được mã thông báo OAuth mà không phải trải qua luồng OAuth hoàn chỉnh, hoặc cách khác, làm cách nào tôi có thể tắt xác thực chỉ cho các yêu cầu nội bộ.

Cập nhật dựa trên câu trả lời dưới đây:

'api.auth' ngày của riêng mình trên tuyến (chỉ Dingo) và các công trình theo yêu cầu nội bộ. auth: api (Passport) + api.auth và tôi nhận được phương thức không được phép đối với các yêu cầu nội bộ, điều này trở lại như JSON. {"message": "405 Method Not Allowed"} ngay bây giờ khi cố gọi một yêu cầu POST nội bộ. (Có vẻ như chuyển hướng 301 đến trang đăng nhập xảy ra khi cố gắng đăng lên các tuyến đường này, và do đó khiến đường dẫn API biến thành GET bằng cách nào đó, do đó ném lỗi 405).

Yêu cầu API qua công việc Postman ở khả năng nghịch đảo. Không thể tìm thấy người dùng khi cả hai hoạt động (['middleware' => ['auth: api', 'api.auth']) khi (auth: api just Passport) hoạt động nó hoạt động tốt.

+0

Xem điều này có giúp ích cho https://esbenp.github.io/2017/03/19/modern-rest-api-laravel-part-4/ không? –

Trả lời

5

Nếu tôi đọc câu hỏi chính xác, có vẻ như chúng tôi đang cố gắng sử dụng hai nhà cung cấp xác thực — Số Dingo và Hộ chiếu — cùng một lúc. Sửa tôi nếu tôi hiểu lầm, nhưng có vẻ như chúng tôi thực sự không cần sử dụng cả trong dự án này. Đối với hầu hết các ứng dụng, chúng tôi có thể thực hiện xác thực bằng cách sử dụng Hộ chiếu và chỉ cần chuyển kết quả đến Dingo.

Chúng tôi đạt được điều này bằng cách tạo ra một custom authentication provider rằng cầu Dingo với việc chứng thực được thực hiện bởi hộ chiếu:

use Dingo\Api\Contract\Auth\Provider; 
use Illuminate\Auth\AuthManager; 
... 
class PassportDingoAuthProvider implements Provider 
{ 
    protected $guard; 

    public function __construct(AuthManager $auth) 
    { 
     $this->guard = $auth->guard('api'); 
    } 

    public function authenticate(Request $request, Route $route) 
    { 
     if ($this->guard->check()) { 
      return $this->guard->user(); 
     } 

     throw new UnauthorizedHttpException('Not authenticated via Passport.'); 
    } 
} 

Như chúng ta có thể thấy, các nhà cung cấp auth Dingo hiển thị ở trên chỉ móc vào hệ thống auth Laravel để chuyển tiếp các User khi được xác thực. Người bảo vệ 'api' quy định tại các nhà xây dựng phải phù hợp với bảo vệ configured for Passport (chúng ta thường thêm một mục 'api' đến các mảng 'guards' trong config/auth.php):

'guards' => [ 
    ... 
    'api' => [ 
     'driver' => 'passport', 
     'provider' => 'users', 
    ], 
], 

Sau đó, chúng tôi cần phải đăng ký nhà cung cấp tuỳ chỉnh với Dingo trong cấu hình/api.php:

'auth' => 
    'passport' => App\Providers\PassportDingoAuthProvider::class 
] 

Bây giờ chúng ta có thể khai báo các tuyến bảo vệ sử dụng cả các middleware Passport auth (auth:api) và middleware Dingo auth (api.auth):

$api->get('endpoint', function() { ... })->middleware('auth:api', 'api.auth'); 

Chúng ta có thể tạo ra một middleware group trong ứng dụng /Http/Kernel.php kết hợp những thứ này nếu muốn:

protected $middlewareGroups = [ 
    ... 
    'auth:api-combined' => [ 
     'auth:api', // Passport 
     'api.auth' // Dingo 
    ] 
]; 

Vào thời điểm ứng dụng cần gọi API nội bộ, ứng dụng khách phải được xác thực vì các ứng dụng Laravel điển hình xử lý xác thực trong ngăn xếp trung gian. Như bạn đã biết, chúng tôi chỉ đơn giản là có thể vượt qua trên thực User đến một endpoint Dingo nếu cần thiết:

return $this->api->be(auth()->user())->get('endpoint'); 

... nhưng điều này là không cần thiết với nhà cung cấp auth trình bày ở trên. Dingo sẽ giải quyết người dùng được xác thực từ bảo vệ auth của Hộ chiếu.

Đây là a sample project kết hợp các khái niệm này.

Bây giờ tôi đang sử dụng OAuth để Xác thực, mã Javascript của tôi quản lý để có được chứng thực chỉ đơn giản bằng cách đi qua một cookie sử dụng phương pháp này trong javascript ... Tôi cần phải sửa đổi phương pháp getDispatcher để có mã thông báo OAuth trên 'Yêu cầu nội bộ' trong Dingo.

Khi chúng tôi sử dụng CreateFreshApiToken middleware, Laravel tạo JWT được mã hóa khi đang di chuyển. Chúng ta có thể tạo ra một trong những thẻ bằng tay:

use Firebase\JWT\JWT; // installed with Passport 
... 
$token = JWT::encode([ 
    'sub' => auth()->id(), 
    'csrf' => session()->token(), 
    'expiry' => Carbon::now()->addMinutes(config('session.lifetime')), 
], app('encrypter')->getKey()); 

Chúng ta có thể thấy điều này không phải là một tiêu chuẩn truy cập OAuth thẻ — Passport chỉ sử dụng các cho các yêu cầu web. Ngoài ra, chúng tôi có thể tìm nạp giá trị này từ cookie được trả lại từ JavaScript:

$token = request()->cookie(Passport::cookie()); 

Tuy nhiên, chúng tôi không cần mã thông báo này nếu chúng tôi tích hợp Dingo với Hộ chiếu như mô tả ở trên.

+0

Điều này có vẻ tuyệt vời .. sẽ cho bạn biết cách tôi tiếp tục. – Paul

+0

Đã thử giải pháp được mô tả .. không may là gần nhưng không có xì gà. Một dự án mẫu git sẽ là tuyệt vời để xem cấu trúc nhưng linh cảm của tôi là tôi đang thiếu một cái gì đó trong atm middleware. – Paul

+0

@Paul khi tôi có thời gian hôm nay hoặc ngày mai, tôi sẽ cố gắng để ném một dự án mẫu với nhau. –

Các vấn đề liên quan