Laravel Passport có sử dụng JWT không?

Gần đây, tôi cần nhấn vào chương trình Hộ chiếu của Laravel để kiểm soát cách phát hành Mã thông báo Web JSON [JWT]. Cụ thể, tôi cần thêm nhiều xác nhận quyền sở hữu vào nó [để chứa nhiều thông tin người dùng hơn] và để kiểm soát cách tạo phạm vi. Ý tưởng là thêm thông tin như email của người dùng được xác thực, số VAT, loại tài khoản, đồng thời, buộc thêm các phạm vi được liên kết với vai trò của người dùng

Tuy nhiên, việc thay đổi hành vi của Laravel Passport để biến điều đó thành hiện thực là điều không quá rõ ràng và trong một thế giới mà các kiến ​​trúc hướng dịch vụ đang trở nên phổ biến hơn bao giờ hết, JWT là cách thực tế mang thông tin của người dùng thông qua nhiều dịch vụ và vì tôi không thể'

Sự cần thiết của kiểm soát

Tôi đang phát triển ITsoup, một hệ thống phần mềm trợ giúp/hỗ trợ CNTT, được thiết kế để đơn giản hóa và hợp lý hóa tất cả các quy trình liên quan, dựa trên kiến ​​trúc hướng dịch vụ. Điều này có nghĩa là tôi sẽ có nhiều dịch vụ xử lý các lĩnh vực công việc cụ thể. Để xác thực các yêu cầu một cách chính xác, tôi cần một số cách lưu giữ thông tin của người dùng theo cách có thể được chuyển từ dịch vụ này sang dịch vụ khác. Cách thực tế để làm điều này là với JWT, vì vậy tôi bắt đầu tìm hiểu cách tôi có thể thực hiện những thay đổi đó đối với logic tạo JWT

Vấn đề với việc triển khai Laravel Passport hiện tại là nó chỉ bao gồm một yêu cầu nhận dạng cho người dùng. đó là ID nội bộ. Điều đó không được sử dụng nhiều đối với tôi trong dự án này. Chỉ sử dụng ID sẽ yêu cầu bất kỳ dịch vụ nào khác yêu cầu bất kỳ thông tin người dùng bổ sung nào đối với API của dịch vụ Miền tổ chức nếu họ cần, chẳng hạn như email.  

Làm theo cách đó sẽ tạo ra sự phụ thuộc không mong muốn, không cần thiết, giữa dịch vụ này và tất cả các dịch vụ khác hoạt động với dữ liệu của người dùng và sẽ tăng tải cho dịch vụ Miền tổ chức này khi các dịch vụ mới và/hoặc lưu lượng truy cập tăng lên

Hiểu về nhà cung cấp dịch vụ của Laravel Passport

Trước bất cứ điều gì, tôi muốn luôn hiểu những gì đang diễn ra bên dưới mui xe. Bằng cách hiểu rõ hơn về hệ thống mà tôi cần thay đổi, tôi có thể đưa ra quyết định sáng suốt về cách tiếp cận giải pháp

Theo như tôi hiểu, mọi chuyện bắt đầu từ ngày Laravel\Passport\PassportServiceProvider. Tại đây, chúng ta có thể tìm thấy phương thức registerAuthorizationServer[] chịu trách nhiệm xác định cách Laravel khởi tạo lớp 

public function getScopes[]: array
{
    return $this->user
        ->roles[]
        ->pluck['scopes']
        ->flatten[]
        ->unique[]
        ->map[static function [$scope] {
            return new Scope[$scope];
        }]
        ->toArray[];
}
0 và đăng ký cấp phép oAuth2 được hỗ trợ. Nhưng trước khi điều đó xảy ra, sẽ có lệnh gọi đến một phương thức 
public function getScopes[]: array
{
    return $this->user
        ->roles[]
        ->pluck['scopes']
        ->flatten[]
        ->unique[]
        ->map[static function [$scope] {
            return new Scope[$scope];
        }]
        ->toArray[];
}
1 . Phương pháp này chịu trách nhiệm xác định cách
public function getScopes[]: array
{
    return $this->user
        ->roles[]
        ->pluck['scopes']
        ->flatten[]
        ->unique[]
        ->map[static function [$scope] {
            return new Scope[$scope];
        }]
        ->toArray[];
}
0 được khởi tạo và đưa vào các phụ thuộc thích hợp từ Vùng chứa của Laravel.  

