Cách kiểm tra mã thông báo JWT đã hết hạn trong PHP?

Đảm bảo rằng tường lửa

return [
    //...
    Lexik\Bundle\JWTAuthenticationBundle\LexikJWTAuthenticationBundle::class => ['all' => true],
];
3 được đặt trước
return [
    //...
    Lexik\Bundle\JWTAuthenticationBundle\LexikJWTAuthenticationBundle::class => ['all' => true],
];
4 và nếu có
return [
    //...
    Lexik\Bundle\JWTAuthenticationBundle\LexikJWTAuthenticationBundle::class => ['all' => true],
];
5, hãy đặt nó sau
return [
    //...
    Lexik\Bundle\JWTAuthenticationBundle\LexikJWTAuthenticationBundle::class => ['all' => true],
];
4, nếu không bạn sẽ gặp phải tình trạng không tìm thấy tuyến đường
return [
    //...
    Lexik\Bundle\JWTAuthenticationBundle\LexikJWTAuthenticationBundle::class => ['all' => true],
];
7

$ php composer.phar require "lexik/jwt-authentication-bundle"
0
$ php composer.phar require "lexik/jwt-authentication-bundle"
1

$ php composer.phar require "lexik/jwt-authentication-bundle"
2_______5_______3

1
2
3
$ php composer.phar require "lexik/jwt-authentication-bundle"
5

To enable the API Platform compatibility, add the

return [
    //...
    Lexik\Bundle\JWTAuthenticationBundle\LexikJWTAuthenticationBundle::class => ['all' => true],
];
8 configuration option as following

$ php composer.phar require "lexik/jwt-authentication-bundle"
6
$ php composer.phar require "lexik/jwt-authentication-bundle"
7

The first step is to authenticate the user using its credentials. You can test getting the token with a simple curl command like this [adapt host and port]

Linux or macOS

1
$ php composer.phar require "lexik/jwt-authentication-bundle"
9

Windows

1
1
2
3
4
1

If it works, you will receive something like this

1
2
3
1
2
3
4
3

Store it [client side], the JWT is reusable until its TTL has expired [3600 seconds by default]

Simply pass the JWT on each request to the protected firewall, either as an authorization header or as a query parameter

By default only the authorization header mode is enabled .

return [
    //...
    Lexik\Bundle\JWTAuthenticationBundle\LexikJWTAuthenticationBundle::class => ['all' => true],
];
9

See the configuration reference document to enable query string parameter mode or change the header value prefix

See Functionally testing a JWT protected api document or the sandbox application Symfony4] for a fully working example

Each request after token expiration will result in a 401 response. Redo the authentication process to obtain a new token

Maybe you want to use a refresh token to renew your JWT. In this case you can check JWTRefreshTokenBundle

This is more of a Symfony2 related topic, but see Working with CORS requests document to get a quick explanation on handling CORS requests

For impersonating users using JWT, see https. //symfony. com/doc/current/security/impersonating_user. html

As stated in this link and this one, Apache server will strip any

1
0 not in a valid HTTP BASIC AUTH format

If you intend to use the authorization header mode of this bundle [and you should], please add those rules to your VirtualHost configuration

Authentication is one of the most important parts of any web application. For decades, cookies and server-based authentication was the easiest solution. However, handling authentication in modern Mobile and Single Page Applications can be tricky and demand a better approach. One of the best known solutions to authentication problems for APIs is the JSON Web Token [JWT]

By

Tino Tkalec

Tino is a software engineer with 10+ years of experience in creating native Windows and Web Applications. He’s a LAMP stack expert

SHARE

SHARE

With the rising popularity of single page applications, mobile applications, and RESTful API services, the way web developers write back-end code has changed significantly. With technologies like AngularJS and BackboneJS, we are no longer spending much time building markup, instead we are building APIs that our front-end applications consume. Our back-end is more about business logic and data, while presentation logic is moved exclusively to the front-end or mobile applications. These changes have led to new ways of implementing authentication in modern applications

Authentication is one of the most important parts of any web application. For decades, cookies and server-based authentication were the easiest solution. However, handling authentication in modern Mobile and Single Page Applications can be tricky, and demand a better approach. The best known solutions to authentication problems for APIs are the OAuth 2. 0 and the JSON Web Token [JWT]

Before we get into this JSON Web Token tutorial, what exactly is a JWT?

What is a JSON Web Token?

A JSON Web Token is used to send information that can be verified and trusted by means of a digital signature. It comprises a compact and URL-safe JSON object, which is cryptographically signed to verify its authenticity, and which can also be encrypted if the payload contains sensitive information

Because of its compact structure, JWT is usually used in HTTP

{
  "iss": "toptal.com",
  "exp": 1426420800,
  "//www.toptal.com/jwt_claims/is_admin": true,
  "company": "Toptal",
  "awesome": true
}
3 headers or URL query parameters

Structure of a JSON Web Token

A JWT is represented as a sequence of base64url encoded values that are separated by period characters

Here is a JWT token example

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
eyJpc3MiOiJ0b3B0YWwuY29tIiwiZXhwIjoxNDI2NDIwODAwLCJodHRwOi8vdG9wdGFsLmNvbS9qd3RfY2xhaW1zL2lzX2FkbWluIjp0cnVlLCJjb21wYW55IjoiVG9wdGFsIiwiYXdlc29tZSI6dHJ1ZX0.
yRQYnWzskCZUxPwaQupWkiUzKELZ49eM7oWxAQK_ZXw

tiêu đề

The header contains the metadata for the token and it minimally contains the type of signature and the encryption algorithm. [You can use a JSON formatter tool to prettify the JSON object. ]

Example Header

{
  "alg": "HS256",
  "typ": "JWT"
}

This JWT example header declares that the encoded object is a JSON Web Token, and that it is signed using the HMAC SHA-256 algorithm

Once this is base64 encoded, we have the first part of our JWT

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9

Payload [Claims]

In the context of JWT, a claim can be defined as a statement about an entity [typically, the user], as well as additional metadata about the token itself. The claim contains the information we want to transmit, and that the server can use to properly handle JSON Web Token authentication. There are multiple claims we can provide; these include registered claim names, public claim names and private claim names

Registered JWT Claims

These are the claims that are registered in the . These JWT claims are not intended to be mandatory but rather to provide a starting point for a set of useful, interoperable claims

These include

  • iss. The issuer of the token
  • sub. The subject of the token
  • aud. The audience of the token
  • exp. JWT expiration time defined in Unix time
  • nbf. “Not before” time that identifies the time before which the JWT must not be accepted for processing
  • iat. “Issued at” time, in Unix time, at which the token was issued
  • jti. JWT ID claim provides a unique identifier for the JWT

Public Claims

Public claims need to have collision-resistant names. By making the name a URI or URN, naming collisions are avoided for JWTs where the sender and receiver are not part of a closed network

An example of a public claim name could be.

{
  "iss": "toptal.com",
  "exp": 1426420800,
  "//www.toptal.com/jwt_claims/is_admin": true,
  "company": "Toptal",
  "awesome": true
}
4, and the best practice is to place a file at that location describing the claim so that it can be dereferenced for documentation

Private Claims

Private claim-names may be used in places where JWTs are only exchanged in a closed environment between known systems, such as inside an enterprise. These are claims that we can define ourselves, like user IDs, user roles, or any other information

Using claim-names that might have conflicting semantic meanings outside of a closed or private system are subject to collision, so use them with caution

It is important to note that we want to keep a web token as small as possible, so use only necessary data inside public and private claims

JWT Example Payload

{
  "iss": "toptal.com",
  "exp": 1426420800,
  "//www.toptal.com/jwt_claims/is_admin": true,
  "company": "Toptal",
  "awesome": true
}

This example payload has two registered claims, one public claim and two private claims. Once it is base64 encoded, we have the second part of our JWT

eyJpc3MiOiJ0b3B0YWwuY29tIiwiZXhwIjoxNDI2NDIwODAwLCJodHRwOi8vdG9wdGFsLmNvbS9qd3RfY2xhaW1zL2lzX2FkbWluIjp0cnVlLCJjb21wYW55IjoiVG9wdGFsIiwiYXdlc29tZSI6dHJ1ZX0

Signature

The JWT standard follows the JSON Web Signature [JWS] specification to generate the final signed token. It is generated by combining the encoded JWT Header and the encoded JWT Payload, and signing it using a strong encryption algorithm, such as HMAC SHA-256. The signature’s secret key is held by the server so it will be able to verify existing tokens and sign new ones

$encodedContent = base64UrlEncode[header] + "." + base64UrlEncode[payload];
$signature = hashHmacSHA256[$encodedContent];

Điều này mang lại cho chúng tôi phần cuối cùng của JWT

yRQYnWzskCZUxPwaQupWkiUzKELZ49eM7oWxAQK_ZXw

Bảo mật và mã hóa JWT

Điều quan trọng là sử dụng TLS/SSL kết hợp với JWT để ngăn chặn các cuộc tấn công trung gian. Trong hầu hết các trường hợp, điều này sẽ đủ để mã hóa tải trọng JWT nếu nó chứa thông tin nhạy cảm. Tuy nhiên, nếu chúng tôi muốn thêm một lớp bảo vệ bổ sung, chúng tôi có thể tự mã hóa tải trọng JWT bằng cách sử dụng đặc tả Mã hóa Web JSON [JWE]

Tất nhiên, nếu chúng tôi muốn tránh chi phí bổ sung khi sử dụng JWE, một tùy chọn khác là chỉ cần giữ thông tin nhạy cảm trong cơ sở dữ liệu của chúng tôi và sử dụng mã thông báo của chúng tôi cho các lệnh gọi API bổ sung tới máy chủ bất cứ khi nào chúng tôi cần truy cập dữ liệu nhạy cảm

Tại sao lại cần Web Token?

Trước khi chúng ta có thể thấy tất cả các lợi ích của việc sử dụng xác thực JWT, chúng ta phải xem cách xác thực đã được thực hiện trong quá khứ

Xác thực dựa trên máy chủ

Vì giao thức HTTP là phi trạng thái nên cần có cơ chế lưu trữ thông tin người dùng và cách xác thực người dùng trong mọi yêu cầu tiếp theo sau khi đăng nhập. Hầu hết các trang web sử dụng cookie để lưu trữ ID phiên của người dùng

Làm thế nào nó hoạt động

Trình duyệt gửi yêu cầu POST tới máy chủ có chứa thông tin nhận dạng và mật khẩu của người dùng. Máy chủ phản hồi bằng cookie, được đặt trên trình duyệt của người dùng và bao gồm ID phiên để xác định người dùng

Trong mọi yêu cầu tiếp theo, máy chủ cần tìm phiên đó và giải tuần tự hóa nó, vì dữ liệu người dùng được lưu trữ trên máy chủ

Hạn chế của xác thực dựa trên máy chủ

  • Khó mở rộng quy mô. The server needs to create a session for a user and persist it somewhere on the server. This can be done in memory or in a database. If we have a distributed system, we have to make sure that we use a separate session storage that is not coupled to the application server

  • Cross-origin request sharing [CORS]. When using AJAX calls to fetch a resource from another domain [“cross-origin”] we could run into problems with forbidden requests because, by default, HTTP requests don’t include cookies on cross-origin requests

  • Coupling with the web framework. When using server-based authentication we are tied to our framework’s authentication scheme. It is really hard, or even impossible, to share session data between different web frameworks written in different programming languages

Token-Based Authentication

Token based/JWT authentication is stateless, so there is no need to store user information in the session. This gives us the ability to scale our application without worrying where the user has logged in. We can easily use the same token for fetching a secure resource from a domain other than the one we are logged in to

How JSON Web Tokens Work

A browser or mobile client makes a request to the authentication server containing user login information. The authentication server generates a new JWT access token and returns it to the client. On every request to a restricted resource, the client sends the access token in the query string or

{
  "iss": "toptal.com",
  "exp": 1426420800,
  "//www.toptal.com/jwt_claims/is_admin": true,
  "company": "Toptal",
  "awesome": true
}
3 header. The server then validates the token and, if it’s valid, returns the secure resource to the client

The authentication server can sign the token using any secure signature method. For example, a symmetric key algorithm such as HMAC SHA-256 can be used if there is a secure channel to share the secret key among all parties. Alternatively, an asymmetric, public-key system, such as RSA, can be used as well, eliminating the need for further key-sharing

Advantages of Token-Based Authentication

Stateless, easier to scale. The token contains all the information to identify the user, eliminating the need for the session state. If we use a load balancer, we can pass the user to any server, instead of being bound to the same server we logged in on

Reusability. We can have many separate servers, running on multiple platforms and domains, reusing the same token for authenticating the user. It is easy to build an application that shares permissions with another application

JWT Security. Since we are not using cookies, we don’t have to protect against cross-site request forgery [CSRF] attacks. We should still encrypt our tokens using JWE if we have to put any sensitive information in them, and transmit our tokens over HTTPS to prevent man-in-the-middle attacks

Performance. There is no server side lookup to find and deserialize the session on each request. The only thing we have to do is calculate the HMAC SHA-256 to validate the token and parse its content

A JSON Web Token Example using Laravel 5 and AngularJS

In this JWT tutorial I am going to demonstrate how to implement the basic authentication using JSON Web Tokens in two popular web technologies. Laravel 5 for the backend code and AngularJS for the frontend Single Page Application [SPA] example. [You can find the source code in this GitHub repository so that you can follow along with the tutorial. ]

This JSON web token example will not use any kind of encryption to ensure the confidentiality of the information transmitted in the claims. In practice this is often okay, because TLS/SSL encrypts the request. However, if the token is going to contain sensitive information, such as the user’s social security number, it should also be encrypted using JWE

Laravel Backend Example

We will use Laravel to handle user registration, persisting user data to a database and providing some restricted data that needs authentication for the Angular app to consume. We will create an example API subdomain to simulate Cross-origin resource sharing [CORS] as well

Installation and Project Bootstrapping

In order to use Laravel, we have to install the Composer package manager on our machine. When developing in Laravel I recommend using the Laravel Homestead pre-packaged “box” of Vagrant. It provides us with a complete development environment regardless of our operating system

The easiest way to bootstrap our JWT Laravel application is to use a Composer package Laravel Installer

composer global require "laravel/installer=~1.1"

Now we are all ready to create a new Laravel project by running

{
  "iss": "toptal.com",
  "exp": 1426420800,
  "//www.toptal.com/jwt_claims/is_admin": true,
  "company": "Toptal",
  "awesome": true
}
6

For any questions about this process please refer to the official Laravel documentation

After we have created the basic Laravel 5 application, we need to set up our

{
  "iss": "toptal.com",
  "exp": 1426420800,
  "//www.toptal.com/jwt_claims/is_admin": true,
  "company": "Toptal",
  "awesome": true
}
7, which will configure folder mappings and domains configuration for our local environment

Ví dụ về tệp

{
  "iss": "toptal.com",
  "exp": 1426420800,
  "//www.toptal.com/jwt_claims/is_admin": true,
  "company": "Toptal",
  "awesome": true
}
7

---
ip: "192.168.10.10"
memory: 2048
cpus: 1

authorize: /Users/ttkalec/.ssh/public.psk

keys:
    - /Users/ttkalec/.ssh/private.ppk
folders:
    - map: /coding/jwt
      to: /home/vagrant/coding/jwt
sites:
    - map: jwt.dev
      to: /home/vagrant/coding/jwt/public
    - map: api.jwt.dev
      to: /home/vagrant/coding/jwt/public
variables:
    - key: APP_ENV
      value: local

After we’ve booted up our Vagrant box with the

{
  "iss": "toptal.com",
  "exp": 1426420800,
  "//www.toptal.com/jwt_claims/is_admin": true,
  "company": "Toptal",
  "awesome": true
}
9 command and logged into it using
eyJpc3MiOiJ0b3B0YWwuY29tIiwiZXhwIjoxNDI2NDIwODAwLCJodHRwOi8vdG9wdGFsLmNvbS9qd3RfY2xhaW1zL2lzX2FkbWluIjp0cnVlLCJjb21wYW55IjoiVG9wdGFsIiwiYXdlc29tZSI6dHJ1ZX0
0, we navigate to the previously defined project directory. In the example above this would be
eyJpc3MiOiJ0b3B0YWwuY29tIiwiZXhwIjoxNDI2NDIwODAwLCJodHRwOi8vdG9wdGFsLmNvbS9qd3RfY2xhaW1zL2lzX2FkbWluIjp0cnVlLCJjb21wYW55IjoiVG9wdGFsIiwiYXdlc29tZSI6dHJ1ZX0
1. We can now run
eyJpc3MiOiJ0b3B0YWwuY29tIiwiZXhwIjoxNDI2NDIwODAwLCJodHRwOi8vdG9wdGFsLmNvbS9qd3RfY2xhaW1zL2lzX2FkbWluIjp0cnVlLCJjb21wYW55IjoiVG9wdGFsIiwiYXdlc29tZSI6dHJ1ZX0
2 command in order to create the necessary user tables in our database

