一個JWT實際上就是一個字符串,它由三部分組成,
頭部
、
載荷
Payload
與
簽名
。
JWTs can be signed using a secret (with the
HMAC
algorithm) or a public/private key pair using
RSA
.
/*
|--------------------------------------------------------------------------
| Required Claims
|--------------------------------------------------------------------------
|
| Specify the required claims that
must exist in any token.
| A TokenInvalidException will be thrown if any of these claims are not
| present in the payload.
|
*/
'required_claims' => [
'iss',
'iat',
'exp',
'
nbf',
'sub',
'
jti',
],
示例:
{
"iss": "http://laravel_api.app/api/register",
"iat":
1502356728,
"exp": 1502360328,(相差3600s)
"nbf":
1502356728,
"jti": "R0Gd00AvOW259LGo",
"sub": 11,
"prv": "3787fba1618a930526aca6c8bb9b44b83f297726"
}
這裏面的前6個字段都是由JWT的
標準所定義的
。
- iss: 該JWT的簽發者
- iat(issued at): 在何時簽發的token
- exp(expires): token何時過時
- nbf(not before):token在此時間以前不能被接收處理
- jti:JWT ID爲web token提供惟一標識
iss是issuer的簡寫,代表請求的實體,能夠是發出請求的用戶的信息。
There are three types of claims:
reserved
,
public
, and
private
claims.
像上面的是reserved:
iss
(issuer),
exp
(expiration time),
sub
(subject),
aud
(audience), and others.
An example of payload could be:
{ "sub":
"1234567890"
, "name":
"John Doe"
, "admin":
true
}
{ "iss": "John Wu JWT", "iat": 1441593502, "exp": 1441594722, "aud": "www.example.com", "sub": "jrocket@example.com", "from_user": "B", "target_user": "A" } |
這裏面的前五個字段都是由JWT的標準所定義的。
aud
: 接收該JWT的一方
將上面的JSON對象進行[
base64編碼
]能夠獲得下面的字符串。這個字符串咱們將它稱做JWT的
Payload
(載荷)。
1 |
eyJpc3MiOiJKb2huIFd1IEpXVCIsImlhdCI6MTQ0MTU5MzUwMiwiZXhwIjoxNDQxNTk0NzIyLCJhdWQiOiJ3d3cuZXhhbXBsZS5jb20iLCJzdWIiOiJqcm9ja2V0QGV4YW1 |
JWT還須要一個頭部,頭部用於描述關於該JWT的最基本的信息,例如其類型以及簽名所用的算法等。這也能夠被表示成一個JSON對象。
1 2 3 4 |
{ "typ": "JWT", "alg": "HS256" |
對它也要進行
Base64編碼
,以後的字符串就成了JWT的
Header
(頭部)。
1 |
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9 |
將上面的兩個編碼後的字符串用句號
.
鏈接在一塊兒(頭部在前),就造成了
1 |
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJmcm9tX3VzZXIiOiJCIiwidGFyZ2V0X3VzZXIiOiJBIn0 |
最後,咱們將上面拼接完的字符串用HS256算法進行加密。在加密的時候,咱們還須要提供一個密鑰(secret)
獲得咱們加密後的內容
1 |
rSWamyAYwuHCo7IFAgd1oRpSP7nzL7BF5t7ItqpKViM |
最後將這一部分簽名
也拼接在被簽名的字符串後面(2個句號)
,咱們就獲得了完整的JWT
1 |
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJmcm9tX3VzZXIiOiJCIiwidGFyZ2V0X3VzZXIiOiJBIn0.rSWamyAYwuHCo7IFAgd1oRpSP7nzL7BF5t7ItqpKViM |
多點登陸」
Set
-Cookie: jwt=lll.zzz.xxx;
HttpOnly
; max-age=980000; domain=.taobao.com
注意
domain
必須設置爲一個點加頂級域名,即
.taobao.com
。這樣,taobao.com和*.taobao.com就均可以接受到這個Cookie,並獲取JWT了。
通常放在HTTP的headers 參數裏面的authorization裏面,值的前面加
Bearer關鍵字和空格
。除此以外,也能夠在url和request body中傳遞。
Authorization: Bearer {yourtokenhere}
- OAuth是一個受權的開放網絡標準,最終目的是取得token(令牌)
- Token 令牌,視爲用戶登陸成功,通行的惟一令牌
- JWT是生成token的輕巧規範,能夠結合一塊兒使用
Unresolvable dependency resolving [Parameter #0 [ $app ]] in class Illuminate\Cache\CacheManager
Dependency Bind from
$app->bind(Illuminate\Cache\CacheManager::class, function ($app) { return new Illuminate\Cache\CacheManager($app); });
Unresolvable dependency resolving [Parameter #0 [ <required> $app ]] in class Illuminate\Auth\AuthManager
$app->bind(Illuminate\Auth\AuthManager::class, function ($app) { return new Illuminate\Auth\AuthManager($app); });