Lớp chính của toàn bộ điều này là

public function getScopes[]: array
{
    return $this->user
        ->roles[]
        ->pluck['scopes']
        ->flatten[]
        ->unique[]
        ->map[static function [$scope] {
            return new Scope[$scope];
        }]
        ->toArray[];
}
3, đây là một trong những phần phụ thuộc được đưa vào. Vì nó được đưa vào thông qua Vùng chứa, nên chúng ta có thể tận dụng lợi thế của nó và đưa vào phiên bản riêng của lớp đó, thay vào đó. Lớp này có một phương thức rất đặc biệt, 
public function getScopes[]: array
{
    return $this->user
        ->roles[]
        ->pluck['scopes']
        ->flatten[]
        ->unique[]
        ->map[static function [$scope] {
            return new Scope[$scope];
        }]
        ->toArray[];
}
4, được gọi khi cấp quyền đã kích hoạt cần tạo mã thông báo mới.  

Kết nối với luồng logic, tại đây và hướng luồng đó thông qua việc triển khai lớp

public function getScopes[]: array
{
    return $this->user
        ->roles[]
        ->pluck['scopes']
        ->flatten[]
        ->unique[]
        ->map[static function [$scope] {
            return new Scope[$scope];
        }]
        ->toArray[];
}
5 của chính chúng tôi cho phép chúng tôi kiểm soát cách JWT được tạo, thông tin mà nó lưu giữ và nhiều khía cạnh khác của nó

Xây dựng những cây cầu

Vì vậy, bây giờ tôi đã xác định chính xác lớp mà tôi cần ghi đè, tôi đã xác định rằng một lệnh gọi đến lớp

public function getScopes[]: array
{
    return $this->user
        ->roles[]
        ->pluck['scopes']
        ->flatten[]
        ->unique[]
        ->map[static function [$scope] {
            return new Scope[$scope];
        }]
        ->toArray[];
}
3, trong Vùng chứa của Laravel, sẽ trả về một thể hiện của lớp
public function getScopes[]: array
{
    return $this->user
        ->roles[]
        ->pluck['scopes']
        ->flatten[]
        ->unique[]
        ->map[static function [$scope] {
            return new Scope[$scope];
        }]
        ->toArray[];
}
5 của riêng tôi, lớp này sẽ mở rộng lớp trước nhưng với . Tính đến thời điểm này, tôi đã định tuyến thành công logic cho lớp của mình

Bây giờ, phương thức này cần trả về một triển khai của 

public function getScopes[]: array
{
    return $this->user
        ->roles[]
        ->pluck['scopes']
        ->flatten[]
        ->unique[]
        ->map[static function [$scope] {
            return new Scope[$scope];
        }]
        ->toArray[];
}
3. Giao diện này xác định cách tính toán mã thông báo truy cập [ví dụ: JWT]. Triển khai Hộ chiếu của Laravel chính xác là triển khai mà Liên đoàn PHP triển khai. Trên thực tế, việc không muốn ghi đè hành vi mặc định đó là một trong những lý do chính khiến Passport không cung cấp bất kỳ giải pháp đơn giản nào cho vấn đề này. Để có thể thêm nhiều xác nhận quyền sở hữu hơn và kiểm soát cách JWT được tạo – và thậm chí cả các phạm vi được liên kết – chúng tôi cần ghi đè triển khai chính xác này

Tại thời điểm này, tôi chỉ cần trả lại bản triển khai của 