Installing Composer Dependencies

Fortunately, there is a community of developers working on Laravel and maintaining many great packages that we can reuse and extend our application with. In this example we will use

eyJpc3MiOiJ0b3B0YWwuY29tIiwiZXhwIjoxNDI2NDIwODAwLCJodHRwOi8vdG9wdGFsLmNvbS9qd3RfY2xhaW1zL2lzX2FkbWluIjp0cnVlLCJjb21wYW55IjoiVG9wdGFsIiwiYXdlc29tZSI6dHJ1ZX0
3, by Sean Tymon, for handling tokens on the server side, and
eyJpc3MiOiJ0b3B0YWwuY29tIiwiZXhwIjoxNDI2NDIwODAwLCJodHRwOi8vdG9wdGFsLmNvbS9qd3RfY2xhaW1zL2lzX2FkbWluIjp0cnVlLCJjb21wYW55IjoiVG9wdGFsIiwiYXdlc29tZSI6dHJ1ZX0
4, by Barry vd. Heuvel, for handling CORS

jwt-auth

Require the

eyJpc3MiOiJ0b3B0YWwuY29tIiwiZXhwIjoxNDI2NDIwODAwLCJodHRwOi8vdG9wdGFsLmNvbS9qd3RfY2xhaW1zL2lzX2FkbWluIjp0cnVlLCJjb21wYW55IjoiVG9wdGFsIiwiYXdlc29tZSI6dHJ1ZX0
3 package in our
eyJpc3MiOiJ0b3B0YWwuY29tIiwiZXhwIjoxNDI2NDIwODAwLCJodHRwOi8vdG9wdGFsLmNvbS9qd3RfY2xhaW1zL2lzX2FkbWluIjp0cnVlLCJjb21wYW55IjoiVG9wdGFsIiwiYXdlc29tZSI6dHJ1ZX0
6 and update our dependencies

composer require tymon/jwt-auth 0.5.* 

Add the

eyJpc3MiOiJ0b3B0YWwuY29tIiwiZXhwIjoxNDI2NDIwODAwLCJodHRwOi8vdG9wdGFsLmNvbS9qd3RfY2xhaW1zL2lzX2FkbWluIjp0cnVlLCJjb21wYW55IjoiVG9wdGFsIiwiYXdlc29tZSI6dHJ1ZX0
7 to our
eyJpc3MiOiJ0b3B0YWwuY29tIiwiZXhwIjoxNDI2NDIwODAwLCJodHRwOi8vdG9wdGFsLmNvbS9qd3RfY2xhaW1zL2lzX2FkbWluIjp0cnVlLCJjb21wYW55IjoiVG9wdGFsIiwiYXdlc29tZSI6dHJ1ZX0
8 providers array

{
  "alg": "HS256",
  "typ": "JWT"
}
0

Next, in

eyJpc3MiOiJ0b3B0YWwuY29tIiwiZXhwIjoxNDI2NDIwODAwLCJodHRwOi8vdG9wdGFsLmNvbS9qd3RfY2xhaW1zL2lzX2FkbWluIjp0cnVlLCJjb21wYW55IjoiVG9wdGFsIiwiYXdlc29tZSI6dHJ1ZX0
8 file, under the
$encodedContent = base64UrlEncode[header] + "." + base64UrlEncode[payload];
$signature = hashHmacSHA256[$encodedContent];
0 array, we add the
$encodedContent = base64UrlEncode[header] + "." + base64UrlEncode[payload];
$signature = hashHmacSHA256[$encodedContent];
1 facade

{
  "alg": "HS256",
  "typ": "JWT"
}
1

Finally, we will want to publish the package config using the following command. php artisan config. publish tymon/jwt-auth

JSON Web tokens are encrypted using a secret key. We can generate that key using the

$encodedContent = base64UrlEncode[header] + "." + base64UrlEncode[payload];
$signature = hashHmacSHA256[$encodedContent];
2 command. It will be placed inside our
$encodedContent = base64UrlEncode[header] + "." + base64UrlEncode[payload];
$signature = hashHmacSHA256[$encodedContent];
3 file. In the production environment, however, we never want to have our passwords or API keys inside configuration files. Instead, we should place them inside server environment variables and reference them in the configuration file with the
$encodedContent = base64UrlEncode[header] + "." + base64UrlEncode[payload];
$signature = hashHmacSHA256[$encodedContent];
4 function. For example

{
  "alg": "HS256",
  "typ": "JWT"
}
2

We can find out more about this package and all of it’s config settings on Github

laravel-cors

Require the

eyJpc3MiOiJ0b3B0YWwuY29tIiwiZXhwIjoxNDI2NDIwODAwLCJodHRwOi8vdG9wdGFsLmNvbS9qd3RfY2xhaW1zL2lzX2FkbWluIjp0cnVlLCJjb21wYW55IjoiVG9wdGFsIiwiYXdlc29tZSI6dHJ1ZX0
4 package in our
eyJpc3MiOiJ0b3B0YWwuY29tIiwiZXhwIjoxNDI2NDIwODAwLCJodHRwOi8vdG9wdGFsLmNvbS9qd3RfY2xhaW1zL2lzX2FkbWluIjp0cnVlLCJjb21wYW55IjoiVG9wdGFsIiwiYXdlc29tZSI6dHJ1ZX0
6 and update our dependencies

{
  "alg": "HS256",
  "typ": "JWT"
}
3

Add the

$encodedContent = base64UrlEncode[header] + "." + base64UrlEncode[payload];
$signature = hashHmacSHA256[$encodedContent];
7 to our
eyJpc3MiOiJ0b3B0YWwuY29tIiwiZXhwIjoxNDI2NDIwODAwLCJodHRwOi8vdG9wdGFsLmNvbS9qd3RfY2xhaW1zL2lzX2FkbWluIjp0cnVlLCJjb21wYW55IjoiVG9wdGFsIiwiYXdlc29tZSI6dHJ1ZX0
8 providers array

{
  "alg": "HS256",
  "typ": "JWT"
}
4

Then add the middleware to our

$encodedContent = base64UrlEncode[header] + "." + base64UrlEncode[payload];
$signature = hashHmacSHA256[$encodedContent];
9

{
  "alg": "HS256",
  "typ": "JWT"
}
5

Publish the configuration to a local

yRQYnWzskCZUxPwaQupWkiUzKELZ49eM7oWxAQK_ZXw
0 file by using the
yRQYnWzskCZUxPwaQupWkiUzKELZ49eM7oWxAQK_ZXw
1 command

Example of a

yRQYnWzskCZUxPwaQupWkiUzKELZ49eM7oWxAQK_ZXw
2 file configuration

{
  "alg": "HS256",
  "typ": "JWT"
}
6

Routing and Handling HTTP Requests

For the sake of brevity, I will put all my code inside the routes. php chịu trách nhiệm định tuyến Laravel và ủy quyền các yêu cầu cho bộ điều khiển. Chúng tôi thường tạo các bộ điều khiển chuyên dụng để xử lý tất cả các yêu cầu HTTP của mình và giữ cho mã của chúng tôi theo mô-đun và sạch sẽ

Chúng tôi sẽ tải chế độ xem AngularJS SPA của mình bằng cách sử dụng

{
  "alg": "HS256",
  "typ": "JWT"
}
7

Đăng ký người dùng

Khi chúng tôi yêu cầu

yRQYnWzskCZUxPwaQupWkiUzKELZ49eM7oWxAQK_ZXw
3 gửi tới
yRQYnWzskCZUxPwaQupWkiUzKELZ49eM7oWxAQK_ZXw
4 bằng tên người dùng và mật khẩu, chúng tôi sẽ cố gắng tạo một người dùng mới và lưu nó vào cơ sở dữ liệu. Sau khi người dùng đã được tạo, JWT được tạo và trả về thông qua phản hồi JSON

{
  "alg": "HS256",
  "typ": "JWT"
}
8

Đăng nhập người dùng

Khi chúng tôi thực hiện yêu cầu

yRQYnWzskCZUxPwaQupWkiUzKELZ49eM7oWxAQK_ZXw
3 tới
yRQYnWzskCZUxPwaQupWkiUzKELZ49eM7oWxAQK_ZXw
6 bằng tên người dùng và mật khẩu, chúng tôi xác minh rằng người dùng đó tồn tại và trả về JWT thông qua phản hồi JSON

{
  "alg": "HS256",
  "typ": "JWT"
}
9

Tìm nạp tài nguyên bị hạn chế trên cùng một miền

Sau khi người dùng đăng nhập, chúng tôi có thể tìm nạp tài nguyên bị hạn chế. Tôi đã tạo một tuyến đường

yRQYnWzskCZUxPwaQupWkiUzKELZ49eM7oWxAQK_ZXw
7 mô phỏng tài nguyên cần người dùng được xác thực. Để thực hiện việc này, yêu cầu tiêu đề hoặc chuỗi truy vấn
{
  "iss": "toptal.com",
  "exp": 1426420800,
  "//www.toptal.com/jwt_claims/is_admin": true,
  "company": "Toptal",
  "awesome": true
}
3 cần cung cấp JWT cho chương trình phụ trợ để xác minh

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
0

Trong ví dụ này, tôi đang sử dụng phần mềm trung gian

yRQYnWzskCZUxPwaQupWkiUzKELZ49eM7oWxAQK_ZXw
9 được cung cấp trong gói
yRQYnWzskCZUxPwaQupWkiUzKELZ49eM7oWxAQK_ZXw
9 bằng cách sử dụng
composer global require "laravel/installer=~1.1"
1. Phần mềm trung gian này được sử dụng để lọc yêu cầu và xác thực mã thông báo JWT. Nếu mã thông báo không hợp lệ, không có hoặc hết hạn, phần mềm trung gian sẽ đưa ra một ngoại lệ mà chúng tôi có thể bắt được

Trong Laravel 5, chúng ta có thể bắt ngoại lệ bằng cách sử dụng tệp

composer global require "laravel/installer=~1.1"
2. Sử dụng chức năng
composer global require "laravel/installer=~1.1"
3, chúng ta có thể tạo phản hồi HTTP dựa trên ngoại lệ được ném

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
1

Nếu người dùng được xác thực và mã thông báo hợp lệ, chúng tôi có thể trả lại dữ liệu bị hạn chế một cách an toàn cho giao diện người dùng thông qua JSON

Tìm nạp tài nguyên bị hạn chế từ tên miền con API

Trong ví dụ về mã thông báo web JSON tiếp theo, chúng tôi sẽ thực hiện một cách tiếp cận khác để xác thực mã thông báo. Thay vì sử dụng phần mềm trung gian

yRQYnWzskCZUxPwaQupWkiUzKELZ49eM7oWxAQK_ZXw
9, chúng tôi sẽ xử lý ngoại lệ theo cách thủ công. Khi chúng tôi thực hiện yêu cầu
yRQYnWzskCZUxPwaQupWkiUzKELZ49eM7oWxAQK_ZXw
3 tới máy chủ API
composer global require "laravel/installer=~1.1"
6, chúng tôi đang thực hiện yêu cầu nhiều nguồn gốc và phải bật CORS trên phần phụ trợ. May mắn thay, chúng tôi đã cấu hình CORS trong tệp
yRQYnWzskCZUxPwaQupWkiUzKELZ49eM7oWxAQK_ZXw
0

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
2

Ví dụ giao diện người dùng AngularJS

Chúng tôi đang sử dụng AngularJS làm giao diện người dùng, dựa vào các lệnh gọi API đến máy chủ xác thực back-end của Laravel để xác thực người dùng và dữ liệu mẫu, cộng với máy chủ API cho dữ liệu ví dụ về nhiều nguồn gốc. Khi chúng tôi truy cập trang chủ của dự án, phần phụ trợ sẽ phục vụ chế độ xem

composer global require "laravel/installer=~1.1"
8 sẽ khởi động ứng dụng Angular

Đây là cấu trúc thư mục của ứng dụng Angular

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
3

Khởi động ứng dụng góc

composer global require "laravel/installer=~1.1"
9 chứa các yếu tố cơ bản cần thiết để chạy ứng dụng. Chúng tôi sẽ sử dụng Twitter Bootstrap để tạo kiểu, cùng với chủ đề tùy chỉnh từ Bootswatch. Để có một số phản hồi trực quan khi thực hiện cuộc gọi AJAX, chúng tôi sẽ sử dụng tập lệnh thanh tải góc, chặn các yêu cầu XHR và tạo thanh tải. Trong phần tiêu đề, chúng tôi có các biểu định kiểu sau

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
4

Phần cuối của đánh dấu của chúng tôi chứa các tham chiếu đến các thư viện, cũng như các tập lệnh tùy chỉnh của chúng tôi cho các mô-đun, bộ điều khiển và dịch vụ Angular

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
5

Chúng tôi đang sử dụng thư viện

---
ip: "192.168.10.10"
memory: 2048
cpus: 1

authorize: /Users/ttkalec/.ssh/public.psk

keys:
    - /Users/ttkalec/.ssh/private.ppk
folders:
    - map: /coding/jwt
      to: /home/vagrant/coding/jwt
sites:
    - map: jwt.dev
      to: /home/vagrant/coding/jwt/public
    - map: api.jwt.dev
      to: /home/vagrant/coding/jwt/public
variables:
    - key: APP_ENV
      value: local
0 cho AngularJS, để lưu mã thông báo vào bộ nhớ cục bộ của trình duyệt, để chúng tôi có thể gửi nó theo từng yêu cầu thông qua tiêu đề
{
  "iss": "toptal.com",
  "exp": 1426420800,
  "//www.toptal.com/jwt_claims/is_admin": true,
  "company": "Toptal",
  "awesome": true
}
3

Tất nhiên, trong môi trường sản xuất, chúng tôi sẽ thu nhỏ và kết hợp tất cả các tệp tập lệnh và biểu định kiểu để cải thiện hiệu suất

Tôi đã tạo một thanh điều hướng bằng Bootstrap sẽ thay đổi mức độ hiển thị của các liên kết phù hợp, tùy thuộc vào trạng thái đăng nhập của người dùng. Trạng thái đăng nhập được xác định bởi sự hiện diện của biến

---
ip: "192.168.10.10"
memory: 2048
cpus: 1

authorize: /Users/ttkalec/.ssh/public.psk

keys:
    - /Users/ttkalec/.ssh/private.ppk
folders:
    - map: /coding/jwt
      to: /home/vagrant/coding/jwt
sites:
    - map: jwt.dev
      to: /home/vagrant/coding/jwt/public
    - map: api.jwt.dev
      to: /home/vagrant/coding/jwt/public
variables:
    - key: APP_ENV
      value: local
2 trong phạm vi của bộ điều khiển

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
6

Lộ trình

Chúng tôi có một tệp có tên

---
ip: "192.168.10.10"
memory: 2048
cpus: 1

authorize: /Users/ttkalec/.ssh/public.psk

keys:
    - /Users/ttkalec/.ssh/private.ppk
folders:
    - map: /coding/jwt
      to: /home/vagrant/coding/jwt
sites:
    - map: jwt.dev
      to: /home/vagrant/coding/jwt/public
    - map: api.jwt.dev
      to: /home/vagrant/coding/jwt/public
variables:
    - key: APP_ENV
      value: local
3 chịu trách nhiệm định cấu hình tất cả các tuyến giao diện người dùng của chúng tôi

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
7

Ở đây chúng ta có thể thấy rằng chúng ta đã xác định bốn route được xử lý bởi

---
ip: "192.168.10.10"
memory: 2048
cpus: 1

authorize: /Users/ttkalec/.ssh/public.psk

keys:
    - /Users/ttkalec/.ssh/private.ppk
folders:
    - map: /coding/jwt
      to: /home/vagrant/coding/jwt
sites:
    - map: jwt.dev
      to: /home/vagrant/coding/jwt/public
    - map: api.jwt.dev
      to: /home/vagrant/coding/jwt/public
variables:
    - key: APP_ENV
      value: local
4 hoặc
---
ip: "192.168.10.10"
memory: 2048
cpus: 1

authorize: /Users/ttkalec/.ssh/public.psk

keys:
    - /Users/ttkalec/.ssh/private.ppk
folders:
    - map: /coding/jwt
      to: /home/vagrant/coding/jwt
sites:
    - map: jwt.dev
      to: /home/vagrant/coding/jwt/public
    - map: api.jwt.dev
      to: /home/vagrant/coding/jwt/public
variables:
    - key: APP_ENV
      value: local
