最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

從0構(gòu)建Oauth2Server服務(wù)?之Token?編解碼

 更新時間:2023年05月05日 14:42:19   作者:demo007x  
這篇文章主要為大家介紹了從0構(gòu)建Oauth2Server服務(wù)之Token編解碼詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

Token 編解碼

令牌提供了一種通過在令牌字符串本身中編碼所有必要信息來避免將令牌存儲在數(shù)據(jù)庫中的方法。這樣做的主要好處是 API 服務(wù)器能夠驗證訪問令牌,而無需對每個 API 請求進行數(shù)據(jù)庫查找,從而使 API 更容易擴展。

OAuth 2.0 Bearer Tokens 的好處是應(yīng)用程序不需要知道您決定如何在您的服務(wù)中實現(xiàn)訪問令牌。這意味著以后可以在不影響客戶端的情況下更改您的實現(xiàn)。

如果您已經(jīng)擁有一個可水平擴展的分布式數(shù)據(jù)庫系統(tǒng),那么您可能無法通過使用自編碼令牌獲得任何好處。事實上,如果您已經(jīng)解決了分布式數(shù)據(jù)庫問題,則使用自編碼令牌只會引入新問題,因為使自編碼令牌無效成為一個額外的障礙。

有很多方法可以對令牌進行自編碼。您選擇的實際方法只對您的實施很重要,因為令牌信息不會暴露給外部開發(fā)人員。

實現(xiàn)自編碼令牌的最常見方法是使用 JWS 規(guī)范,創(chuàng)建要包含在令牌中的所有數(shù)據(jù)的 JSON 序列化表示,并使用只有授權(quán)服務(wù)器知道的私鑰對生成的字符串進行簽名.

JWT 訪問令牌編碼

下面的代碼是用 PHP 編寫的,并使用Firebase PHP-JWT庫來編碼和驗證令牌。您需要包含該庫才能運行示例代碼實際上,授權(quán)服務(wù)器將有一個用于簽署令牌的私鑰,資源服務(wù)器將從授權(quán)服務(wù)器元數(shù)據(jù)中獲取公鑰以用于驗證令牌。在這個例子中,我們每次都生成一個新的私鑰,并在同一個腳本中驗證令牌。實際上,您需要將私鑰存儲在某處以使用相同的密鑰一致地簽署令牌。

<?php
use \Firebase\JWT\JWT;
# Generate a private key to sign the token.
# The public key would need to be published at the authorization
# server if a separate resource server needs to validate the JWT
$private_key = openssl_pkey_new([
  'digest_alg' => 'sha256',
  'private_key_bits' => 1024,
  'private_key_type' => OPENSSL_KEYTYPE_RSA
]);
# Set the user ID of the user this token is for
$user_id = "1000";
# Set the client ID of the app that is generating this token
$client_id = 'https://example-app.com';
# Provide the list of scopes this token is valid for
$scope = 'read write';
$token_data = array(
  # Issuer (the authorization server identifier)
  'iss' => 'https://' . $_SERVER['PHP_SELF'],
  # Expires At
  'exp' => time()+7200, // Valid for 2 hours
  # Audience (The identifier of the resource server)
  'aud' => 'api://default',
  # Subject (The user ID)
  'sub' => $user_id,
  # Client ID
  'client_id' => $client_id,
  # Issued At
  'iat' => time(),
  # Identifier of this token
  'jti' => microtime(true).'.'.bin2hex(random_bytes(10)),
  # The list of OAuth scopes this token includes
  'scope' => $scope
);
$token_string = JWT::encode($token_data, $private_key, 'RS256');

這將產(chǎn)生一個字符串,例如:

eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJpc3MiOiJodH
RwczovL2F1dGhvcml6YXRpb24tc2VydmVyLmNvbS8iLCJleHAiO
jE2MzczNDQ1NzIsImF1ZCI6ImFwaTovL2RlZmF1bHQiLCJzdWIi
OiIxMDAwIiwiY2xpZW50X2lkIjoiaHR0cHM6Ly9leGFtcGxlLWF
wcC5jb20iLCJpYXQiOjE2MzczMzczNzIsImp0aSI6IjE2MzczMz
czNzIuMjA1MS42MjBmNWEzZGMwZWJhYTA5NzMxMiIsInNjb3BlI
joicmVhZCB3cml0ZSJ9.SKDO_Gu96WeHkR_Tv0d8gFQN1SEdpN8
S_h0IJQyl_5syvpIRA5wno0VDFi34k5jbnaY5WHn6Y912IOmg6t
MO91KlYOU1MNdVhHUoPoNUzYtl_nNab7Ywe29kxgrekm-67ZInD
I8RHbSkL7Z_N9eZz_J8c3EolcsoIf-Dd5n9y_Y

該令牌由三個部分組成,以句點分隔。第一部分描述了使用的簽名方法。第二部分包含令牌數(shù)據(jù)。第三部分是簽名。

例如,此令牌的第一個組件是此 JSON 對象:

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

第二個組件包含 API 端點處理請求所需的實際數(shù)據(jù),例如用戶標識和范圍訪問。

{
  "iss": "https://authorization-server.com/",
  "exp": 1637344572,
  "aud": "api://default",
  "sub": "1000",
  "client_id": "https://example-app.com",
  "iat": 1637337372,
  "jti": "1637337372.2051.620f5a3dc0ebaa097312",
  "scope": "read write"
}

然后對這兩個部分進行 base64 編碼,JWT 庫計算這兩個字符串的 RS256 簽名,然后用句點連接所有三個部分。

解碼

可以使用相同的 JWT 庫驗證訪問令牌。該庫將同時對簽名進行解碼和驗證,如果簽名無效或令牌的到期日期已過,則拋出異常。

您需要與簽署令牌的私鑰相對應(yīng)的公鑰。通常,您可以從授權(quán)服務(wù)器的元數(shù)據(jù)文檔中獲取它,但在本例中,我們將從之前生成的私鑰中派生出公鑰。

注意:任何人都可以通過對令牌字符串的中間部分進行base64解碼來讀取令牌信息。因此,不要在令牌中存儲私人信息或您不希望用戶或開發(fā)人員看到的信息,這一點很重要。如果想隱藏token信息,可以使用JSON Web Encryption spec對token中的數(shù)據(jù)進行加密。

$public_key = openssl_pkey_get_details($private_key)['key'];
try {
  # Note: You must provide the list of supported algorithms in order to prevent 
  # an attacker from bypassing the signature verification. See:
  # https://auth0.com/blog/critical-vulnerabilities-in-json-web-token-libraries/
  $token = JWT::decode($token_string, $jwt_key, ['RS256']);
  $error = false;
} catch(\Firebase\JWT\ExpiredException $e) {
  $token = false;
  $error = 'expired';
  $error_description = 'The token has expired';
} catch(\Firebase\JWT\SignatureInvalidException $e) {
  $token = false;
  $error = 'invalid';
  $error_description = 'The token provided was malformed';
} catch(Exception $e) {
  $token = false;
  $error = 'unauthorized';
  $error_description = $e->getMessage();
}
if($error) {
  header('HTTP/1.1 401 Unauthorized');
  echo json_encode(array(
    'error'=>$error, 
    'error_description'=>$error_description
  ));
  die();
} else {
  // Now $token has all the data that we encoded in it originally
  print_r($token);
}	

Invalidating

因為令牌可以在不進行數(shù)據(jù)庫查找的情況下進行驗證,所以在令牌過期之前無法使其失效。您需要采取額外的步驟來使自編碼的令牌無效,例如臨時存儲已撤銷令牌的列表,這是令jti牌中聲明的一種用途。有關(guān)詳細信息,請參閱刷新訪問令牌。