public function getScopes[]: array
{
    return $this->user
        ->roles[]
        ->pluck['scopes']
        ->flatten[]
        ->unique[]
        ->map[static function [$scope] {
            return new Scope[$scope];
        }]
        ->toArray[];
}
3 phù hợp với nhu cầu của mình. Cụ thể, có hai phương pháp mà tôi cần ghi đè.
public function getScopes[]: array
{
    return $this->user
        ->roles[]
        ->pluck['scopes']
        ->flatten[]
        ->unique[]
        ->map[static function [$scope] {
            return new Scope[$scope];
        }]
        ->toArray[];
}
5 và 
public function getScopes[]: array
{
    return $this->user
        ->roles[]
        ->pluck['scopes']
        ->flatten[]
        ->unique[]
        ->map[static function [$scope] {
            return new Scope[$scope];
        }]
        ->toArray[];
}
6. Cái đầu tiên là cái thực sự tạo ra JWT và cái thứ hai là cái biên dịch các phạm vi để liên kết với JWT đó.  

Vì vậy, về cơ bản, phương thức 

public function getScopes[]: array
{
    return $this->user
        ->roles[]
        ->pluck['scopes']
        ->flatten[]
        ->unique[]
        ->map[static function [$scope] {
            return new Scope[$scope];
        }]
        ->toArray[];
}
5 mở rộng của tôi trông như thế này

private function convertToJWT[CryptKey $privateKey]: Token
{
    return [new Builder[]]
        ->permittedFor[$this->getClient[]->getIdentifier[]]
        ->identifiedBy[$this->getIdentifier[]]
        ->issuedAt[\time[]]
        ->canOnlyBeUsedAfter[\time[]]
        ->expiresAt[$this->getExpiryDateTime[]->getTimestamp[]]
        ->relatedTo[[string] $this->getUserIdentifier[]]
        ->withClaim['scopes', $this->getScopes[]]
        ->withClaim['customer_id', $this->user->customer_id]
        ->withClaim['vat_number', $this->user->vat_number]
        ->withClaim['name', $this->user->name]
        ->withClaim['email', $this->user->email]
        ->withClaim['account_type', $this->user->account_type]
        ->getToken[new Sha256[], new Key[$privateKey->getKeyPath[], $privateKey->getPassPhrase[]]];
}

Và phương thức 

public function getScopes[]: array
{
    return $this->user
        ->roles[]
        ->pluck['scopes']
        ->flatten[]
        ->unique[]
        ->map[static function [$scope] {
            return new Scope[$scope];
        }]
        ->toArray[];
}
6 của tôi trông như thế này

public function getScopes[]: array
{
    return $this->user
        ->roles[]
        ->pluck['scopes']
        ->flatten[]
        ->unique[]
        ->map[static function [$scope] {
            return new Scope[$scope];
        }]
        ->toArray[];
}

Bây giờ, JWT được tạo với những gì tôi đã xác định là thông tin người dùng có liên quan và có thể được chuyển đi khắp nơi và hy vọng sẽ giảm nhu cầu truy vấn dịch vụ Miền tổ chức nếu bản thân JWT đã chứa dữ liệu cần thiết

Hộ chiếu có sử dụng JWT không?

Chiến lược Hộ chiếu để xác thực bằng Mã thông báo web JSON . Mô-đun này cho phép bạn xác thực các điểm cuối bằng mã thông báo web JSON. Nó được dự định sử dụng để bảo mật các điểm cuối RESTful mà không cần phiên.

Sự khác biệt giữa mã thông báo Hộ chiếu và JWT trong Laravel là gì?

JWT - là một Mã thông báo web JSON đơn giản, nó chỉ cung cấp mã thông báo cho người dùng có thể được sử dụng để đăng nhập, mã thông báo này sẽ không bao giờ hết hạn [ Mã thông báo hộ chiếu sẽ hết hạn và]

Xác thực Laravel Passport hoạt động như thế nào?

Laravel Passport là một cách dễ dàng để thiết lập hệ thống xác thực cho API của bạn. Là một gói Laravel, nó sử dụng máy chủ OAuth2 để thực hiện xác thực, tạo mã thông báo cho ứng dụng người dùng yêu cầu giao tiếp với API mà nó bảo vệ và chỉ cấp cho họ quyền truy cập nếu mã thông báo của họ được xác thực

Khu bảo tồn Laravel có sử dụng JWT không?

Có vì cả Laravel passport và Laravel sanctum đều sử dụng JWT để ủy quyền và không vì bản thân framework của Laravel không liên quan gì đến JWT.

Chủ Đề