Đả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_______31 2 3
$ php composer.phar require "lexik/jwt-authentication-bundle"
5To 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"
7The 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"
9Windows
1
1 2 3 41
If it works, you will receive something like this
1 2 3
1 2 3 43
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],
];
9See 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
10 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 parametersStructure 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 documentationPrivate 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 clientThe 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
}
6For 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 environmentVí 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 databaseInstalling 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 CORSjwt-auth
Require the
eyJpc3MiOiJ0b3B0YWwuY29tIiwiZXhwIjoxNDI2NDIwODAwLCJodHRwOi8vdG9wdGFsLmNvbS9qd3RfY2xhaW1zL2lzX2FkbWluIjp0cnVlLCJjb21wYW55IjoiVG9wdGFsIiwiYXdlc29tZSI6dHJ1ZX0
3 package in our eyJpc3MiOiJ0b3B0YWwuY29tIiwiZXhwIjoxNDI2NDIwODAwLCJodHRwOi8vdG9wdGFsLmNvbS9qd3RfY2xhaW1zL2lzX2FkbWluIjp0cnVlLCJjb21wYW55IjoiVG9wdGFsIiwiYXdlc29tZSI6dHJ1ZX0
6 and update our dependenciescomposer require tymon/jwt-auth 0.5.*
Add the
eyJpc3MiOiJ0b3B0YWwuY29tIiwiZXhwIjoxNDI2NDIwODAwLCJodHRwOi8vdG9wdGFsLmNvbS9qd3RfY2xhaW1zL2lzX2FkbWluIjp0cnVlLCJjb21wYW55IjoiVG9wdGFsIiwiYXdlc29tZSI6dHJ1ZX0
7 to our eyJpc3MiOiJ0b3B0YWwuY29tIiwiZXhwIjoxNDI2NDIwODAwLCJodHRwOi8vdG9wdGFsLmNvbS9qd3RfY2xhaW1zL2lzX2FkbWluIjp0cnVlLCJjb21wYW55IjoiVG9wdGFsIiwiYXdlc29tZSI6dHJ1ZX0
8 providers array{
"alg": "HS256",
"typ": "JWT"
}
0Next, 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"
}
1Finally, 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"
}
2We 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"
}
3Add the
$encodedContent = base64UrlEncode[header] + "." + base64UrlEncode[payload];
$signature = hashHmacSHA256[$encodedContent];
7 to our eyJpc3MiOiJ0b3B0YWwuY29tIiwiZXhwIjoxNDI2NDIwODAwLCJodHRwOi8vdG9wdGFsLmNvbS9qd3RfY2xhaW1zL2lzX2FkbWluIjp0cnVlLCJjb21wYW55IjoiVG9wdGFsIiwiYXdlc29tZSI6dHJ1ZX0
8 providers array{
"alg": "HS256",
"typ": "JWT"
}
4Then add the middleware to our
$encodedContent = base64UrlEncode[header] + "." + base64UrlEncode[payload];
$signature = hashHmacSHA256[$encodedContent];
9{
"alg": "HS256",
"typ": "JWT"
}
5Publish the configuration to a local
yRQYnWzskCZUxPwaQupWkiUzKELZ49eM7oWxAQK_ZXw
0 file by using the yRQYnWzskCZUxPwaQupWkiUzKELZ49eM7oWxAQK_ZXw
1 commandExample of a
yRQYnWzskCZUxPwaQupWkiUzKELZ49eM7oWxAQK_ZXw
2 file configuration{
"alg": "HS256",
"typ": "JWT"
}
6Routing 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"
}
9Tì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 minheyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
0Trong 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 đượcTrong 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émeyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
1Nế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
0eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
2Ví 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
3Khở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 saueyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
4Phầ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
5Chú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
}
3Tấ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ểneyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
6Lộ 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ôieyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
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ệteyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
8Bộ đ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
}
0Chươ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 UnauthorizedDị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
}
1Dị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
}
2Ngoà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ềnNoCookiesNgườ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