5. Mọi tuyến tương ứng với chế độ xem HTML một phần. Chúng tôi cũng đã xác định hai hằng số chứa URL cho các yêu cầu HTTP của chúng tôi tới chương trình phụ trợ

Yêu cầu đánh chặn

Dịch vụ $http của AngularJS cho phép chúng tôi giao tiếp với phụ trợ và thực hiện các yêu cầu HTTP. Trong trường hợp của chúng tôi, chúng tôi muốn chặn mọi yêu cầu HTTP và đưa vào đó một tiêu đề

{
  "iss": "toptal.com",
  "exp": 1426420800,
  "//www.toptal.com/jwt_claims/is_admin": true,
  "company": "Toptal",
  "awesome": true
}
3 chứa JWT của chúng tôi nếu người dùng được xác thực. Chúng tôi cũng có thể sử dụng trình chặn để tạo trình xử lý lỗi HTTP toàn cầu. Dưới đây là một ví dụ về trình chặn của chúng tôi sẽ chèn mã thông báo nếu nó có sẵn trong bộ nhớ cục bộ của trình duyệt

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
8

Bộ điều khiển

Trong tệp

---
ip: "192.168.10.10"
memory: 2048
cpus: 1

authorize: /Users/ttkalec/.ssh/public.psk

keys:
    - /Users/ttkalec/.ssh/private.ppk
folders:
    - map: /coding/jwt
      to: /home/vagrant/coding/jwt
sites:
    - map: jwt.dev
      to: /home/vagrant/coding/jwt/public
    - map: api.jwt.dev
      to: /home/vagrant/coding/jwt/public
variables:
    - key: APP_ENV
      value: local
7, chúng tôi đã xác định hai bộ điều khiển cho ứng dụng của mình.
---
ip: "192.168.10.10"
memory: 2048
cpus: 1

authorize: /Users/ttkalec/.ssh/public.psk

keys:
    - /Users/ttkalec/.ssh/private.ppk
folders:
    - map: /coding/jwt
      to: /home/vagrant/coding/jwt
sites:
    - map: jwt.dev
      to: /home/vagrant/coding/jwt/public
    - map: api.jwt.dev
      to: /home/vagrant/coding/jwt/public
variables:
    - key: APP_ENV
      value: local
4 và
---
ip: "192.168.10.10"
memory: 2048
cpus: 1

authorize: /Users/ttkalec/.ssh/public.psk

keys:
    - /Users/ttkalec/.ssh/private.ppk
folders:
    - map: /coding/jwt
      to: /home/vagrant/coding/jwt
sites:
    - map: jwt.dev
      to: /home/vagrant/coding/jwt/public
    - map: api.jwt.dev
      to: /home/vagrant/coding/jwt/public
variables:
    - key: APP_ENV
      value: local
5.
---
ip: "192.168.10.10"
memory: 2048
cpus: 1

authorize: /Users/ttkalec/.ssh/public.psk

keys:
    - /Users/ttkalec/.ssh/private.ppk
folders:
    - map: /coding/jwt
      to: /home/vagrant/coding/jwt
sites:
    - map: jwt.dev
      to: /home/vagrant/coding/jwt/public
    - map: api.jwt.dev
      to: /home/vagrant/coding/jwt/public
variables:
    - key: APP_ENV
      value: local
4 xử lý chức năng đăng nhập, đăng ký và đăng xuất. Nó chuyển dữ liệu tên người dùng và mật khẩu từ các biểu mẫu đăng nhập và đăng ký đến dịch vụ
composer require tymon/jwt-auth 0.5.* 
1, dịch vụ này sẽ gửi các yêu cầu HTTP đến phần phụ trợ. Sau đó, nó lưu mã thông báo vào bộ nhớ cục bộ hoặc hiển thị thông báo lỗi, tùy thuộc vào phản hồi từ chương trình phụ trợ

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
9

---
ip: "192.168.10.10"
memory: 2048
cpus: 1

authorize: /Users/ttkalec/.ssh/public.psk

keys:
    - /Users/ttkalec/.ssh/private.ppk
folders:
    - map: /coding/jwt
      to: /home/vagrant/coding/jwt
sites:
    - map: jwt.dev
      to: /home/vagrant/coding/jwt/public
    - map: api.jwt.dev
      to: /home/vagrant/coding/jwt/public
variables:
    - key: APP_ENV
      value: local
5 hoạt động theo cùng một cách, chỉ có điều nó tìm nạp dữ liệu bằng cách sử dụng các hàm
composer require tymon/jwt-auth 0.5.* 
3 và
composer require tymon/jwt-auth 0.5.* 
4 trên dịch vụ
composer require tymon/jwt-auth 0.5.* 
5

{
  "iss": "toptal.com",
  "exp": 1426420800,
  "//www.toptal.com/jwt_claims/is_admin": true,
  "company": "Toptal",
  "awesome": true
}
0

Chương trình phụ trợ chỉ chịu trách nhiệm cung cấp dữ liệu bị hạn chế nếu người dùng được xác thực. Điều này có nghĩa là để phản hồi với dữ liệu bị hạn chế, yêu cầu đối với dữ liệu đó cần chứa JWT hợp lệ bên trong tiêu đề

{
  "iss": "toptal.com",
  "exp": 1426420800,
  "//www.toptal.com/jwt_claims/is_admin": true,
  "company": "Toptal",
  "awesome": true
}
3 hoặc chuỗi truy vấn của nó. Nếu không đúng như vậy, máy chủ sẽ phản hồi bằng mã trạng thái lỗi 401 Unauthorized

Dịch vụ xác thực

Dịch vụ xác thực chịu trách nhiệm thực hiện đăng nhập và đăng ký các yêu cầu HTTP đến phần phụ trợ. Nếu yêu cầu thành công, phản hồi chứa mã thông báo đã ký, mã này sau đó được giải mã base64 và thông tin xác nhận quyền sở hữu mã thông báo kèm theo được lưu vào biến

composer require tymon/jwt-auth 0.5.* 
7. Điều này được chuyển đến bộ điều khiển thông qua chức năng
composer require tymon/jwt-auth 0.5.* 
8

{
  "iss": "toptal.com",
  "exp": 1426420800,
  "//www.toptal.com/jwt_claims/is_admin": true,
  "company": "Toptal",
  "awesome": true
}
1

Dịch vụ dữ liệu

Đây là một dịch vụ đơn giản đưa ra các yêu cầu đối với máy chủ xác thực cũng như máy chủ API đối với một số dữ liệu giả bị hạn chế. It makes the request, and delegates success and error callbacks to the controller

{
  "iss": "toptal.com",
  "exp": 1426420800,
  "//www.toptal.com/jwt_claims/is_admin": true,
  "company": "Toptal",
  "awesome": true
}
2

Ngoài Hướng dẫn Mã thông báo Web JSON này

Xác thực dựa trên mã thông báo cho phép chúng tôi xây dựng các hệ thống tách rời không bị ràng buộc với một sơ đồ xác thực cụ thể. Mã thông báo có thể được tạo ở bất kỳ đâu và được sử dụng trên bất kỳ hệ thống nào sử dụng cùng một khóa bí mật để ký mã thông báo. Chúng sẵn sàng cho thiết bị di động và không yêu cầu chúng tôi sử dụng cookie

Mã thông báo web JSON hoạt động trên tất cả các ngôn ngữ lập trình phổ biến và nhanh chóng trở nên phổ biến. Chúng được hỗ trợ bởi các công ty như Google, Microsoft và Zendesk. Thông số kỹ thuật tiêu chuẩn của Lực lượng đặc nhiệm kỹ thuật Internet [IETF] vẫn đang ở phiên bản dự thảo và có thể thay đổi một chút trong tương lai

Vẫn còn nhiều điều cần đề cập về JWT, chẳng hạn như cách xử lý các chi tiết bảo mật và làm mới mã thông báo khi chúng hết hạn, nhưng hướng dẫn Mã thông báo web JSON sẽ trình bày cách sử dụng cơ bản và quan trọng hơn là lợi ích của việc sử dụng JWT

Đọc thêm trên Blog Kỹ thuật Toptal

  • Xây dựng một nút. js/TypeScript REST API, Phần 3. MongoDB, xác thực và kiểm tra tự động

Hiểu những điều cơ bản

Mã thông báo mang là gì?

Điều này đề cập đến một JWT, được truyền qua tiêu đề HTTP có tên là Ủy quyền, ở định dạng chuỗi "Bearer $your_token_here"

JWT là gì?

JWT là viết tắt của JSON Web Token, một chiến thuật xác thực phổ biến được sử dụng trong các ứng dụng web hiện đại

JSON hoạt động như thế nào?

JSON chỉ đơn giản là một định dạng dữ liệu gần giống với định dạng dữ liệu bằng chữ được JavaScript cho phép. Đó là một định dạng phân cấp cho phép các đối tượng và mảng lồng nhau, cũng như các ký tự chuỗi và số

thẻ

Xác thựcJWTAỦy quyềnNoCookies

Người làm việc tự do? Tìm công việc tiếp theo của bạn.

Việc làm Web Developer

Xem thông tin đầy đủ

Tino Tkalec

Kỹ sư phần mềm tự do

Thông tin về các Tác giả

Tino là một kỹ sư phần mềm với hơn 10 năm kinh nghiệm trong việc tạo các ứng dụng web và Windows gốc. Anh ấy có kinh nghiệm dày dặn với LAMP stack và khả năng tái cấu trúc mã spaghetti thành mã có thể kiểm tra và tái sử dụng

Thuê Tino

Bình luận

Agustín Santiago Castaño

Nội dung rất thú vị và hiện tại

Agustín Santiago Castaño

Nội dung rất thú vị và hiện tại

Alex Xela

Cảm ơn bạn vì bài viết thú vị, nhưng đối với tôi, ưu và nhược điểm của từng phương pháp có vẻ khá yếu. Ví dụ: sử dụng JWT, máy chủ của bạn có chi phí hoạt động bị lộ do xác thực mã thông báo trên mỗi yêu cầu [i. e. giống như trong cookie]. Vấn đề CORS hoàn toàn không được mô tả. Điểm cuối cùng - loại bỏ khớp nối với khung có vẻ đúng. Nhưng mà. Tại thời điểm này, chúng tôi đã kết hợp với thư viện xử lý JWT [tiêu chuẩn của nó vẫn đang thảo luận]. Cuối cùng, đó là cách tiếp cận mới thú vị, nhưng thực tế nó không cung cấp bất kỳ lý do mạnh mẽ nào để sử dụng nó thay vì cách dựa trên cookie

Alex Xela

Cảm ơn bạn vì bài viết thú vị, nhưng đối với tôi, ưu và nhược điểm của từng phương pháp có vẻ khá yếu. Ví dụ: sử dụng JWT, máy chủ của bạn có chi phí hoạt động bị lộ do xác thực mã thông báo trên mỗi yêu cầu [i. e. giống như trong cookie]. Vấn đề CORS hoàn toàn không được mô tả. Điểm cuối cùng - loại bỏ khớp nối với khung có vẻ đúng. Nhưng mà. Tại thời điểm này, chúng tôi đã kết hợp với thư viện xử lý JWT [tiêu chuẩn của nó vẫn đang thảo luận]. Cuối cùng, đó là cách tiếp cận mới thú vị, nhưng thực tế nó không cung cấp bất kỳ lý do mạnh mẽ nào để sử dụng nó thay vì cách dựa trên cookie

Ahmed Abdel Razzak

Mối quan tâm duy nhất của tôi là làm thế nào để đăng xuất người dùng. Bạn có thể xóa mã thông báo khỏi bộ nhớ cục bộ. nhưng miễn là nó chưa hết hạn, nó có thể được sử dụng lại. Một giải pháp đơn giản là giữ một tham chiếu về mã thông báo nào đã hết hạn bởi người dùng [đăng xuất thủ công] và xóa mã thông báo đó. Và giữ một tham chiếu về id mã thông báo trong jwt thay vì id người dùng. Tôi biết nó giống như mã có mùi. Nhưng thực sự không thể tìm thấy bất kỳ giải pháp nào khác. Bất kỳ ý tưởng?

Ahmed Abdel Razzak

Mối quan tâm duy nhất của tôi là làm thế nào để đăng xuất người dùng. Bạn có thể xóa mã thông báo khỏi bộ nhớ cục bộ. nhưng miễn là nó chưa hết hạn, nó có thể được sử dụng lại. Một giải pháp đơn giản là giữ một tham chiếu về mã thông báo nào đã hết hạn bởi người dùng [đăng xuất thủ công] và xóa mã thông báo đó. Và giữ một tham chiếu về id mã thông báo trong jwt thay vì id người dùng. Tôi biết nó giống như mã có mùi. Nhưng thực sự không thể tìm thấy bất kỳ giải pháp nào khác. Bất kỳ ý tưởng?

Vitaly Dyatlov

Điều tương tự cũng áp dụng cho cookie. Bạn có thể xóa cookie nhưng vẫn có thể sử dụng nó để xác thực. Trừ khi bạn thông báo cho máy chủ về những thay đổi của mình - bạn sẽ gặp rủi ro

Vitaly Dyatlov

Điều tương tự cũng áp dụng cho cookie. Bạn có thể xóa cookie nhưng vẫn có thể sử dụng nó để xác thực. Trừ khi bạn thông báo cho máy chủ về những thay đổi của mình - bạn sẽ gặp rủi ro

Tino Tkalec

Không có cách nào để dễ dàng vô hiệu hóa mã thông báo mà không liên quan đến cơ sở dữ liệu. Bạn có thể muốn xem mã thông báo làm mới để giúp bạn thực hiện việc này. https. //auth0. com/docs/refresh-token Nếu bạn chỉ xóa mã thông báo trên máy khách, nó sẽ không ảnh hưởng gì đến bảo mật phía máy chủ. Tôi nghĩ cách tốt nhất là giữ cho thời gian hết hạn của mã thông báo ngắn và xoay vòng chúng thường xuyên. Điều này cũng có nhược điểm của nó. Bảo mật mã thông báo và các phương pháp hay nhất là một chủ đề rộng, xứng đáng với một bài đăng trên blog khác

Tino Tkalec

Không có cách nào để dễ dàng vô hiệu hóa mã thông báo mà không liên quan đến cơ sở dữ liệu. Bạn có thể muốn xem mã thông báo làm mới để giúp bạn thực hiện việc này. https. //auth0. com/docs/refresh-token Nếu bạn chỉ xóa mã thông báo trên máy khách, nó sẽ không ảnh hưởng gì đến bảo mật phía máy chủ. Tôi nghĩ cách tốt nhất là giữ cho thời gian hết hạn của mã thông báo ngắn và xoay vòng chúng thường xuyên. Điều này cũng có nhược điểm của nó. Bảo mật mã thông báo và các phương pháp hay nhất là một chủ đề rộng, xứng đáng với một bài đăng trên blog khác

Vitaly Dyatlov

nó thực sự dễ dàng hơn cho các ứng dụng di động. Bạn không thể sử dụng cookie trong các ứng dụng yên tĩnh

Vitaly Dyatlov

nó thực sự dễ dàng hơn cho các ứng dụng di động. Bạn không thể sử dụng cookie trong các ứng dụng yên tĩnh

Tino Tkalec

JWT không phù hợp với mọi thứ nhưng chúng giúp chúng tôi linh hoạt hơn khi sử dụng xác thực dựa trên cookie, đặc biệt là đối với các ứng dụng dành cho thiết bị di động. Tôi không muốn đi sâu vào CORS, vì bản thân nó là một con quái vật. Xác thực mã thông báo có ít chi phí hơn so với việc tìm phiên trong cơ sở dữ liệu và giải tuần tự hóa nó. Bạn không được kết hợp với thư viện xử lý JWT, bởi vì mọi thư viện sẽ mang lại JWT trông giống như đầu ra. Tiêu chuẩn của JWT vẫn chưa được hoàn thiện, nhưng chắc chắn sẽ không có bất kỳ thay đổi lớn nào ở đó và các thư viện sẽ điều chỉnh cho phù hợp

Tino Tkalec

JWT không phù hợp với mọi thứ nhưng chúng giúp chúng tôi linh hoạt hơn khi sử dụng xác thực dựa trên cookie, đặc biệt là đối với các ứng dụng dành cho thiết bị di động. Tôi không muốn đi sâu vào CORS, vì bản thân nó là một con quái vật. Xác thực mã thông báo có ít chi phí hơn so với việc tìm phiên trong cơ sở dữ liệu và giải tuần tự hóa nó. Bạn không được kết hợp với thư viện xử lý JWT, bởi vì mọi thư viện sẽ mang lại JWT trông giống như đầu ra. Tiêu chuẩn của JWT vẫn chưa được hoàn thiện, nhưng chắc chắn sẽ không có bất kỳ thay đổi lớn nào ở đó và các thư viện sẽ điều chỉnh cho phù hợp