以上就是從0構(gòu)建Oauth2Server服務(wù) 之Token 編解碼的詳細內(nèi)容,更多關(guān)于Oauth2Server Token編解碼的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • PHP批量修改文件名稱的方法分析

    PHP批量修改文件名稱的方法分析

    這篇文章主要介紹了PHP批量修改文件名稱的方法,結(jié)合實例形式分析了php針對文件與目錄的遞歸、遍歷、修改的原理與實現(xiàn)技巧,需要的朋友可以參考下
    2017-02-02
  • php建立Ftp連接的方法

    php建立Ftp連接的方法

    這篇文章主要介紹了php建立Ftp連接的方法,實例分析了php操作FTP的相關(guān)函數(shù)及使用技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-03-03
  • PHP file_get_contents 函數(shù)超時的幾種解決方法

    PHP file_get_contents 函數(shù)超時的幾種解決方法

    在使用file_get_contents函數(shù)的時候,經(jīng)常會出現(xiàn)超時的情況,在這里要通過查看一下錯誤提示,看看是哪種錯誤,比較常見的是讀取超時,這種情況大家可以通過一些方法來盡量的避免或者解決。
    2009-07-07
  • PHP laravel使用自定義郵件類實現(xiàn)發(fā)送郵件

    PHP laravel使用自定義郵件類實現(xiàn)發(fā)送郵件

    這篇文章主要為大家詳細介紹了PHP laravel如何通過自定義郵件類實現(xiàn)發(fā)送郵件功能,文中的示例代碼講解詳細,感興趣的小伙伴可以嘗試一下
    2022-10-10
  • PHP下通過exec獲得計算機的唯一標識[CPU,網(wǎng)卡 MAC地址]

    PHP下通過exec獲得計算機的唯一標識[CPU,網(wǎng)卡 MAC地址]

    PHP下通過exec獲得計算機的唯一標識的代碼,可獲得CPU,網(wǎng)卡 MAC地址信息。
    2011-06-06
  • php連接函數(shù)implode與分割explode的深入解析

    php連接函數(shù)implode與分割explode的深入解析

    本篇文章是對php連接函數(shù)implode與分割explode進行了詳細的分析介紹,需要的朋友參考下
    2013-06-06
  • php實現(xiàn)短信發(fā)送代碼

    php實現(xiàn)短信發(fā)送代碼

    這篇文章主要介紹了php實現(xiàn)短信發(fā)送代碼的相關(guān)資料,需要的朋友可以參考下
    2015-07-07
  • 使用PHP來防止XSS攻擊的方法

    使用PHP來防止XSS攻擊的方法

    跨站腳本攻擊(Cross-Site Scripting,XSS)是一種常見的Web應(yīng)用程序安全漏洞,它允許攻擊者將惡意腳本注入到受害者的瀏覽器中,本文給大家介紹了一個簡單的示例代碼,展示了如何使用PHP來防止XSS攻擊,需要的朋友可以參考下
    2023-12-12
  • php生成二維碼時出現(xiàn)中文亂碼的解決方法

    php生成二維碼時出現(xiàn)中文亂碼的解決方法

    這篇文章主要介紹了php生成二維碼時出現(xiàn)中文亂碼的解決方法,較為詳細的分析了php生成二維碼的方法,以及出現(xiàn)亂碼時的解決方法,具有一定的參考借鑒價值,需要的朋友可以參考下
    2014-12-12
  • 談?wù)凱HP連接Access數(shù)據(jù)庫的注意事項

    談?wù)凱HP連接Access數(shù)據(jù)庫的注意事項

    有的時候需要用php連接access數(shù)據(jù)庫,結(jié)果整了半天Access數(shù)據(jù)庫就是連接不上,查找很多資料,以下是些個人經(jīng)驗,希望能給需要連接access 數(shù)據(jù)的人帶來幫助。
    2016-08-08

最新評論

娄底市| 静海县| 鄯善县| 宁陕县| 承德县| 广丰县| 淮北市| 绥宁县| 马鞍山市| 庆元县| 三明市| 张掖市| 凤庆县| 临桂县| 遂川县| 山阴县| 宜良县| 宁远县| 肇州县| 仙桃市| 乌审旗| 通渭县| 永丰县| 平湖市| 扎鲁特旗| 宁陵县| 孝感市| 四平市| 沁水县| 江都市| 湘潭市| 荥阳市| 喀喇| 四子王旗| 阳信县| 聊城市| 大名县| 公主岭市| 台北市| 图片| 安仁县|