我的疑問是:為啥 有些token前面要加Bearer,並且鍵值對key是authorization (答案:校驗的協議不同)
OAuth 2.0 授權協議: https://blog.csdn.net/u012324798/article/details/105612706
----------------------------------------------------------
截圖是postman的token設置類型
----------------------------------------------------
請求頭的Authorization傳遞,好多后端接收不到的 解決方法
解決方法: 在.htaccess文件中加入
SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1
或(一樣的)
<IfModule mod_rewrite.c> Options +FollowSymlinks -Multiviews RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ index.php/?s=$1 [QSA,PT,L] #增加下面這項 SetEnvIf Authorization .+ HTTP_AUTHORIZATION=$0 </IfModule>
https://blog.csdn.net/qq_28137309/article/details/103419260
https://cloud.tencent.com/developer/article/1552494
----------------------------------------------------------
什么樣的token才能算是bearer token呢?
在以前,用戶進行認證的時候一般是:
-> 用戶向服務端發送驗證信息(用戶名、密碼)。
-> 服務端驗證成功就向用戶返回一個sessionid,服務端保存了這個session_id對應的信息,寫入用戶的 Cookie。
-> 之后前端發出的每一次請求,都會通過Cookie,將session_id傳回服務端,服務端收到session_id,找到對應的數據,由此得知用戶的身份。
但是這種情況下在以下場景下不好實現
比如微博和新浪郵箱都是新浪的。現在要求登陸完新浪郵箱,再訪問微博會自動登錄。
這時候可以使用JWT。
JWT的原理是,服務器認證以后,生成一個JSON對象,發回給用戶,如下所示
{ "data": ".......", "expires": "7730123010203" }
服務器在生成這個對象的時候加上簽名。
經過一系列加密和簽名算法之后,JWT變成了這樣的結構的一個具有有效期的字符串(是否有效服務端會根據expires判斷)
Base64URL(header).base64UrlEncode(payload).HMACSHA256(Base64URL(header).base64UrlEncode(payload), secret )
這個字符串。你可以把它放在Cookie里面自動發送,但是這樣不能跨域,所以更好的做法是放在HTTP請求的頭信息Authorization字段里面。
Authorization: Bearer <token>
所以你現在需要去看一下JWT是個啥JWT.IO - JSON Web Tokens Introduction
===================================(手動給前端token加bearer,后端在過濾后驗證)
跨域請求-JWT認證將token添加到Authorization
后端增加代碼:
header('Access-Control-Allow-Origin: header('Access-Control-Allow-Headers:Origin,X-Requested-With,Content-Type,Accept,Authorization'); header('Access-Control-Allow-Methods:GET,POST'); //CORS跨域 允許Authorization header('Access-Control-Allow-Origin:http://wwww.demo.com'); header('Access-Control-Allow-Headers:Origin,X-Requested-With,Content-Type,Accept,Authorization'); header('Access-Control-Allow-Methods:GET,POST');
前端增加代碼:
beforeSend: function(xhr) { var token = 'xxxxxxxxxx'; xhr.setRequestHeader("Authorization", "Bearer " + token); }, demo示例: $("#submit").click(function() { $("#request-process-patent").html("正在提交數據,請勿關閉當前窗口..."); $.ajax({ type: "POST", beforeSend: function(xhr) { var token = 'xxxxxxxx'; xhr.setRequestHeader('Authorization', 'Bearer ' + token); }, url: "http://www.newweb.com/index.php?act=loginWap&op=login", contentType: "application/json; charset=utf-8", data: JSON.stringify(GetJsonData()), dataType: "json", success: function(data) { if (data.code == 200) { alert('登錄成功!'); window.location.href = "http://www.logindemo.com/backend.html"; } else { alert('用戶名或密碼錯誤!'); } }, error: function(message) { $("#request-process-patent").html("用戶名或密碼錯誤!"); } }); }); function GetJsonData() { var json = { "code": $("#code").val(), "user_name": $("#user_name").val(), "password": $("#password").val() }; return json; }
轉 : https://www.zhihu.com/question/305585277/answer/551377366
https://blog.csdn.net/weixin_28844235/article/details/112833169