Alex Xela

nó không giống nhau. Phiên lưu trữ cookie được đồng bộ hóa trên máy khách và phía máy chủ. Vì vậy, máy chủ có thể làm mất hiệu lực phiên của khách hàng [theo thời gian chờ hoặc theo yêu cầu]. Đó là ưu điểm mạnh của ứng dụng "trạng thái". Tôi đặt "trạng thái" trong dấu ngoặc kép vì nó khác với thuật ngữ "trạng thái" thường được sử dụng. Ví dụ: ứng dụng có phụ trợ DB có thể không trạng thái nhưng vẫn giữ phiên người dùng

Alex Xela

nó không giống nhau. Phiên lưu trữ cookie được đồng bộ hóa trên máy khách và phía máy chủ. Vì vậy, máy chủ có thể làm mất hiệu lực phiên của khách hàng [theo thời gian chờ hoặc theo yêu cầu]. Đó là ưu điểm mạnh của ứng dụng "trạng thái". Tôi đặt "trạng thái" trong dấu ngoặc kép vì nó khác với thuật ngữ "trạng thái" thường được sử dụng. Ví dụ: ứng dụng có phụ trợ DB có thể không trạng thái nhưng vẫn giữ phiên người dùng

Ryan J. Peterson

Cũng như một lưu ý, tuyến đường Nhà cung cấp hiện là. 'Tymon\JWTAuth\Nhà cung cấp\JWTAut'

Ryan J. Peterson

Cũng như một lưu ý, tuyến đường Nhà cung cấp hiện là. 'Tymon\JWTAuth\Nhà cung cấp\JWTAut'

Tino Tkalec

Cảm ơn Ryan. tôi sẽ cập nhật nó

Tino Tkalec

Cảm ơn Ryan. tôi sẽ cập nhật nó

John L Magee

Đây là một bài viết hay về Xác thực. Ở những nơi dường như sử dụng thuật ngữ Xác thực và Ủy quyền thay thế cho nhau. Một số làm rõ và có lẽ một bài viết tiếp theo sẽ rất hữu ích

John L Magee

Đây là một bài viết hay về Xác thực. Ở những nơi dường như sử dụng thuật ngữ Xác thực và Ủy quyền thay thế cho nhau. Một số làm rõ và có lẽ một bài viết tiếp theo sẽ rất hữu ích

Eduardo Pereira

Bạn có thể kiểm tra cơ sở dữ liệu nếu người dùng đã đăng nhập [boolean], đồng thời kiểm tra xem mã thông báo đã hết hạn hay được đánh dấu là không hợp lệ hay chưa, các yêu cầu JWT có thể giúp bạn đạt được điều đó. Như đã nêu trước đó, không có cách nào dễ dàng để đăng xuất mã thông báo JWT mà không liên quan đến một số cơ sở dữ liệu phụ trợ

Eduardo Pereira

Bạn có thể kiểm tra cơ sở dữ liệu nếu người dùng đã đăng nhập [boolean], đồng thời kiểm tra xem mã thông báo đã hết hạn hay được đánh dấu là không hợp lệ hay chưa, các yêu cầu JWT có thể giúp bạn đạt được điều đó. Như đã nêu trước đó, không có cách nào dễ dàng để đăng xuất mã thông báo JWT mà không liên quan đến một số cơ sở dữ liệu phụ trợ

Eduardo Pereira

Theo quan điểm của tôi. http. //jwt. io/

Eduardo Pereira

Theo quan điểm của tôi. http. //jwt. io/

Tino Tkalec

Này John, tnx cho nhận xét. Bài viết này tập trung vào xác thực đề cập [trong thời gian ngắn] để xác định rằng ai đó là người mà anh ta tuyên bố là. Ủy quyền đề cập đến quyền của người dùng hoặc những gì người dùng được phép làm. Một chỗ trong bài viết mà tôi thường đề cập đến ủy quyền là "Tiêu đề ủy quyền" được xác định bởi giao thức HTTP. Có một vài chỗ khác mà tôi đã sử dụng nhầm thuật ngữ ủy quyền thay vì xác thực, nhưng điều đó hiện đã được khắc phục

Tino Tkalec

Này John, tnx cho nhận xét. Bài viết này tập trung vào xác thực đề cập [trong thời gian ngắn] để xác định rằng ai đó là người mà anh ta tuyên bố là. Ủy quyền đề cập đến quyền của người dùng hoặc những gì người dùng được phép làm. Một chỗ trong bài viết mà tôi thường đề cập đến ủy quyền là "Tiêu đề ủy quyền" được xác định bởi giao thức HTTP. Có một vài chỗ khác mà tôi đã sử dụng nhầm thuật ngữ ủy quyền thay vì xác thực, nhưng điều đó hiện đã được khắc phục

Ahmed Abdel Razzak

Chỉ để đảm bảo rằng mọi người đều có ý tưởng về cách tôi giải quyết vấn đề [để tham khảo và đề xuất] 1 - Tôi đã thêm mô hình mã thông báo xác thực vào cơ sở dữ liệu chỉ có 2 trường [id, mã thông báo] 2 - Tôi đã thêm . 3- Nếu người dùng cố gắng đăng nhập bằng mã thông báo, chỉ cần kiểm tra xem id trong tải trọng [hoặc chính mã thông báo] có tồn tại hay không. Nếu không thì anh ta phải đăng xuất trước đó. --- PS Giải pháp này chỉ hoạt động với trường id và trên thực tế, nó an toàn hơn [trong trường hợp vi phạm], nhưng tôi cần lưu mã thông báo và nhiều thông tin "phiên" khác cho các mục đích khác] Nếu bạn nghĩ rằng điều này . hãy chia sẻ với tôi những gì bạn nghĩ. D

Ahmed Abdel Razzak

Chỉ để đảm bảo rằng mọi người đều có ý tưởng về cách tôi giải quyết vấn đề [để tham khảo và đề xuất] 1 - Tôi đã thêm mô hình mã thông báo xác thực vào cơ sở dữ liệu chỉ có 2 trường [id, mã thông báo] 2 - Tôi đã thêm . 3- Nếu người dùng cố gắng đăng nhập bằng mã thông báo, chỉ cần kiểm tra xem id trong tải trọng [hoặc chính mã thông báo] có tồn tại hay không. Nếu không thì anh ta phải đăng xuất trước đó. --- PS Giải pháp này chỉ hoạt động với trường id và trên thực tế, nó an toàn hơn [trong trường hợp vi phạm], nhưng tôi cần lưu mã thông báo và nhiều thông tin "phiên" khác cho các mục đích khác] Nếu bạn nghĩ rằng điều này . hãy chia sẻ với tôi những gì bạn nghĩ. D

Ahmed Abdel Razzak

+1 cho mã thông báo làm mới

Ahmed Abdel Razzak

+1 cho mã thông báo làm mới

Rohan Deshpande

hướng dẫn tuyệt vời. Tuy nhiên, tôi đang gặp một số sự cố, về cơ bản, tôi không thể thực hiện các yêu cầu Ajax đối với tên miền phụ api của mình vì tôi liên tục gặp lỗi không khớp mã thông báo csrf. Có ai khác trải nghiệm điều này? . ajaxSetup[] [đã hoạt động tốt trước khi tôi sử dụng api] nên tôi không chắc chuyện gì đang xảy ra. Bất kỳ ý tưởng? . hmm vừa thấy lưu ý về việc không cần CSRF vì phương pháp này không sử dụng cookie. Ngọt

Rohan Deshpande

hướng dẫn tuyệt vời. Tuy nhiên, tôi đang gặp một số sự cố, về cơ bản, tôi không thể thực hiện các yêu cầu Ajax đối với tên miền phụ api của mình vì tôi liên tục gặp lỗi không khớp mã thông báo csrf. Có ai khác trải nghiệm điều này? . ajaxSetup[] [đã hoạt động tốt trước khi tôi sử dụng api] nên tôi không chắc chuyện gì đang xảy ra. Bất kỳ ý tưởng? . hmm vừa thấy lưu ý về việc không cần CSRF vì phương pháp này không sử dụng cookie. Ngọt

Sean Tymon

Thông tin cho bạn biết, gói jwt-auth của tôi có tính năng vô hiệu hóa mã thông báo và làm mới tích hợp sẵn. Nó sử dụng trình điều khiển bộ đệm của Laravel theo mặc định, nhưng bất kỳ kho lưu trữ giá trị khóa nào cũng đủ. Xem tại đây để tham khảo [chưa hoàn thành tài liệu đầy đủ] - https. //github. com/tymondesigns/jwt-auth/blob/master/src/JWTAuth. php#L126-L144

Sean Tymon

Thông tin cho bạn biết, gói jwt-auth của tôi có tính năng vô hiệu hóa mã thông báo và làm mới tích hợp sẵn. Nó sử dụng trình điều khiển bộ đệm của Laravel theo mặc định, nhưng bất kỳ kho lưu trữ giá trị khóa nào cũng đủ. Xem tại đây để tham khảo [chưa hoàn thành tài liệu đầy đủ] - https. //github. com/tymondesigns/jwt-auth/blob/master/src/JWTAuth. php#L126-L144

Bradley Suira

Xin chào, để xuất bản JWTAuth là. nhà cung cấp thủ công php. xuất bản --provider="Tymon\JWTAuth\Providers\JWTAuthServiceProvider" --tag="config"

Bradley Suira

Xin chào, để xuất bản JWTAuth là. nhà cung cấp thủ công php. xuất bản --provider="Tymon\JWTAuth\Providers\JWTAuthServiceProvider" --tag="config"

Alberto Cole

Sẽ không an toàn khi lưu trữ thông tin nhạy cảm trên bộ lưu trữ cục bộ? . thực sự có một sự thay thế. Gửi JWT qua Cookie và Cookie được đặt thành HttpOnly để không có mã JS nào có thể truy cập nó, sự đánh đổi ở đây là xử lý CORS/XSRF, có một bài đọc hay về điều này nếu bạn quan tâm https. //đường bão. com/blog/where-to-store-your-jwts-cookies-vs-html5-web-storage/

Alberto Cole

Sẽ không an toàn khi lưu trữ thông tin nhạy cảm trên bộ lưu trữ cục bộ? . thực sự có một sự thay thế. Gửi JWT qua Cookie và Cookie được đặt thành HttpOnly để không có mã JS nào có thể truy cập nó, sự đánh đổi ở đây là xử lý CORS/XSRF, có một bài đọc hay về điều này nếu bạn quan tâm https. //đường bão. com/blog/where-to-store-your-jwts-cookies-vs-html5-web-storage/

Rohan Deshpande

Chỉ cần một lưu ý, khi tôi cố chạy `php artisan config. xuất bản tymon/jwt-auth` nó nói lệnh không tồn tại, tôi đã thử nhà cung cấp. xuất bản và nó đưa ra một ngoại lệ với nội dung "Quá nhiều đối số" không chắc tại sao điều này lại xảy ra, nhưng tôi vừa lấy mẫu tệp cấu hình từ repo và sau đó tạo khóa của mình

Rohan Deshpande

Chỉ cần một lưu ý, khi tôi cố chạy `php artisan config. xuất bản tymon/jwt-auth` nó nói lệnh không tồn tại, tôi đã thử nhà cung cấp. xuất bản và nó đưa ra một ngoại lệ với nội dung "Quá nhiều đối số" không chắc tại sao điều này lại xảy ra, nhưng tôi vừa lấy mẫu tệp cấu hình từ repo và sau đó tạo khóa của mình

Rohan Deshpande

Tôi cũng thắc mắc về phần mềm trung gian vì khi tôi kiểm tra các tệp, bên trong JWTAuthServiceProvider. php trong phương thức registerJWTAuthMiddleware[], nó dường như được gọi là tymon. jwt. xác thực. Tôi không chắc lắm, vì tôi nghĩ phần mềm trung gian phải được đăng ký trong app/Http/Kernel. php nhưng có lẽ có một số cách khác để làm điều đó và tôi đang thiếu thứ gì đó

Rohan Deshpande

Tôi cũng thắc mắc về phần mềm trung gian vì khi tôi kiểm tra các tệp, bên trong JWTAuthServiceProvider. php trong phương thức registerJWTAuthMiddleware[], nó dường như được gọi là tymon. jwt. xác thực. Tôi không chắc lắm, vì tôi nghĩ phần mềm trung gian phải được đăng ký trong app/Http/Kernel. php nhưng có lẽ có một số cách khác để làm điều đó và tôi đang thiếu thứ gì đó

Badru

Cám ơn vì đã chia sẻ

Badru

Cám ơn vì đã chia sẻ

♫☆ Alex Goretoy ☭ ☁

bài viết hay. Tôi đã sử dụng thư viện jwt này trong một dự án laravel hai tháng trước. Tôi không biết về laravel-cors. Thanks. Tại sao bạn không sử dụng bower? . Lệnh này dành cho Laravel 4. x, không phải 5. cấu hình thủ công x php. xuất bản tymon/jwt-auth trong phiên bản 5, sử dụng nhà cung cấp. xuất bản, như bạn đề cập sau trong bài viết

♫☆ Alex Goretoy ☭ ☁

bài viết hay. Tôi đã sử dụng thư viện jwt này trong một dự án laravel hai tháng trước. Tôi không biết về laravel-cors. Thanks. Tại sao bạn không sử dụng bower? . Lệnh này dành cho Laravel 4. x, không phải 5. cấu hình thủ công x php. xuất bản tymon/jwt-auth trong phiên bản 5, sử dụng nhà cung cấp. xuất bản, như bạn đề cập sau trong bài viết

Jonathan Gravois

Bài báo tuyệt vời. Rất kịp thời vì thực sự chưa có hướng dẫn Laravel 5/AngularJS JWT nào khác trên web. Tôi có trường hợp sử dụng hơi khác so với mẫu của bạn. Tôi muốn [cần] tách các ứng dụng để API Laravel 5 là một ứng dụng hoàn toàn riêng biệt với ứng dụng khách AngularJS. Lý do tôi cần điều này là vì tôi thực sự sẽ kết thúc với ứng dụng khách "Staff" [Angular], ứng dụng khách "Client" [Angular], ứng dụng di động "Client" [Ionic], tất cả sẽ sử dụng API của Laravel. Tôi đã đọc bài viết của bạn và sau đó tôi xem lại nó và làm theo và có thể tạo lại ví dụ của bạn. Bạn có thể chỉ cho tôi đi đúng hướng về những thay đổi mà tôi sẽ cần thực hiện để điều chỉnh ví dụ của bạn vào trường hợp sử dụng của tôi không. Tôi nghĩ rằng tôi sẽ cần tạo một phần định tuyến/đăng nhập của API và tạo trang đăng nhập trên máy khách nơi đăng nhập thành công sẽ nhận và lưu trữ cục bộ JWT nhưng tôi không chắc chắn cách thực hiện điều này

Jonathan Gravois

Bài báo tuyệt vời. Rất kịp thời vì thực sự chưa có hướng dẫn Laravel 5/AngularJS JWT nào khác trên web. Tôi có trường hợp sử dụng hơi khác so với mẫu của bạn. Tôi muốn [cần] tách các ứng dụng để API Laravel 5 là một ứng dụng hoàn toàn riêng biệt với ứng dụng khách AngularJS. Lý do tôi cần điều này là vì tôi thực sự sẽ kết thúc với ứng dụng khách "Staff" [Angular], ứng dụng khách "Client" [Angular], ứng dụng di động "Client" [Ionic], tất cả sẽ sử dụng API của Laravel. Tôi đã đọc bài viết của bạn và sau đó tôi xem lại nó và làm theo và có thể tạo lại ví dụ của bạn. Bạn có thể chỉ cho tôi đi đúng hướng về những thay đổi mà tôi sẽ cần thực hiện để điều chỉnh ví dụ của bạn vào trường hợp sử dụng của tôi không. Tôi nghĩ rằng tôi sẽ cần tạo một phần định tuyến/đăng nhập của API và tạo trang đăng nhập trên máy khách nơi đăng nhập thành công sẽ nhận và lưu trữ cục bộ JWT nhưng tôi không chắc chắn cách thực hiện điều này

Khách

Bài viết xuất sắc. Laravel 5 đã thay đổi phương thức xuất bản. Bây giờ nó là nhà cung cấp. xuất bản thay vì cấu hình. xuất bản, vì vậy cách chính xác là. nhà cung cấp thủ công php. xuất bản tymon/jwt-auth Một lần nữa, xin chúc mừng vì bài viết xuất sắc của bạn. ]

Khách

Bài viết xuất sắc. Laravel 5 đã thay đổi phương thức xuất bản. Bây giờ nó là nhà cung cấp. xuất bản thay vì cấu hình. xuất bản, vì vậy cách chính xác là. nhà cung cấp thủ công php. xuất bản tymon/jwt-auth Một lần nữa, xin chúc mừng vì bài viết xuất sắc của bạn. ]

Paulo Coghi

Bài viết xuất sắc. Laravel 5 đã thay đổi phương thức xuất bản. Bây giờ nó là nhà cung cấp. xuất bản thay vì cấu hình. xuất bản, vì vậy cách chính xác là. nhà cung cấp thủ công php. xuất bản [vâng, không có phần "tymon/jwt-auth"] Một lần nữa, xin chúc mừng bài viết xuất sắc của bạn. ]

Paulo Coghi

Bài viết xuất sắc. Laravel 5 đã thay đổi phương thức xuất bản. Bây giờ nó là nhà cung cấp. xuất bản thay vì cấu hình. xuất bản, vì vậy cách chính xác là. nhà cung cấp thủ công php. xuất bản [vâng, không có phần "tymon/jwt-auth"] Một lần nữa, xin chúc mừng bài viết xuất sắc của bạn. ]

Karlo Smid

Chào Tino. Tôi nghĩ rằng tuyên bố này là không đúng sự thật. """ Bảo vệ. Vì chúng tôi không sử dụng cookie nên chúng tôi không phải bảo vệ chống lại các cuộc tấn công giả mạo yêu cầu trên nhiều trang web [CSRF] """ Bạn có thể giải thích thêm về điều đó không? Vì không có cách nào để vô hiệu hóa mã thông báo JWT, nên mã thông báo JWT được tạo sẽ là . Vì thực tế đó, mọi phương thức POST/PUT phải được bảo vệ bằng bí mật CSRF

Karlo Smid

Chào Tino. Tôi nghĩ rằng tuyên bố này là không đúng sự thật. """ Bảo vệ. Vì chúng tôi không sử dụng cookie nên chúng tôi không phải bảo vệ chống lại các cuộc tấn công giả mạo yêu cầu trên nhiều trang web [CSRF] """ Bạn có thể giải thích thêm về điều đó không? Vì không có cách nào để vô hiệu hóa mã thông báo JWT, nên mã thông báo JWT được tạo sẽ là . Vì thực tế đó, mọi phương thức POST/PUT phải được bảo vệ bằng bí mật CSRF

Sean Tymon

Bạn nên tìm thêm một số thông tin trong bài đăng SO này - http. // stackoverflow. com/questions/21357182/csrf-token-necessary-when-using-stateless-sessionless-authentication JWT có thời hạn sử dụng nên chúng chỉ có hiệu lực miễn là bạn đặt chúng ở mức. Bạn có thể muốn biết rằng tôi đã triển khai một cách để "danh sách đen" mã thông báo bằng cách sử dụng gói được đề cập tại đây. Nó chỉ cần thêm mã thông báo "jti" vào redis, nơi mã thông báo này vẫn tồn tại cho đến khi mã thông báo hết hạn, tại thời điểm đó, mã thông báo sẽ tự động bị xóa

Sean Tymon

Bạn nên tìm thêm một số thông tin trong bài đăng SO này - http. // stackoverflow. com/questions/21357182/csrf-token-necessary-when-using-stateless-sessionless-authentication JWT có thời hạn sử dụng nên chúng chỉ có hiệu lực miễn là bạn đặt chúng ở mức. Bạn có thể muốn biết rằng tôi đã triển khai một cách để "danh sách đen" mã thông báo bằng cách sử dụng gói được đề cập tại đây. Nó chỉ cần thêm mã thông báo "jti" vào redis, nơi mã thông báo này vẫn tồn tại cho đến khi mã thông báo hết hạn, tại thời điểm đó, mã thông báo sẽ tự động bị xóa

Miguel

Tôi đã thử ví dụ nhưng tôi gặp lỗi "Không có tiêu đề 'Kiểm soát truy cập-Cho phép-Xuất xứ' trên tài nguyên được yêu cầu. Xuất xứ 'http. //máy chủ cục bộ. 8383' do đó không được phép truy cập. Phản hồi có mã trạng thái HTTP 403" Bây giờ bạn phải làm gì? vì ứng dụng của tôi không ở cùng một máy chủ. Cấu hình CORS của bạn hoạt động vì nó nằm trong cùng một máy chủ

Miguel

Tôi đã thử ví dụ nhưng tôi gặp lỗi "Không có tiêu đề 'Kiểm soát truy cập-Cho phép-Xuất xứ' trên tài nguyên được yêu cầu. Xuất xứ 'http. //máy chủ cục bộ. 8383' do đó không được phép truy cập. Phản hồi có mã trạng thái HTTP 403" Bây giờ bạn phải làm gì? vì ứng dụng của tôi không ở cùng một máy chủ. Cấu hình CORS của bạn hoạt động vì nó nằm trong cùng một máy chủ

Neerav

Cảm ơn Tino rất nhiều vì bài hướng dẫn rất hay, giải thích chi tiết các khái niệm. Tôi mới bắt đầu khám phá khả năng sử dụng angularjs với laravel 5. Trong khi xem qua nhiều bài viết về việc sử dụng góc cạnh cho người mới bắt đầu, tôi đã bắt gặp một quan điểm mạnh mẽ rằng "KHÔNG SỬ DỤNG JQUERY TRONG DỰ ÁN ANGULAR" và "THINK IN ANGULAR", nghĩa là hãy cố gắng tránh jquery càng lâu càng tốt trong khi phát triển với angularjs sẽ . Theo những ý kiến ​​đó, có cách nào để không sử dụng jquery mà vẫn đạt được những gì bạn đã trình bày ở đây không? . Tôi sẽ thực sự đánh giá cao sự giúp đỡ của bạn trong việc hiểu những điều này

Neerav

Cảm ơn Tino rất nhiều vì bài hướng dẫn rất hay, giải thích chi tiết các khái niệm. Tôi mới bắt đầu khám phá khả năng sử dụng angularjs với laravel 5. Trong khi xem qua nhiều bài viết về việc sử dụng góc cạnh cho người mới bắt đầu, tôi đã bắt gặp một quan điểm mạnh mẽ rằng "KHÔNG SỬ DỤNG JQUERY TRONG DỰ ÁN ANGULAR" và "THINK IN ANGULAR", nghĩa là hãy cố gắng tránh jquery càng lâu càng tốt trong khi phát triển với angularjs sẽ . Theo những ý kiến ​​đó, có cách nào để không sử dụng jquery mà vẫn đạt được những gì bạn đã trình bày ở đây không? . Tôi sẽ thực sự đánh giá cao sự giúp đỡ của bạn trong việc hiểu những điều này

xe ngựa

Nó không phải là không quốc tịch? . Nếu không có mã thông báo, bạn không được ủy quyền. Sau đó, lần tới khi họ xác thực, họ sẽ nhận được mã thông báo mới. Vì vậy, không sử dụng lại mã thông báo cũ

xe ngựa

Nó không phải là không quốc tịch? . Nếu không có mã thông báo, bạn không được ủy quyền. Sau đó, lần tới khi họ xác thực, họ sẽ nhận được mã thông báo mới. Vì vậy, không sử dụng lại mã thông báo cũ

Ahmed Abdel Razzak

Vâng nó nên. Nhưng bạn sẽ thu hồi mã thông báo hợp lệ bằng cách nào khác?

Ahmed Abdel Razzak

Vâng nó nên. Nhưng bạn sẽ thu hồi mã thông báo hợp lệ bằng cách nào khác?

xe ngựa

Điểm lấy ở đó. Nhiều thiết bị đặt ra nhiều suy nghĩ hơn

xe ngựa

Điểm lấy ở đó. Nhiều thiết bị đặt ra nhiều suy nghĩ hơn

Ahmed Abdel Razzak

Mặt khác. Tôi không nghĩ rằng giải pháp này là trạng thái. Và sửa cho tôi nếu tôi sai, Máy chủ không lưu bất kỳ "trạng thái" nào về người dùng. Và mã thông báo người dùng [dưới dạng tài nguyên] lưu thông tin về trạng thái của chính nó giống như bài đăng của người dùng. Nó thuộc về một người dùng và giống như một bài đăng của người dùng. Anh ấy có thể xóa nó. Tôi nghĩ về jwt giống như một "cái bắt tay" giữa yêu cầu nhận được và api. Không phải là một mã thông báo xác thực. Máy chủ phát hành nó và xác thực tính hợp lệ của nó [và quan trọng hơn là sự tồn tại của nó] với mỗi yêu cầu. Điều mà tôi không nghĩ [IMHO] làm mất hiệu lực nguyên tắc không trạng thái. Một lưu ý cuối cùng về kịch bản bạn đang mô tả. Từ những gì tôi hiểu. Bạn phản đối rằng nếu người dùng đã tạo [giả mạo] mã thông báo hợp lệ [không được tạo bởi api] thì yêu cầu phải được xác thực chính xác và hợp lệ. Nếu đó là chính xác, tôi cảm thấy rằng giải pháp không an toàn của nó. Mã thông báo mà API không tạo có hợp lệ không?

Ahmed Abdel Razzak

Mặt khác. Tôi không nghĩ rằng giải pháp này là trạng thái. Và sửa cho tôi nếu tôi sai, Máy chủ không lưu bất kỳ "trạng thái" nào về người dùng. Và mã thông báo người dùng [dưới dạng tài nguyên] lưu thông tin về trạng thái của chính nó giống như bài đăng của người dùng. Nó thuộc về một người dùng và giống như một bài đăng của người dùng. Anh ấy có thể xóa nó. Tôi nghĩ về jwt giống như một "cái bắt tay" giữa yêu cầu nhận được và api. Không phải là một mã thông báo xác thực. Máy chủ phát hành nó và xác thực tính hợp lệ của nó [và quan trọng hơn là sự tồn tại của nó] với mỗi yêu cầu. Điều mà tôi không nghĩ [IMHO] làm mất hiệu lực nguyên tắc không trạng thái. Một lưu ý cuối cùng về kịch bản bạn đang mô tả. Từ những gì tôi hiểu. Bạn phản đối rằng nếu người dùng đã tạo [giả mạo] mã thông báo hợp lệ [không được tạo bởi api] thì yêu cầu phải được xác thực chính xác và hợp lệ. Nếu đó là chính xác, tôi cảm thấy rằng giải pháp không an toàn của nó. Mã thông báo mà API không tạo có hợp lệ không?

Ahmed Abdel Razzak

Kiểm tra mô-đun góc này https. //github. com/sahat/satellizer Nó hoạt động với oauth và jwt. Kiểm tra các ví dụ [và cấu hình] sẽ cho bạn ý tưởng

Ahmed Abdel Razzak

Kiểm tra mô-đun góc này https. //github. com/sahat/satellizer Nó hoạt động với oauth và jwt. Kiểm tra các ví dụ [và cấu hình] sẽ cho bạn ý tưởng

Ahmed Abdel Razzak

Thật tệ là tôi không thích php. Và chắc chắn sẽ kiểm tra xem jwt-ruby có thực hiện các tính năng tương tự hay không

Ahmed Abdel Razzak

Thật tệ là tôi không thích php. Và chắc chắn sẽ kiểm tra xem jwt-ruby có thực hiện các tính năng tương tự hay không

Florian Zemke

Tôi đã xây dựng một dự án soạn sẵn dành cho người mới bắt đầu với tính năng xác thực dựa trên mã thông báo có Laravel 5 làm API RESTful phía sau và AngularJS ở phía trước. Đó là nền tảng tốt để xây dựng bất cứ thứ gì bạn thích với Laravel và AngularJS. Tôi hy vọng nó sẽ giúp một số bạn bắt đầu nhanh hơn. https. //github. com/Zemke/starter-laravel-angular/

Florian Zemke

Tôi đã xây dựng một dự án soạn sẵn dành cho người mới bắt đầu với tính năng xác thực dựa trên mã thông báo có Laravel 5 làm API RESTful phía sau và AngularJS ở phía trước. Đó là nền tảng tốt để xây dựng bất cứ thứ gì bạn thích với Laravel và AngularJS. Tôi hy vọng nó sẽ giúp một số bạn bắt đầu nhanh hơn. https. //github. com/Zemke/starter-laravel-angular/

Florian Zemke

Này, tôi đã xây dựng một dự án soạn sẵn dành cho người mới bắt đầu với xác thực dựa trên mã thông báo bằng cách sử dụng bộ nhớ cục bộ có Laravel 5 làm API RESTful phía sau và AngularJS ở phía trước. Đó là nền tảng tốt để xây dựng bất cứ thứ gì bạn thích với Laravel và AngularJS. Tôi hy vọng nó sẽ giúp một số bạn bắt đầu nhanh hơn. https. //github. com/Zemke/starter-laravel-angular/

Florian Zemke

Này, tôi đã xây dựng một dự án soạn sẵn dành cho người mới bắt đầu với xác thực dựa trên mã thông báo bằng cách sử dụng bộ nhớ cục bộ có Laravel 5 làm API RESTful phía sau và AngularJS ở phía trước. Đó là nền tảng tốt để xây dựng bất cứ thứ gì bạn thích với Laravel và AngularJS. Tôi hy vọng nó sẽ giúp một số bạn bắt đầu nhanh hơn. https. //github. com/Zemke/starter-laravel-angular/

Porfirio Chavez

Hãy để tôi hiểu điều này. bạn tạo BackEnd để tạo chế độ xem, để yêu cầu một API đang hoạt động trong cùng một BackEnd. Điều này đã được thử nghiệm trên thực tế ? . CORS và CSRF vì đăng bài khiến nó đau đầu,

Porfirio Chavez

Hãy để tôi hiểu điều này. bạn tạo BackEnd để tạo chế độ xem, để yêu cầu một API đang hoạt động trong cùng một BackEnd. Điều này đã được thử nghiệm trên thực tế ? . CORS và CSRF vì đăng bài khiến nó đau đầu,

Andy Roddam

bài viết tuyệt vời. Tôi chỉ tự hỏi, nếu tất cả xác thực của tôi hiện đang sử dụng mã thông báo JWT, điều này có nghĩa là chúng tôi không cần Laravel để tạo XSRF-TOKEN và laravel_session cho mỗi phản hồi cho giao diện người dùng? . ]

Andy Roddam

bài viết tuyệt vời. Tôi chỉ tự hỏi, nếu tất cả xác thực của tôi hiện đang sử dụng mã thông báo JWT, điều này có nghĩa là chúng tôi không cần Laravel để tạo XSRF-TOKEN và laravel_session cho mỗi phản hồi cho giao diện người dùng? . ]

Realeyez

Cảm ơn vì bài viết rất chi tiết về một trong những loại khoai tây hot nhất trong những năm sắp tới. ;] Mặc dù có một điều trong tâm trí tôi [trong số nhiều lo ngại của tôi khi sử dụng phương pháp này], bộ nhớ cục bộ có thực sự an toàn không? . Mã thông báo này về cơ bản không giống như để chìa khóa nhà bạn dưới thảm và hy vọng không ai bận tâm kiểm tra nó ở dưới đó?

Realeyez

Cảm ơn vì bài viết rất chi tiết về một trong những loại khoai tây hot nhất trong những năm sắp tới. ;] Mặc dù có một điều trong tâm trí tôi [trong số nhiều lo ngại của tôi khi sử dụng phương pháp này], bộ nhớ cục bộ có thực sự an toàn không? . Mã thông báo này về cơ bản không giống như để chìa khóa nhà bạn dưới thảm và hy vọng không ai bận tâm kiểm tra nó ở dưới đó?

Johaness

nó quá phức tạp để sử dụng thực tế. thử tốt

Johaness

nó quá phức tạp để sử dụng thực tế. thử tốt

Stivenson Rincón Mora

Chắc chắn. Không có công việc cho tôi. Cors nó là một vấn đề. Trong. /app/Http/Middleware/Cors. php Tôi có $response = $next[$request]; . php đã bảo vệ $middleware = [ 'Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode', 'Illuminate\Cookie\Middleware\EncryptCookies', 'Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse', 'Illuminate\Session\Middleware\StartSession', ' . get['/prueba', ['before' => 'jwt-auth', function [] { //$token = JWTAuth. Nhận được mã thông báo[]; . toUser[$token];

Stivenson Rincón Mora

Chắc chắn. Không có công việc cho tôi. Cors nó là một vấn đề. Trong. /app/Http/Middleware/Cors. php Tôi có $response = $next[$request]; . php đã bảo vệ $middleware = [ 'Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode', 'Illuminate\Cookie\Middleware\EncryptCookies', 'Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse', 'Illuminate\Session\Middleware\StartSession', ' . get['/prueba', ['before' => 'jwt-auth', function [] { //$token = JWTAuth. Nhận được mã thông báo[]; . toUser[$token];

Stivenson Rincón Mora

Và tôi có ba ngày trong này. Điều gì đang xảy ra?

Stivenson Rincón Mora

Và tôi có ba ngày trong này. Điều gì đang xảy ra?

César Fernandes

Bài báo tuyệt vời. Một điều nữa thôi. Tôi đã tải xuống mã của bạn và nó đang chạy ở đây gần như ổn 100%. Điểm duy nhất tôi nghi ngờ là kiểm tra. Tôi phải nhấp 3 lần trở lên để lấy nó từ khu vực hạn chế. nó giống như mã thông báo vẫn tồn tại sau lần nhấp đầu tiên. Bạn có bất cứ ý tưởng về những gì có thể gây ra điều này?

César Fernandes

Bài báo tuyệt vời. Một điều nữa thôi. Tôi đã tải xuống mã của bạn và nó đang chạy ở đây gần như ổn 100%. Điểm duy nhất tôi nghi ngờ là kiểm tra. Tôi phải nhấp 3 lần trở lên để lấy nó từ khu vực hạn chế. nó giống như mã thông báo vẫn tồn tại sau lần nhấp đầu tiên. Bạn có bất cứ ý tưởng về những gì có thể gây ra điều này?

César Fernandes

Chỉ cho bạn biêt thôi. có vấn đề với ngStorage trong dự án github. tôi đã thay thế nó bằng phiên bản này https. //github. com/raynode/ngStorage/blob/master/ngStorage. 27. js và bây giờ nó ổn

César Fernandes

Chỉ cho bạn biêt thôi. có vấn đề với ngStorage trong dự án github. tôi đã thay thế nó bằng phiên bản này https. //github. com/raynode/ngStorage/blob/master/ngStorage. 27. js và bây giờ nó ổn

Giovanni

Bài đăng hay. Tại env cục bộ của tôi, tôi gặp lỗi "Không thể phân tích cú pháp mã thông báo từ yêu cầu" và tôi không biết mình có thể làm gì

Giovanni

Bài đăng hay. Tại env cục bộ của tôi, tôi gặp lỗi "Không thể phân tích cú pháp mã thông báo từ yêu cầu" và tôi không biết mình có thể làm gì

Giovanni

Xin lỗi noob của tôi, bài đăng này giải quyết vấn đề của tôi. http. // stackoverflow. com/câu hỏi/20853604/laravel-get-request-headers

Giovanni

Xin lỗi noob của tôi, bài đăng này giải quyết vấn đề của tôi. http. // stackoverflow. com/câu hỏi/20853604/laravel-get-request-headers

Sami

Tôi thứ hai rằng, có ai biết hướng dẫn/ví dụ về bộ lưu trữ phía máy khách JWT an toàn, sẵn sàng sản xuất không?

Sami

Tôi thứ hai rằng, có ai biết hướng dẫn/ví dụ về bộ lưu trữ phía máy khách JWT an toàn, sẵn sàng sản xuất không?

Matheus Schettino

Tino, phải nói là 10 ngày qua mình nghiên cứu về jwt token mà chưa thấy bài nào như của bạn. Đó là một tâm trí to lớn thổi bay và giảm bớt rất nhiều sự phức tạp trong tâm trí tôi. Cảm ơn rất nhiều. Chỉ có một vài điều tôi muốn biết rõ hơn. 1] API tôi đang làm việc chấp nhận CORS. Nhưng không có hạn chế. Thêm laravel cors bạn đang sử dụng này, liệu tôi có thể hạn chế các tên miền mà tôi muốn cấp quyền truy cập không? . Làm thế nào tôi có thể kết hợp tất cả những thứ đó lại với nhau, bạn đề xuất phương pháp nào? . Hy vọng bạn nhìn thấy tin nhắn của tôi

Matheus Schettino

Tino, phải nói là 10 ngày qua mình nghiên cứu về jwt token mà chưa thấy bài nào như của bạn. Đó là một tâm trí to lớn thổi bay và giảm bớt rất nhiều sự phức tạp trong tâm trí tôi. Cảm ơn rất nhiều. Chỉ có một vài điều tôi muốn biết rõ hơn. 1] API tôi đang làm việc chấp nhận CORS. Nhưng không có hạn chế. Thêm laravel cors bạn đang sử dụng này, liệu tôi có thể hạn chế các tên miền mà tôi muốn cấp quyền truy cập không? . Làm thế nào tôi có thể kết hợp tất cả những thứ đó lại với nhau, bạn đề xuất phương pháp nào? . Hy vọng bạn nhìn thấy tin nhắn của tôi

Đánh dấu Bucknell

Làm mới mã thông báo thì sao?

Đánh dấu Bucknell

Làm mới mã thông báo thì sao?

SamMonk

Đối với laravel 5 bạn sẽ sử dụng. nhà cung cấp thủ công php. xuất bản --provider="Tymon\JWTAuth\Providers\JWTAuthServiceProvider"

SamMonk

Đối với laravel 5 bạn sẽ sử dụng. nhà cung cấp thủ công php. xuất bản --provider="Tymon\JWTAuth\Providers\JWTAuthServiceProvider"

Moin Ahmed

Có một vấn đề về khả năng tương tác của việc thực hiện này với khác. Trong tệp Namshi/JOSE/Signer/HMAC. php dòng 15 nên được thay thế bằng dòng sau để làm cho nó tương thích trên tất cả các triển khai của JWT. trả về hash_hmac[$this->getHashingAlgorithm[], $input, $key, true];

Moin Ahmed

Có một vấn đề về khả năng tương tác của việc thực hiện này với khác. Trong tệp Namshi/JOSE/Signer/HMAC. php dòng 15 nên được thay thế bằng dòng sau để làm cho nó tương thích trên tất cả các triển khai của JWT. trả về hash_hmac[$this->getHashingAlgorithm[], $input, $key, true];

Sean Tymon

Điều này đã được sửa vài tuần trước, xem - https. //github. com/tymondesigns/jwt-auth/pull/126

Sean Tymon

Điều này đã được sửa vài tuần trước, xem - https. //github. com/tymondesigns/jwt-auth/pull/126

Moin Ahmed

Tôi đã cài đặt 0. 5. 3 vài ngày trở lại và nó vẫn có vấn đề;

Moin Ahmed

Tôi đã cài đặt 0. 5. 3 vài ngày trở lại và nó vẫn có vấn đề;

Moin Ahmed

Làm thế nào chúng ta có thể sử dụng nó để có được JWE?

Moin Ahmed

Làm thế nào chúng ta có thể sử dụng nó để có được JWE?

Sean Tymon

vâng bạn nói đúng, nó đã được kéo dài trên chủ. 0. 5. 4 sẽ khắc phục

Sean Tymon

vâng bạn nói đúng, nó đã được kéo dài trên chủ. 0. 5. 4 sẽ khắc phục

Zakaria Dbani

Cảm ơn Tino rất nhiều vì hướng dẫn tuyệt vời, tất cả đều hoạt động như một bùa mê. sau đó, khi tôi muốn sử dụng [ionic], tôi nghĩ rằng thiết bị chặn không làm gì tôi nhận được. mã trạng thái. 403 bị cấm. Ai đó làm ơn giúp tôi với. ]

Zakaria Dbani

Cảm ơn Tino rất nhiều vì hướng dẫn tuyệt vời, tất cả đều hoạt động như một bùa mê. sau đó, khi tôi muốn sử dụng [ionic], tôi nghĩ rằng thiết bị chặn không làm gì tôi nhận được. mã trạng thái. 403 bị cấm. Ai đó làm ơn giúp tôi với. ]

Konstantin

Mỗi lần đăng nhập, tôi nhận được mã thông báo JWT mới, tuy nhiên, chức năng nói chuyện cũ của tôi vẫn hoạt động khi tôi gửi yêu cầu. Có cách nào dễ dàng để đăng xuất JWT mà không cần lưu trữ nó trong bảng người dùng không?

Konstantin

Mỗi lần đăng nhập, tôi nhận được mã thông báo JWT mới, tuy nhiên, chức năng nói chuyện cũ của tôi vẫn hoạt động khi tôi gửi yêu cầu. Có cách nào dễ dàng để đăng xuất JWT mà không cần lưu trữ nó trong bảng người dùng không?

Bernardino Guerrero

Xin chào, tôi đã triển khai proyect của mình [RESTful API] sử dụng JWT, trong một giọt đại dương kỹ thuật số, nhưng tôi gặp lỗi. "Không tìm thấy cột. 1054 Cột 'query_string' không xác định trong 'mệnh đề where'" khi tôi cố gắng gọi điểm cuối signIn. signUp hoạt động tốt và tôi có thể truy xuất mã thông báo. Doplet là một LEMP, bất kỳ trợ giúp nào. cảm ơn

Bernardino Guerrero

Xin chào, tôi đã triển khai proyect của mình [RESTful API] sử dụng JWT, trong một giọt đại dương kỹ thuật số, nhưng tôi gặp lỗi. "Không tìm thấy cột. 1054 Cột 'query_string' không xác định trong 'mệnh đề where'" khi tôi cố gắng gọi điểm cuối signIn. signUp hoạt động tốt và tôi có thể truy xuất mã thông báo. Doplet là một LEMP, bất kỳ trợ giúp nào. cảm ơn

zlz

tôi đang gặp lỗi 500 máy chủ nội bộ khi truy cập vào khu vực hạn chế. JWTException. mã thông báo là bắt buộc. như tôi đã hiểu, mã thông báo được gửi trong tiêu đề được yêu cầu. làm ơn giúp gì được không?

zlz

tôi đang gặp lỗi 500 máy chủ nội bộ khi truy cập vào khu vực hạn chế. JWTException. mã thông báo là bắt buộc. như tôi đã hiểu, mã thông báo được gửi trong tiêu đề được yêu cầu. làm ơn giúp gì được không?

ljiang510

Thật khó khăn cho một ứng dụng gốc sử dụng xác thực dựa trên phiên. Bạn phải yêu cầu người dùng đăng nhập mỗi khi họ muốn sử dụng ứng dụng của bạn

ljiang510

Thật khó khăn cho một ứng dụng gốc sử dụng xác thực dựa trên phiên. Bạn phải yêu cầu người dùng đăng nhập mỗi khi họ muốn sử dụng ứng dụng của bạn

Neri Junior

Sử dụng tuyến nghệ nhân php. danh sách tôi nhận được "Mã thông báo không thể được phân tích cú pháp từ yêu cầu" Tôi đang làm gì đó sai?

Neri Junior

Sử dụng tuyến nghệ nhân php. danh sách tôi nhận được "Mã thông báo không thể được phân tích cú pháp từ yêu cầu" Tôi đang làm gì đó sai?

Moin Ahmed

Tôi muốn đưa một vài yêu cầu tùy chỉnh vào jwt của mình, vui lòng giới thiệu cho tôi các tùy chọn

Moin Ahmed

Tôi muốn đưa một vài yêu cầu tùy chỉnh vào jwt của mình, vui lòng giới thiệu cho tôi các tùy chọn

Moin Ahmed

Đừng bận tâm. tôi tự tìm ra. Bạn đã làm rất tốt

Moin Ahmed

Đừng bận tâm. tôi tự tìm ra. Bạn đã làm rất tốt

Moin Ahmed

Bất kỳ cập nhật về điều này?

Moin Ahmed

Bất kỳ cập nhật về điều này?

Peciorin

Chúc mừng bài viết. Các bạn có thể xem tại đây [http. // stackoverflow. com/questions/32163724/angularjs-and-slim-framework-jwt-authentication-and-token-refresh-flow] và cho biết liệu có vấn đề gì xảy ra với luồng xác thực của tôi không?

Peciorin

Chúc mừng bài viết. Các bạn có thể xem tại đây [http. // stackoverflow. com/questions/32163724/angularjs-and-slim-framework-jwt-authentication-and-token-refresh-flow] và cho biết liệu có vấn đề gì xảy ra với luồng xác thực của tôi không?

Emoh

Nó hoạt động tốt khi máy khách được lưu trữ trên cùng một tên miền. Nhưng khi được lưu trữ trên tên miền khác, nó sẽ báo lỗi sau. XMLHttpRequest không thể tải http. //thí dụ. com/api. Tiêu đề 'Kiểm soát truy cập-Cho phép-Xuất xứ' chứa nhiều giá trị 'http. //localhost, *', nhưng chỉ cho phép một cái. Xuất xứ 'http. Do đó, // localhost' không phải là Cách khắc phục sự cố này được lưu trữ trên IIS 8. Thông tin chi tiết. https. //github. com/barryvdh/laravel-cors/issues/63 Vấn đề tương tự được giải thích tại đây. http. //www. ngroutes. com/câu hỏi/AUy0YjmHJGEimGEpEt7Z/how-do-i-erase-one-access-control-allow-origin-from-my-headers-in-laravel-4. html http. // stackoverflow. com/câu hỏi/28596694/how-do-i-erase-one-access-control-allow-origin-from-my-headers-in-laravel-4

Emoh

Nó hoạt động tốt khi máy khách được lưu trữ trên cùng một tên miền. Nhưng khi được lưu trữ trên tên miền khác, nó sẽ báo lỗi sau. XMLHttpRequest không thể tải http. //thí dụ. com/api. Tiêu đề 'Kiểm soát truy cập-Cho phép-Xuất xứ' chứa nhiều giá trị 'http. //localhost, *', nhưng chỉ cho phép một cái. Xuất xứ 'http. Do đó, // localhost' không phải là Cách khắc phục sự cố này được lưu trữ trên IIS 8. Thông tin chi tiết. https. //github. com/barryvdh/laravel-cors/issues/63 Vấn đề tương tự được giải thích tại đây. http. //www. ngroutes. com/câu hỏi/AUy0YjmHJGEimGEpEt7Z/how-do-i-erase-one-access-control-allow-origin-from-my-headers-in-laravel-4. html http. // stackoverflow. com/câu hỏi/28596694/how-do-i-erase-one-access-control-allow-origin-from-my-headers-in-laravel-4

răng cưa

Tôi xem qua video này giải thích những điều cơ bản về JWT tại đây. https. //www. youtube. com/watch?v=oXxbB5kv9OA

răng cưa

Tôi xem qua video này giải thích những điều cơ bản về JWT tại đây. https. //www. youtube. com/watch?v=oXxbB5kv9OA

Omar Jebari

Mã ví dụ bạn đưa ra còn thiếu khá nhiều thứ. Đi đến bản demo đã giúp lấy được tất cả mã giao diện người dùng. Ngoài ra, rất quan trọng, sau khi được xác thực, tôi không thể làm cho /restricted route hoạt động cho đến khi tôi thêm phần sau vào. htaccess, vì tiêu đề Ủy quyền đã bị loại bỏ [có lẽ là do apache]. RewriteRule ^ - [E=HTTP_AUTHORIZATION. %{HTTP. Ủy quyền}]

Omar Jebari

Mã ví dụ bạn đưa ra còn thiếu khá nhiều thứ. Đi đến bản demo đã giúp lấy được tất cả mã giao diện người dùng. Ngoài ra, rất quan trọng, sau khi được xác thực, tôi không thể làm cho /restricted route hoạt động cho đến khi tôi thêm phần sau vào. htaccess, vì tiêu đề Ủy quyền đã bị loại bỏ [có lẽ là do apache]. RewriteRule ^ - [E=HTTP_AUTHORIZATION. %{HTTP. Ủy quyền}]

Aaron Xám

mảnh rất đẹp. Tôi muốn chỉ ra rằng việc lưu trữ mã thông báo trong localStorage hoặc sessionStorage dễ bị tấn công XSS và dữ liệu có thể được xem bằng tập lệnh trên trang - vì vậy nếu bạn có tập lệnh bị xâm nhập được cung cấp từ CDN hoặc nếu có mã độc trong một . Đọc thêm tại đây. https. //đường bão. com/blog/where-to-store-your-jwts-cookies-vs-html5-web-storage/ Tôi nghĩ một cách tiếp cận an toàn hơn sẽ là lưu trữ mã thông báo JWT + CSRF trong cookie, sau đó đặt JWT đã tính toán của bạn với

Aaron Xám

mảnh rất đẹp. Tôi muốn chỉ ra rằng việc lưu trữ mã thông báo trong localStorage hoặc sessionStorage dễ bị tấn công XSS và dữ liệu có thể được xem bằng tập lệnh trên trang - vì vậy nếu bạn có tập lệnh bị xâm nhập được cung cấp từ CDN hoặc nếu có mã độc trong một . Đọc thêm tại đây. https. //đường bão. com/blog/where-to-store-your-jwts-cookies-vs-html5-web-storage/ Tôi nghĩ một cách tiếp cận an toàn hơn sẽ là lưu trữ mã thông báo JWT + CSRF trong cookie, sau đó đặt JWT đã tính toán của bạn với

Roberto Cárdenas

Xin chào, tôi đang làm việc với Doctrine nên người dùng mô hình của tôi không phải là mô hình Eloquent. Tôi có cần chuyển mô hình của mình sang mô hình Eloquent hay có cách nào để sử dụng mô hình học thuyết của tôi với JWT không?

Roberto Cárdenas

Xin chào, tôi đang làm việc với Doctrine nên người dùng mô hình của tôi không phải là mô hình Eloquent. Tôi có cần chuyển mô hình của mình sang mô hình Eloquent hay có cách nào để sử dụng mô hình học thuyết của tôi với JWT không?

Saqueib

Nó tốt cho SPA nhưng phần API tôi không chắc cách quản lý mã thông báo hết hạn trên ứng dụng dành cho thiết bị di động. Trường hợp chúng tôi chỉ yêu cầu người dùng đăng nhập một lần khi khởi chạy ứng dụng lần đầu tiên. Nếu người dùng mở lại ứng dụng di động đủ lâu, mã thông báo sẽ hết hạn và họ sẽ được yêu cầu đăng nhập lại. Làm thế nào chúng ta có thể giải quyết vấn đề này, thật không tốt khi yêu cầu người dùng đăng nhập lại. Mọi người có suy nghĩ gì không

Saqueib

Nó tốt cho SPA nhưng phần API tôi không chắc cách quản lý mã thông báo hết hạn trên ứng dụng dành cho thiết bị di động. Trường hợp chúng tôi chỉ yêu cầu người dùng đăng nhập một lần khi khởi chạy ứng dụng lần đầu tiên. Nếu người dùng mở lại ứng dụng di động đủ lâu, mã thông báo sẽ hết hạn và họ sẽ được yêu cầu đăng nhập lại. Làm thế nào chúng ta có thể giải quyết vấn đề này, thật không tốt khi yêu cầu người dùng đăng nhập lại. Mọi người có suy nghĩ gì không

biệt danh

Tôi đang cố gắng thực hiện các bước của bạn nhưng cho dù tôi có cố gắng bao nhiêu thì tôi vẫn nhận được. [Symfony\Component\Debug\Exception\FatalErrorException] Không tìm thấy lớp 'Barryvdh\Cors\CorsServiceProvider' Tôi đang sử dụng Laravel 5

biệt danh

Tôi đang cố gắng thực hiện các bước của bạn nhưng cho dù tôi có cố gắng bao nhiêu thì tôi vẫn nhận được. [Symfony\Component\Debug\Exception\FatalErrorException] Không tìm thấy lớp 'Barryvdh\Cors\CorsServiceProvider' Tôi đang sử dụng Laravel 5

Mike

Có ai có bất kỳ gợi ý nào về ủy quyền cấp ứng dụng khách không? . Quan trọng hơn, nếu mã thông báo truy cập của ai đó bị xâm phạm, bên thứ ba có thể sử dụng mã đó để truy cập dữ liệu người dùng và có khả năng làm mới mã thông báo để khóa hoàn toàn người dùng thực. Điều này có thể tránh được nếu chúng tôi có thể chứng minh rằng mã thông báo đang được gửi bởi ứng dụng khách được ủy quyền nhưng làm cách nào chúng tôi có thể thực hiện điều đó nếu không có khóa bí mật?

Mike

Có ai có bất kỳ gợi ý nào về ủy quyền cấp ứng dụng khách không? . Quan trọng hơn, nếu mã thông báo truy cập của ai đó bị xâm phạm, bên thứ ba có thể sử dụng mã đó để truy cập dữ liệu người dùng và có khả năng làm mới mã thông báo để khóa hoàn toàn người dùng thực. Điều này có thể tránh được nếu chúng tôi có thể chứng minh rằng mã thông báo đang được gửi bởi ứng dụng khách được ủy quyền nhưng làm cách nào chúng tôi có thể thực hiện điều đó nếu không có khóa bí mật?

Chris

Tôi cũng muốn thêm vào điều này. Nếu tôi có hệ thống quản lý người dùng và người dùng đã đăng nhập và nhận lại mã thông báo, điều gì sẽ ngăn người dùng thực hiện giải mã base64 trên tải trọng, sau đó thao tác dữ liệu, mã hóa và sử dụng mã thông báo mới?

Chris

Tôi cũng muốn thêm vào điều này. Nếu tôi có hệ thống quản lý người dùng và người dùng đã đăng nhập và nhận lại mã thông báo, điều gì sẽ ngăn người dùng thực hiện giải mã base64 trên tải trọng, sau đó thao tác dữ liệu, mã hóa và sử dụng mã thông báo mới?

Mike

Trong trường hợp này, việc xác thực chữ ký sẽ không thành công nên bạn sẽ ổn thôi. Điều tôi không hiểu là làm thế nào để ngăn chặn bất kỳ người pha trò nào nhận được mã thông báo ngay từ đầu

Mike

Trong trường hợp này, việc xác thực chữ ký sẽ không thành công nên bạn sẽ ổn thôi. Điều tôi không hiểu là làm thế nào để ngăn chặn bất kỳ người pha trò nào nhận được mã thông báo ngay từ đầu

Lasha Kakhidze

bài đăng tuyệt vời, cảm ơn

Lasha Kakhidze

bài đăng tuyệt vời, cảm ơn

Pavel

Khi đăng ký người dùng, bạn nên băm mật khẩu, nếu không đăng nhập sẽ không hoạt động, tôi đã dành hàng giờ để tìm lý do tại sao việc xác thực không thành công

Pavel

Khi đăng ký người dùng, bạn nên băm mật khẩu, nếu không đăng nhập sẽ không hoạt động, tôi đã dành hàng giờ để tìm lý do tại sao việc xác thực không thành công

DJ

Điều gì sẽ xảy ra nếu ai đó chặn thông tin đăng nhập, người dùng và mật khẩu?

DJ

Điều gì sẽ xảy ra nếu ai đó chặn thông tin đăng nhập, người dùng và mật khẩu?

Keyner TYC

Không có công việc cho tôi. Tôi đã thêm RewriteEngine vào RewriteCond %{HTTP. Ủy quyền} ^[. *] Quy tắc viết lại. * - [e=HTTP_AUTHORIZATION. %1] Và không có việc gì. Tôi đang sử dụng Laravel 5. 0 , hãy giúp tôi. Thanks

Keyner TYC

Không có công việc cho tôi. Tôi đã thêm RewriteEngine vào RewriteCond %{HTTP. Ủy quyền} ^[. *] Quy tắc viết lại. * - [e=HTTP_AUTHORIZATION. %1] Và không có việc gì. Tôi đang sử dụng Laravel 5. 0 , hãy giúp tôi. Thanks

MURATSPLAT

Bài báo tuyệt vời, cảm ơn

MURATSPLAT

Bài báo tuyệt vời, cảm ơn

Vivek Soni

bạn cần gửi "Ủy quyền" -> "Người mang YOUR_TOKEN_HERE" làm cặp giá trị khóa trong tiêu đề

Vivek Soni

bạn cần gửi "Ủy quyền" -> "Người mang YOUR_TOKEN_HERE" làm cặp giá trị khóa trong tiêu đề

Deric Lima

Cảm ơn bạn đã nhận xét Omar, tôi đã dành hàng giờ cố gắng tìm ra vấn đề mà tôi gặp phải. Bởi vì tôi đã cố gửi mã thông báo qua Tiêu đề ủy quyền nhưng Laravel không đọc mã thông báo. Tôi đã đặt quy tắc này vào. htaccess và giải quyết. Cảm ơn nhiều//

Deric Lima

Cảm ơn bạn đã nhận xét Omar, tôi đã dành hàng giờ cố gắng tìm ra vấn đề mà tôi gặp phải. Bởi vì tôi đã cố gửi mã thông báo qua Tiêu đề ủy quyền nhưng Laravel không đọc mã thông báo. Tôi đã đặt quy tắc này vào. htaccess và giải quyết. Cảm ơn nhiều//

Barbaros Kurt

imho, khi người dùng đăng xuất, bạn đặt mã thông báo vào máy chủ redis dưới dạng danh sách đen và khi xác thực bằng cùng một mã thông báo ở phía máy chủ, trước tiên bạn kiểm tra xem nó có nằm trong danh sách đen hay không. nếu danh sách đen gửi 401 khác không có vấn đề gì. nếu người dùng bị mất mã thông báo buộc phải đăng xuất thì mã thông báo sẽ nằm trong danh sách đen [nếu bạn lưu trữ chúng trong db]

Barbaros Kurt

imho, khi người dùng đăng xuất, bạn đặt mã thông báo vào máy chủ redis dưới dạng danh sách đen và khi xác thực bằng cùng một mã thông báo ở phía máy chủ, trước tiên bạn kiểm tra xem nó có nằm trong danh sách đen hay không. nếu danh sách đen gửi 401 khác không có vấn đề gì. nếu người dùng bị mất mã thông báo buộc phải đăng xuất thì mã thông báo sẽ nằm trong danh sách đen [nếu bạn lưu trữ chúng trong db]

Bruno Santana

Xin chào, tôi đang gặp vấn đề tương tự. Tôi đang cố gắng sử dụng phiên bản mới nhất của laravel-cors [phiên bản 7 hoặc đại loại như thế này]

Bruno Santana

Xin chào, tôi đang gặp vấn đề tương tự. Tôi đang cố gắng sử dụng phiên bản mới nhất của laravel-cors [phiên bản 7 hoặc đại loại như thế này]

Bruno Santana

tôi nghĩ rằng tôi đã làm nó. thay vì nhà soạn nhạc yêu cầu barryvdh/laravel-cors 0. 4. x@dev, sử dụng trình soạn thảo yêu cầu barryvdh/laravel-cors 0. 7. x [phiên bản hiện tại khi tôi viết nhận xét này]; . php, hãy sử dụng Barryvdh\Cors\ServiceProvider thay vì hướng dẫn, trong Kernel. php, hãy sử dụng \Barryvdh\Cors\HandleCors mà không có "phần mềm trung gian"

Bruno Santana

tôi nghĩ rằng tôi đã làm nó. thay vì nhà soạn nhạc yêu cầu barryvdh/laravel-cors 0. 4. x@dev, sử dụng trình soạn thảo yêu cầu barryvdh/laravel-cors 0. 7. x [phiên bản hiện tại khi tôi viết nhận xét này]; . php, hãy sử dụng Barryvdh\Cors\ServiceProvider thay vì hướng dẫn, trong Kernel. php, hãy sử dụng \Barryvdh\Cors\HandleCors mà không có "phần mềm trung gian"

Greg

Tôi không chắc mình hiểu phần chữ ký. Để HMAC bạn cần một chìa khóa. Bởi vì bạn đã nói rằng "khóa bí mật của chữ ký do máy chủ nắm giữ", tôi có xu hướng cho rằng chúng tôi có khóa chung, điều này là sai, vì HMAC không phải là khóa công khai mà là khóa chung. Vì vậy, đó là cùng một khóa mà máy chủ biết và máy khách cần biết. Nếu máy khách là một SPA trong PHP, thì khóa [bất kỳ chuỗi nào] sẽ không hiển thị, điều này thuận tiện. Nếu tất cả ứng dụng khách được mã hóa bằng JavaScript, điều gì sẽ xảy ra với khóa? . Bí mật được chia sẻ là một thuật toán được chia sẻ tạo ra thứ chỉ có thể là chuỗi được chia sẻ được tạo. Tôi thấy không có ích gì khi làm điều đó khi bí mật được chia sẻ là "ẩn". Tại thời điểm này, người ta có thể chỉ cần đặt session_id làm bí mật chung [được đề xuất bởi một số người]

Greg

Tôi không chắc mình hiểu phần chữ ký. Để HMAC bạn cần một chìa khóa. Bởi vì bạn đã nói rằng "khóa bí mật của chữ ký do máy chủ nắm giữ", tôi có xu hướng cho rằng chúng tôi có khóa chung, điều này là sai, vì HMAC không phải là khóa công khai mà là khóa chung. Vì vậy, đó là cùng một khóa mà máy chủ biết và máy khách cần biết. Nếu máy khách là một SPA trong PHP, thì khóa [bất kỳ chuỗi nào] sẽ không hiển thị, điều này thuận tiện. Nếu tất cả ứng dụng khách được mã hóa bằng JavaScript, điều gì sẽ xảy ra với khóa? . Bí mật được chia sẻ là một thuật toán được chia sẻ tạo ra thứ chỉ có thể là chuỗi được chia sẻ được tạo. Tôi thấy không có ích gì khi làm điều đó khi bí mật được chia sẻ là "ẩn". Tại thời điểm này, người ta có thể chỉ cần đặt session_id làm bí mật chung [được đề xuất bởi một số người]

Ka Yuk LEE

JWT được tạo bởi máy chủ xác thực và khóa bí mật chữ ký được chia sẻ giữa các máy chủ API. JWT được cho là không rõ ràng đối với khách hàng

Ka Yuk LEE

JWT được tạo bởi máy chủ xác thực và khóa bí mật chữ ký được chia sẻ giữa các máy chủ API. JWT được cho là không rõ ràng đối với khách hàng

mlops

Kinh ngạc. cảm ơn. Tôi đã suy nghĩ về cách gửi một số id tới trình duyệt [di động] qua phiên hoặc cookie [điều gì là tốt nhất?] và cùng một bản ghi id trong cơ sở dữ liệu. Khi người dùng nhập kiểm tra id nếu nó giống nhau trong db hiển thị giỏ hàng nếu không thì về nhà. Tất cả điều này mà không cần đăng nhập mẫu. Ngay khi nhập vào trang web

mlops

Kinh ngạc. cảm ơn. Tôi đã suy nghĩ về cách gửi một số id tới trình duyệt [di động] qua phiên hoặc cookie [điều gì là tốt nhất?] và cùng một bản ghi id trong cơ sở dữ liệu. Khi người dùng nhập kiểm tra id nếu nó giống nhau trong db hiển thị giỏ hàng nếu không thì về nhà. Tất cả điều này mà không cần đăng nhập mẫu. Ngay khi nhập vào trang web

Khan mỏng

khi đăng ký và sau khi thành công thay vì trả lại mã thông báo trong JSON, nó chuyển hướng tôi đến /

Khan mỏng

khi đăng ký và sau khi thành công thay vì trả lại mã thông báo trong JSON, nó chuyển hướng tôi đến /

Gopal G

Đọc mô tả trên github, nó nói - "Ứng dụng này không được sử dụng trong môi trường Sản xuất. Đó là một ví dụ rất cơ bản, thiếu bất kỳ loại xác thực đầu vào nào, xử lý mã thông báo đã hết hạn, dự phòng bộ nhớ cục bộ thành cookie hoặc bất kỳ bộ nhớ nào khác. " Điều này có thể hữu ích - https. //đường bão. com/blog/build-secure-user-interfaces-using-jwts/

Gopal G

Đọc mô tả trên github, nó nói - "Ứng dụng này không được sử dụng trong môi trường Sản xuất. Đó là một ví dụ rất cơ bản, thiếu bất kỳ loại xác thực đầu vào nào, xử lý mã thông báo đã hết hạn, dự phòng bộ nhớ cục bộ thành cookie hoặc bất kỳ bộ nhớ nào khác. " Điều này có thể hữu ích - https. //đường bão. com/blog/build-secure-user-interfaces-using-jwts/

Tiago Matos

Mẹo hay như vậy. Bạn có thể cung cấp thêm?. D Tôi đang sử dụng Laravel để sử dụng API từ một máy chủ khác. API này sử dụng JWT. Ứng dụng của tôi sử dụng Laravel + Guzzle để thực hiện yêu cầu http. Tôi có thể đưa ra yêu cầu và nhận JWT từ API. Sau đó, tôi cũng có thể đưa ra bất kỳ yêu cầu nào để lấy bất kỳ dữ liệu nào từ API. Tất cả đều tốt cho đến nay. Tuy nhiên, làm cách nào tôi có thể cấp cho người dùng quyền truy cập vào khu vực hạn chế? . Có thể không?

Tiago Matos

Mẹo hay như vậy. Bạn có thể cung cấp thêm?. D Tôi đang sử dụng Laravel để sử dụng API từ một máy chủ khác. API này sử dụng JWT. Ứng dụng của tôi sử dụng Laravel + Guzzle để thực hiện yêu cầu http. Tôi có thể đưa ra yêu cầu và nhận JWT từ API. Sau đó, tôi cũng có thể đưa ra bất kỳ yêu cầu nào để lấy bất kỳ dữ liệu nào từ API. Tất cả đều tốt cho đến nay. Tuy nhiên, làm cách nào tôi có thể cấp cho người dùng quyền truy cập vào khu vực hạn chế? . Có thể không?

Andy

Tôi đã triển khai đầy đủ một giải pháp tương tự như bài viết bằng cách sử dụng mã thông báo JWT. Tôi không chắc làm cách nào để ngăn Laravel tạo XSRF-TOKEN. Tôi có thể giảm kích thước gói tiêu đề nếu tôi có thể ngăn Laravel tạo mã thông báo XSRF. Bạn có bất kỳ kinh nghiệm với điều này?

Andy

Tôi đã triển khai đầy đủ một giải pháp tương tự như bài viết bằng cách sử dụng mã thông báo JWT. Tôi không chắc làm cách nào để ngăn Laravel tạo XSRF-TOKEN. Tôi có thể giảm kích thước gói tiêu đề nếu tôi có thể ngăn Laravel tạo mã thông báo XSRF. Bạn có bất kỳ kinh nghiệm với điều này?

LaraLara

Bạn đã quên băm mật khẩu khi đăng ký hay có gì đó không ổn với Người dùng của tôi. tạo nên ? . Đăng nhập hoạt động cho người dùng mà tôi đã tạo bằng Laravel, vì mật khẩu của họ được băm. Cuối cùng, nếu tôi thêm hàm băm vào đăng ký của bạn, thì cả đăng ký và đăng nhập đều hoạt động bình thường. $credentials['password'] = Hàm băm. make [$credentials['password']];

LaraLara

Bạn đã quên băm mật khẩu khi đăng ký hay có gì đó không ổn với Người dùng của tôi. tạo nên ? . Đăng nhập hoạt động cho người dùng mà tôi đã tạo bằng Laravel, vì mật khẩu của họ được băm. Cuối cùng, nếu tôi thêm hàm băm vào đăng ký của bạn, thì cả đăng ký và đăng nhập đều hoạt động bình thường. $credentials['password'] = Hàm băm. make [$credentials['password']];

MarcioCamello

$HTTP_RAW_POST_DATA, thats problem, disable in php. ini to always_populate_raw_post_data -1, and enable your CORS in laravel, withCredentials. true and test

MarcioCamello

$HTTP_RAW_POST_DATA, thats problem, disable in php. ini to always_populate_raw_post_data -1, and enable your CORS in laravel, withCredentials. true and test

R0bertinski

Great article, but it would be perfect if you showed the endpoints queries, params, etc,,, , I have a problem when I try to access to any restricted endpoint, because I want to send the TOKEN like a HEADER param, an it only works when I send it like a URL param, I can not understand. Cheers

R0bertinski

Great article, but it would be perfect if you showed the endpoints queries, params, etc,,, , I have a problem when I try to access to any restricted endpoint, because I want to send the TOKEN like a HEADER param, an it only works when I send it like a URL param, I can not understand. Cheers

Cliverson Batista

Hi, My header . Accept. application/json, text/plain, */* Accept-Language. pt-BR,pt;q=0. 8,en-US;q=0. 5,en;q=0. 3 Accept-Encoding. gzip, deflate Authorization. Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9. eyJzdWIiOjEsImlzcyI6Imh0dHA6XC9cL2xvY2FsaG9zdFwvand0MVwvcHVibGljXC9zaWdudXAiLCJpYXQiOjE0NjA1MTAzMzMsImV4cCI6MTQ2MDUxMzkzMywibmJmIjoxNDYwNTEwMzMzLCJqdGkiOiI0MjU0NDA1MDMzYzU1ODJhYThkZTQzM2RjOGQ1ZDkxOSJ9. xxAbUfWWDPiBEV6ObVG_xt-tDnwVR7mdHa7w-cLztN4 X-XSRF-TOKEN. eyJpdiI6IjJJdXV5WmdoY3ZnQ01TK3hoRHlaVUE9PSIsInZhbHVlIjoiVTlYVTBqQkxFV1VMVlRRYTROUDdPMU9iOFB6MmNsczZNNTNJMDRzZ01XbVc5RGgrOE8yS1pGNlU2XC9WbThMUVpLSm1VZFV0akFwK0F2V1FUYXh1VHpBPT0iLCJtYWMiOiIxOGJiYjZmZjA5NWMxYzM0MjVhMTZhNThjNTk5MGY4OGEwMTYyY2QwNDg5NjM1MDFlNGE2ZmZjMzNhZDc0Yzg2In0= Referer. http. //localhost/jwt/public/ Cookie. laravel_session=eyJpdiI6ImRrTmxHRE5oYzhWMG1OakxzMndyN3c9PSIsInZhbHVlIjoiRkxpRExFZjVvUlBNamN1UEFweTdURTNZa0RxMHM3K3pWeGJcL0xIdm1sNjdhTHZBeVgyd08zZUJUcDZXS080cHA1Q0o0RlRVVmFRdUtMeGlMelRWTUp3PT0iLCJtYWMiOiIwYjZmZGMxMzhjM2QzMWE3Zjg5YTcwYmFiY2YyNTc4ZmI5NmFmODMwODRiODk2MDgxZjc1NmZhZTMzMjljMzZkIn0%3D Connection. keep-alive Response in JWTAuth. php line 296 at JWTAuth->requireToken[null] in JWTAuth. php line 189

Cliverson Batista

Hi, My header . Accept. application/json, text/plain, */* Accept-Language. pt-BR,pt;q=0. 8,en-US;q=0. 5,en;q=0. 3 Accept-Encoding. gzip, deflate Authorization. Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9. eyJzdWIiOjEsImlzcyI6Imh0dHA6XC9cL2xvY2FsaG9zdFwvand0MVwvcHVibGljXC9zaWdudXAiLCJpYXQiOjE0NjA1MTAzMzMsImV4cCI6MTQ2MDUxMzkzMywibmJmIjoxNDYwNTEwMzMzLCJqdGkiOiI0MjU0NDA1MDMzYzU1ODJhYThkZTQzM2RjOGQ1ZDkxOSJ9. xxAbUfWWDPiBEV6ObVG_xt-tDnwVR7mdHa7w-cLztN4 X-XSRF-TOKEN. eyJpdiI6IjJJdXV5WmdoY3ZnQ01TK3hoRHlaVUE9PSIsInZhbHVlIjoiVTlYVTBqQkxFV1VMVlRRYTROUDdPMU9iOFB6MmNsczZNNTNJMDRzZ01XbVc5RGgrOE8yS1pGNlU2XC9WbThMUVpLSm1VZFV0akFwK0F2V1FUYXh1VHpBPT0iLCJtYWMiOiIxOGJiYjZmZjA5NWMxYzM0MjVhMTZhNThjNTk5MGY4OGEwMTYyY2QwNDg5NjM1MDFlNGE2ZmZjMzNhZDc0Yzg2In0= Referer. http. //localhost/jwt/public/ Cookie. laravel_session=eyJpdiI6ImRrTmxHRE5oYzhWMG1OakxzMndyN3c9PSIsInZhbHVlIjoiRkxpRExFZjVvUlBNamN1UEFweTdURTNZa0RxMHM3K3pWeGJcL0xIdm1sNjdhTHZBeVgyd08zZUJUcDZXS080cHA1Q0o0RlRVVmFRdUtMeGlMelRWTUp3PT0iLCJtYWMiOiIwYjZmZGMxMzhjM2QzMWE3Zjg5YTcwYmFiY2YyNTc4ZmI5NmFmODMwODRiODk2MDgxZjc1NmZhZTMzMjljMzZkIn0%3D Connection. keep-alive Response in JWTAuth. php line 296 at JWTAuth->requireToken[null] in JWTAuth. php line 189

Sekhar

Composer. josn -------------------- "require". { "php". ">=5. 5. 9", "laravel/framework". "5. 2. *", "guzzlehttp/guzzle". "~6. 0", "doctrine/dbal". "^2. 5", "barryvdh/laravel-cors". "^0. 7. 3", "tymon/jwt-auth". "0. 5. *" }, app. php ------------ Barryvdh\Cors\CorsServiceProvider. class Nhà cung cấp ở trên không hỗ trợ và tôi gặp lỗi dưới đây khi thực hiện "nhà cung cấp thủ công php. publish". [Symfony\Component\Debug\Exception\FatalErrorException] Class 'Barryvdh\LaravelCors\CorsServiceProvider' not found Please let me know the solution ASAP

Sekhar

Composer. josn -------------------- "require". { "php". ">=5. 5. 9", "laravel/framework". "5. 2. *", "guzzlehttp/guzzle". "~6. 0", "doctrine/dbal". "^2. 5", "barryvdh/laravel-cors". "^0. 7. 3", "tymon/jwt-auth". "0. 5. *" }, app. php ------------ Barryvdh\Cors\CorsServiceProvider. class Nhà cung cấp ở trên không hỗ trợ và tôi gặp lỗi dưới đây khi thực hiện "nhà cung cấp thủ công php. publish". [Symfony\Component\Debug\Exception\FatalErrorException] Class 'Barryvdh\LaravelCors\CorsServiceProvider' not found Please let me know the solution ASAP

Simone NoLogo

Hi, I have a question; when I try the login my angular app crash. this is the error. angular. js. 12783 TypeError. Cannot read property 'replace' of undefined. any idea?

Simone NoLogo

Hi, I have a question; when I try the login my angular app crash. this is the error. angular. js. 12783 TypeError. Cannot read property 'replace' of undefined. any idea?

Simone NoLogo

Very Good Article . I have a simple question. after login I refresh the page , with htmlMode = false, and in the console I see. Cannot read property 'replace' of undefined. I'm trying to solve it but no solution at this moment

Simone NoLogo

Very Good Article . I have a simple question. after login I refresh the page , with htmlMode = false, and in the console I see. Cannot read property 'replace' of undefined. I'm trying to solve it but no solution at this moment

Arun Karthi Mani

hi Your article was good enough,Is there is any of ur repo with an advanced version which has 99% security

Arun Karthi Mani

hi Your article was good enough,Is there is any of ur repo with an advanced version which has 99% security

Wadii Basmi

thank you very much

Wadii Basmi

thank you very much

Olof

Hi. Any chance you can update this tutorial for the latest Laravel version? I see the config/app. php file have different way of listing the providers in 5. 2

Olof

Hi. Any chance you can update this tutorial for the latest Laravel version? I see the config/app. php file have different way of listing the providers in 5. 2

Ferri Sutanto

whats your suggestion to get current user? add to custom claims? or just add to response data along with token? or maybe after login we need to fetch /me to get current user? Thanks

Ferri Sutanto

whats your suggestion to get current user? add to custom claims? or just add to response data along with token? or maybe after login we need to fetch /me to get current user? Thanks

Mathieu Rossignol

May I ask you what tool did you use for your beautiful network flow charts? Something with mscgen as engine or a specialized tool for network charts? Or just A classical drawing tool? If it's a dedicated tool I'd like to use it. Thx

Mathieu Rossignol

May I ask you what tool did you use for your beautiful network flow charts? Something with mscgen as engine or a specialized tool for network charts? Or just A classical drawing tool? If it's a dedicated tool I'd like to use it. Thx

Dmitry Litvinenko

Excellent article. Very neat solution

Dmitry Litvinenko

Excellent article. Very neat solution

Raees Uzhunnan

Can someone help me here ; can JWT be implemented with GET ?

Raees Uzhunnan

Can someone help me here ; can JWT be implemented with GET ?

Lokesh L M

It Clear's my confusions and got clear solutions for API authentication and Token generation. Thanks for posting awasome article

Lokesh L M

It Clear's my confusions and got clear solutions for API authentication and Token generation. Thanks for posting awasome article

Kashyap Gandhi

How to create JWT token without credential for guest api response for all future calls? My plan is app developer first call my guest api, in that api we match some logic for valid request, based on successful match lumen generate guest token without any credential and return back in response. This guest token further use for all future api calls. If any user take login/signup then we generate new token and return back in api response. Please help me to generate the guest token which will work same as authorize token

Kashyap Gandhi

How to create JWT token without credential for guest api response for all future calls? My plan is app developer first call my guest api, in that api we match some logic for valid request, based on successful match lumen generate guest token without any credential and return back in response. This guest token further use for all future api calls. If any user take login/signup then we generate new token and return back in api response. Please help me to generate the guest token which will work same as authorize token

nikhil gaikwad

@disqus_hePYgZ134A. disqus Did u solve the issue. i am also facing the same issue

nikhil gaikwad

@disqus_hePYgZ134A. disqus Did u solve the issue. i am also facing the same issue

nikhil gaikwad

@disqus_pchuJt26Qj. disqus and @brunosantana. disqus Did u solve the issue. I am also facing the same issue. I am using L5 and laravel cors 0. 8. *

nikhil gaikwad

@disqus_pchuJt26Qj. disqus and @brunosantana. disqus Did u solve the issue. I am also facing the same issue. I am using L5 and laravel cors 0. 8. *

Abraham Bosch

for publishing configs, the correct command is . "php artisan vendor. publish --tag=config"

Abraham Bosch

for publishing configs, the correct command is . "php artisan vendor. publish --tag=config"

Muhammad Ali

learn lots of concepts from article

Muhammad Ali

learn lots of concepts from article

Andrie Tri Laksono

im get an error in signup POST http. //localhost. 8000/signup 409 [Conflict] how to solve this?

Andrie Tri Laksono

im get an error in signup POST http. //localhost. 8000/signup 409 [Conflict] how to solve this?

Jhansi Pasupuleti

Can we implement JWT in php? can you help me out?

Jhansi Pasupuleti

Can we implement JWT in php? can you help me out?

thủ dâm adhiana

Thank you

thủ dâm adhiana

Thank you

The Brain™

Laravel is a PHP Framework

The Brain™

Laravel is a PHP Framework

Daniel Wolf

To publish the config in Laravel 5 use. $ php artisan vendor. xuất bản --provider="Tymon\JWTAuth\Providers\JWTAuthServiceProvider" Bạn có thể tìm Cấu hình cài đặt tại đây. https. //github. com/tymondesigns/jwt-auth/wiki/Cài đặt

Daniel Wolf

To publish the config in Laravel 5 use. $ php artisan vendor. xuất bản --provider="Tymon\JWTAuth\Providers\JWTAuthServiceProvider" Bạn có thể tìm Cấu hình cài đặt tại đây. https. //github. com/tymondesigns/jwt-auth/wiki/Cài đặt

John johnson

Hands-down the best explanation of JWT I've read. Thank you

John johnson

Hands-down the best explanation of JWT I've read. Thank you

Syrine Jamel

Please how can i log out the user from all devices ? Thanks

Syrine Jamel

Please how can i log out the user from all devices ? Thanks

Ehtesham Mehmood

Great effort, Thumbs up. Here is another list of angular 4 authentication examples. //www.phpcodify.com/angular-4-authentication-login-10-examples/ Angular 4 Authentication Login example

Ehtesham Mehmood

Great effort, Thumbs up. Here is another list of angular 4 authentication examples. //www.phpcodify.com/angular-4-authentication-login-10-examples/ Angular 4 Authentication Login example

rana phool

when i logged in through username or password then they store token in over browser. if i copy these token and in other browser open console and create new localstorage with name acess_token and pase copy token value and refresh page they logged in my profile with out asking username and password. jwt is secure???? kindly explain

rana phool

when i logged in through username or password then they store token in over browser. if i copy these token and in other browser open console and create new localstorage with name acess_token and pase copy token value and refresh page they logged in my profile with out asking username and password. jwt is secure???? kindly explain

Kontoiru

is this safe? if not, how to secure it

Rick Holland

Excellent article Tino, thank you

Sugesh P

Can we add different payload for a JWT token? One payload contains user authentication information and other token contains authentication and authorisation

How to handle JWT token expiration in PHP?

What you can do is set the expiration time in the config/jwt. php file to 7 days so if a user authenticates the token will expire after 7 days. 'ttl' => env['JWT_TTL', 60*24*7], The value is in minutes.

What is the expiry of JWT token?

The JWT access token is only valid for a finite period of time. Using an expired JWT will cause operations to fail. As you saw above, we are told how long a token is valid through expires_in . This value is normally 1200 seconds or 20 minutes .

How can get expired token in PHP?

By default, user tokens are valid indefinitely. You can set an expiration to tokens by passing it as the second parameter .

When token is expired?

When a token has expired or has been revoked, it can no longer be used to authenticate Git and API requests . It is not possible to restore an expired or revoked token, you or the application will need to create a new token. This article explains the possible reasons your GitHub token might be revoked or expire.

Chủ Đề