# api * [Rest](api.md#rest) * [æ¦å¿µ](api.md#æ¦å¿µ) * [设计åå](api.md#设计åå) * [身份éªè¯](api.md#身份éªè¯) * [忢OAuth,TokenåJWT](api.md#忢oauthtokenåjwt) * [ä»ä¹æ¯OAuth?](api.md#ä»ä¹æ¯oauth) * [ä»ä¹æ¯Token?](api.md#ä»ä¹æ¯token) * [ä»ä¹åæ¯JWTï¼](api.md#ä»ä¹åæ¯jwt) * [ä¸è ä¹é´åæ¯ä»ä¹å ³ç³»?](api.md#ä¸è ä¹é´åæ¯ä»ä¹å ³ç³») * [OAuth](api.md#oauth) * [æ¦å¿µ](api.md#æ¦å¿µ) * [设计æè·¯](api.md#设计æè·¯) * [åç](api.md#åç) * [åè¯](api.md#åè¯) * [åºç¨åºæ¯](api.md#åºç¨åºæ¯) * [Token](api.md#token) * [æ¦å¿µ](api.md#æ¦å¿µ) * [åç](api.md#åç) * [Access Token ç±»å](api.md#access-token-ç±»å) * [认è¯è¯·æ±æ¹å¼](api.md#认è¯è¯·æ±æ¹å¼) * [JWT](api.md#jwt) * [æ¦å¿µ](api.md#æ¦å¿µ) * [åç](api.md#åç) * [åºç¨åºæ¯](api.md#åºç¨åºæ¯) * [æ ç¶æçåå¸å¼API](api.md#æ ç¶æçåå¸å¼api) * [åè](api.md#åè) **Rest** ### æ¦å¿µ RESTï¼Representational State Transferï¼è¿ä¸ªè¯ï¼æ¯Roy Thomas Fieldingå¨ä»2000å¹´çå士论æä¸æåºçã Fieldingæ¯HTTPåè®®ï¼1.0çå1.1çï¼ç主è¦è®¾è®¡è ãApacheæå¡å¨è½¯ä»¶çä½è ä¹ä¸ãApacheåºéä¼ç第ä¸ä»»ä¸»å¸ã > æ¬æç ç©¶è®¡ç®æºç§å¦ä¸¤å¤§å沿----软件åç½ç»----ç交åç¹ãé¿æä»¥æ¥ï¼è½¯ä»¶ç 究主è¦å ³æ³¨è½¯ä»¶è®¾è®¡çåç±»ãè®¾è®¡æ¹æ³çæ¼åï¼å¾å°å®¢è§å°è¯ä¼°ä¸åçè®¾è®¡éæ©å¯¹ç³»ç»è¡ä¸ºçå½±åãèç¸åå°ï¼ç½ç»ç 究主è¦å ³æ³¨ç³»ç»ä¹é´éä¿¡è¡ä¸ºçç»èãå¦ä½æ¹è¿ç¹å®éä¿¡æºå¶ç表ç°ï¼å¸¸å¸¸å¿½è§äºä¸ä¸ªäºå®ï¼é£å°±æ¯æ¹ååºç¨ç¨åºçäºå¨é£æ ¼æ¯æ¹åäºå¨åè®®ï¼å¯¹æ´ä½è¡¨ç°ææ´å¤§çå½±åãæè¿ç¯æç« çåä½ç®çï¼å°±æ¯æ³å¨ç¬¦åæ¶æåççåæä¸ï¼çè§£åè¯ä¼°ä»¥ç½ç»ä¸ºåºç¡çåºç¨è½¯ä»¶çæ¶æè®¾è®¡ï¼å¾å°ä¸ä¸ªåè½å¼ºãæ§è½å¥½ãéå®éä¿¡çæ¶æã 论æï¼ [Architectural Styles and the Design of Network-based Software Architectures](https://www.ics.uci.edu/~fielding/pubs/dissertation/top.htm) RESTç« è ï¼ [Representational State Transfer \(REST\)](https://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm) çè§£ä¸ä¸restï¼ è¡¨ç°å±ç¶æè½¬å? **å°èµæºéè¿ä¸ç§å¤å¨è¡¨ç°å½¢å¼ï¼è¿è¡æ°æ®åç¶æè½¬ç§»çå®ä¹åè¿ç¨å°±æ¯Rest** ä¸çè§£ï¼ ok æä»¬æ¢ä¸é¢è¿ç§ï¼ * æ¯ä¸ä¸ªURI代表ä¸ç§èµæºï¼ * 客æ·ç«¯åæå¡å¨ä¹é´ï¼ä¼ éè¿ç§èµæºçæç§è¡¨ç°å±ï¼ * 客æ·ç«¯éè¿å个HTTPå¨è¯ï¼GETãPOSTãPUTåDELETEæ¹æ³ï¼ï¼å¯¹æå¡å¨ç«¯èµæºè¿è¡æä½ï¼å®ç°"表ç°å±ç¶ææ¹å"ã ä¸çè§£ï¼ ok æä»¬åæ¢ä¸é¢è¿ç§ï¼ * çUrlå°±ç¥éæ¯ä»ä¹ * çhttp methodå°±ç¥éå¹²ä»ä¹ * çhttp status codeå°±ç¥éç»æ é£ä»ä¹æ¯restful ï¼ **å¯ä»¥çè§£æåºäºrest飿 ¼å建çapiå°±æ¯restfulï¼æ¯ç®åææµè¡çä¸ç§äºèç½è½¯ä»¶æ¶æãå®ç»ææ¸ æ°ãç¬¦åæ åãæäºçè§£ãæ©å±æ¹ä¾¿ã** **RESTful APIæ¯ç®åæ¯è¾æççä¸å¥äºèç½åºç¨ç¨åºçAPI设计ç论** ### 设计åå * get [https://api.example.com/v1/employees/11/groups?page=1](https://api.example.com/v1/employees/11/groups?page=1) * åè®®ï¼ https or http æ¨èåè * ååï¼ api.example.com or example.org/api æ¨èåè * çæ¬ï¼ v1 * 端ç¹endpointï¼ employees 夿°åè¯ * HTTPå¨ä½: get ```text GET: è·åæä¸ªèµæºï¼GETæä½åºè¯¥æ¯å¹çï¼idempotenceï¼çï¼ä¸æ å¯ä½ç¨ã POST: å建ä¸ä¸ªæ°çèµæºã PUT: æ¿æ¢æä¸ªå·²æçèµæºãPUTæä½è½ç¶æå¯ä½ç¨ï¼ä½å ¶åºè¯¥æ¯å¹ççã PATCHï¼RFC5789ï¼: ä¿®æ¹æä¸ªå·²æçèµæºã DELETEï¼å é¤æä¸ªèµæºãDELETEæä½æå¯ä½ç¨ï¼ä½ä¹æ¯å¹ççã ``` * Headers 请æ±å¤´ ```text Acceptï¼æå¡å¨éè¦è¿åä»ä¹æ ·çcontentã妿客æ·ç«¯è¦æ±è¿å"application/xml"ï¼æå¡å¨ç«¯åªè½è¿å"application/json"ï¼é£ä¹æå¥½è¿åstatus code 406 not acceptableï¼RFC2616ï¼ï¼å½ç¶ï¼è¿åapplication/jsonä¹å¹¶ä¸è¿èRFCçå®ä¹ãä¸ä¸ªåæ ¼çREST APIéè¦æ ¹æ®Accept头æ¥çµæ´»è¿ååéçæ°æ®ã If-Modified-Since/If-None-Matchï¼å¦æå®¢æ·ç«¯æä¾æä¸ªæ¡ä»¶ï¼é£ä¹å½è¿æ¡ä»¶æ»¡è¶³æ¶ï¼æè¿åæ°æ®ï¼å¦åè¿å304 not modifiedãæ¯å¦å®¢æ·ç«¯å·²ç»ç¼åäºæä¸ªæ°æ®ï¼å®åªæ¯æ³ççææ²¡ææ°çæ°æ®æ¶ï¼ä¼ç¨è¿ä¸¤ä¸ªheaderä¹ä¸ï¼æå¡å¨å¦æä¸çä¸ç¬ï¼ä¾æ§åè¶³å ¨å¥å课ï¼è¿å200 okï¼é£å°±æ¢ä¸ä¸ä¸ï¼ä¹ä¸é«æäºã If-Matchï¼å¨å¯¹æä¸ªèµæºåPUT/PATCH/DELETEæä½æ¶ï¼æå¡å¨åºè¯¥è¦æ±å®¢æ·ç«¯æä¾If-Match头ï¼åªæå®¢æ·ç«¯æä¾çEtag䏿å¡å¨å¯¹åºèµæºçEtagä¸è´ï¼æè¿è¡æä½ï¼å¦åè¿å412 precondition failedãè¿ä¸ªå¤´é常éè¦ï¼ä¸æè¯¦è§£ã ``` * åæ°ï¼ page * Response ç¶æç ï¼ 200 ```text GET: 200 OK POST: 201 Created PUT: 200 OK PATCH: 200 OK DELETE: 204 No Content ``` * Response ç»æï¼ ```text GET /collectionï¼è¿åèµæºå¯¹è±¡çåè¡¨ï¼æ°ç»ï¼ GET /collection/resourceï¼è¿ååä¸ªèµæºå¯¹è±¡ POST /collectionï¼è¿åæ°çæçèµæºå¯¹è±¡ PUT /collection/resourceï¼è¿å宿´çèµæºå¯¹è±¡ PATCH /collection/resourceï¼è¿å宿´çèµæºå¯¹è±¡ DELETE /collection/resourceï¼è¿åä¸ä¸ªç©ºææ¡£ ``` * Response é误 ```text { "error": "Invalid payoad.", "detail": { "surname": "This field is required." } } ``` * åµå¥è¿æ¯ä¸åµå¥ï¼æ²¡æå®å¼ï¼ æä¸ªäººç¨åè åµå¥ç±»åæè¿°äºä¸å¯¹å¤çå ³ç³» ```text è·åéåçæå¨å¢é employees/11/groups or /employees/?groups_id=11 ``` * ä¼é å°å¤ç尾鍿æ ä¿æä¸è´ * 忏 401 å 403 ## 身份éªè¯ ### 忢OAuth,TokenåJWT #### ä»ä¹æ¯OAuth? OAuthæ¯ä¸ä¸ªå¼æ¾æ å,æä¾äºä¸ç§ç®ååæ åçå®å ¨æææ¹æ³,å è®¸ç¨æ·æ éå°æä¸ªç½ç«çç¨æ·åå¯ç æä¾ç»ç¬¬ä¸æ¹åºç¨å°±å¯ä»¥è®©è¯¥ç¬¬ä¸æ¹åºç¨è®¿é®è¯¥ç¨æ·å¨æç½ç«ä¸çæäºç¹å®ä¿¡æ¯\(å¦ç®åç个人信æ¯\),ç°å¨ä¸è¬ç¨çæ¯OAuth 2.0\(ä¸å ¼å®¹1.0\). #### ä»ä¹æ¯Token? Tokenå°±æ¯è·åä¿¡æ¯çåè¯,å°±æ¯Access Token,让客æ·ç«¯æ éç¨æ·å¯ç å³å¯è·åç¨æ·ææçæäºèµæº. #### ä»ä¹åæ¯JWTï¼ JSON Web Tokens, è¿æ¯ä¸ä¸ªå¼æ¾çæ å,è§å®äºä¸ç§Tokenå®ç°æ¹å¼,以JSONä¸ºæ ¼å¼. #### ä¸è ä¹é´åæ¯ä»ä¹å ³ç³»? è¿ä¸ä¸ªç¸äºè¿æ¥ä¸æ¯ç±å¤§å°å°çä¸ç§å ³ç³»,OAuthè§å®æææµç¨,Tokenä¸ºå ¶ä¸ä¸ç¯çä¸ä¸ªä¿¡æ¯è½½ä½,å ·ä½çä¸ç§å®ç°æ¹å¼ç±JWTè§å® ### OAuth #### æ¦å¿µ OAuth 2.0: æ¯ä¸ä¸ªå¼æ¾æ å,æä¾äºä¸ç§ç®ååæ åçå®å ¨æææ¹æ³,å è®¸ç¨æ·æ éå°æä¸ªç½ç«çç¨æ·åå¯ç æä¾ç»ç¬¬ä¸æ¹åºç¨å°±å¯ä»¥è®©è¯¥ç¬¬ä¸æ¹åºç¨è®¿é®è¯¥ç¨æ·å¨æç½ç«ä¸çæäºç¹å®ä¿¡æ¯\(å¦ç®åç个人信æ¯\)ã > The OAuth 2.0 authorization framework enables a third-party application to obtain limited access to an HTTP service, either on behalf of a resource owner by orchestrating an approval interaction between the resource owner and the HTTP service, or by allowing the third-party application to obtain access on its own behalf. [RFC6749](https://tools.ietf.org/html/rfc6749) [rfc6749](http://www.rfcreader.com/#rfc6749) #### 设计æè·¯ OAuthå¨"客æ·ç«¯"ä¸"æå¡æä¾å"ä¹é´ï¼è®¾ç½®äºä¸ä¸ªææå±ï¼authorization layerï¼ã"客æ·ç«¯"ä¸è½ç´æ¥ç»å½"æå¡æä¾å"ï¼åªè½ç»å½ææå±ï¼ä»¥æ¤å°ç¨æ·ä¸å®¢æ·ç«¯åºå弿¥ã"客æ·ç«¯"ç»å½ææå±æç¨ç令çï¼tokenï¼ï¼ä¸ç¨æ·çå¯ç ä¸åãç¨æ·å¯ä»¥å¨ç»å½çæ¶åï¼æå®ææå±ä»¤ççæéèå´åæææã "客æ·ç«¯"ç»å½ææå±ä»¥åï¼"æå¡æä¾å"æ ¹æ®ä»¤ççæéèå´åæææï¼å"客æ·ç«¯"弿¾ç¨æ·å¨åçèµæã #### åç ```text +--------+ +---------------+ | |--(A)- Authorization Request ->| Resource | | | | Owner | | |<-(B)-- Authorization Grant ---| | | | +---------------+ | | | | +---------------+ | |--(C)-- Authorization Grant -->| Authorization | | Client | | Server | | |<-(D)----- Access Token -------| | | | +---------------+ | | | | +---------------+ | |--(E)----- Access Token ------>| Resource | | | | Server | | |<-(F)--- Protected Resource ---| | +--------+ +---------------+ ``` ```text ï¼Aï¼ç¨æ·æå¼å®¢æ·ç«¯ä»¥åï¼å®¢æ·ç«¯è¦æ±ç¨æ·ç»äºææã ï¼Bï¼ç¨æ·åæç»äºå®¢æ·ç«¯ææã ï¼Cï¼å®¢æ·ç«¯ä½¿ç¨ä¸ä¸æ¥è·å¾çææï¼åè®¤è¯æå¡å¨ç³è¯·ä»¤çã ï¼Dï¼è®¤è¯æå¡å¨å¯¹å®¢æ·ç«¯è¿è¡è®¤è¯ä»¥åï¼ç¡®è®¤æ 误ï¼åæåæ¾ä»¤çã ï¼Eï¼å®¢æ·ç«¯ä½¿ç¨ä»¤çï¼åèµæºæå¡å¨ç³è¯·è·åèµæºã ï¼Fï¼èµæºæå¡å¨ç¡®è®¤ä»¤çæ 误ï¼åæå客æ·ç«¯å¼æ¾èµæºã ``` æ´è¯¦ç»çå¯ä»¥çè¿ç¯æç« [çè§£OAuth 2.0](http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html) #### åè¯ **Rolesè§è²** åºç¨ç¨åºæè ç¨æ·é½å¯ä»¥æ¯ä¸è¾¹çä»»ä½ä¸ç§è§è²ï¼ * èµæºæ¥æè * èµæºæå¡å¨ * 客æ·ç«¯åºç¨ * è®¤è¯æå¡å¨ **Client Types客æ·ç«¯ç±»å** è¿éç客æ·ç«¯ä¸»è¦æAPIç使ç¨è ãå®å¯ä»¥æ¯çç±»åï¼ * ç§æç * å ¬å¼ç **Client Profile客æ·ç«¯æè¿°** OAuth2æ¡æ¶ä¹æå®äºéä¸å®¢æ·ç«¯æè¿°ï¼ç¨æ¥è¡¨ç¤ºåºç¨ç¨åºçç±»åï¼ * Webåºç¨ * ç¨æ·ä»£ç * å声åºç¨ **Authorization Grantsè®¤è¯ææ** è®¤è¯ææä»£è¡¨èµæºæ¥æè ææç»å®¢æ·ç«¯åºç¨ç¨åºçä¸ç»æéï¼å¯ä»¥æ¯ä¸è¾¹å ç§å½¢å¼ï¼ * ææç * é弿æ * èµæºæ¥æè å¯ç è¯ä¹¦ * 客æ·ç«¯è¯ä¹¦ * Endpointsç»ç«¯ **OAuth2æ¡æ¶éè¦ä¸è¾¹å ç§ç»ç«¯ï¼** * 认è¯ç»ç«¯ * Tokenç»ç«¯ * éå®åç»ç«¯ #### åºç¨åºæ¯ * å¤é¨è®¤è¯æå¡å¨ éè¿ç¬¬ä¸æ¹è®¤è¯æå¡ï¼ æ¥å®ææå¡æææ§å¶ ä¼å¿ * å¿«éå¼å * 宿½ä»£ç éå° * ç»´æ¤å·¥ä½åå° * 大åä¼ä¸è§£å³æ¹æ¡ APIè°ç¨æ¹å¾å¤ï¼ 并䏿¯ä¸ªappä½¿ç¨æ¹å¼ä¸ä¸æ ·ï¼ åºè¯¥æ½è±¡åºç¬ç«çµæ´»çå®å ¨çç¥ ä¼å¿ * çµæ´»çå®ç°æ¹å¼ * å¯ä»¥åJWTåæ¶ä½¿ç¨ * å¯é对ä¸ååºç¨æ©å± ### Token #### æ¦å¿µ Tokenå°±æ¯è·åä¿¡æ¯çåè¯, å ³äºTokençå ·ä½ä½¿ç¨æç¸åºçRFCæä»¶æå¯¼: [The OAuth 2.0 Authorization Framework](https://tools.ietf.org/html/rfc6750) #### åç **Access Token ç±»å** Tokençç±»åå¯å为两ç§: 1 **bearer**. å å«ä¸ä¸ªç®åçTokenå符串. 2 **mac**. ç±æ¶æ¯ææç \(Message Authentication Code\)åTokenç»æ. 示ä¾: ```text // bearer GET /resource/1 HTTP/1.1 Host: example.com Authorization: Bearer mF_9.B5f-4.1JqM // mac GET /resource/1 HTTP/1.1 Host: example.com Authorization: MAC id="h480djs93hd8", nonce="274312:dj83hs9s", mac="kDZvddkndxvhGRXZhvuDjEhGeE=" ``` **认è¯è¯·æ±æ¹å¼** 使ç¨Tokenç认è¯è¯·æ±çæ¹å¼æä¸ç§,客æ·ç«¯å¯ä»¥éæ©ä¸ç§æ¥å®ç°,使¯ä¸è½åæ¶ä½¿ç¨å¤ç§: * æ¾å¨è¯·æ±å¤´ * æ¾å¨è¯·æ±ä½ * æ¾å¨URI 详ç»å¦ä¸: **1 æ¾å¨è¯·æ±å¤´** æ¾å¨HeaderçAuthorizationä¸,并使ç¨Bearerå¼å¤´: ```text GET /resource HTTP/1.1 Host: server.example.com Authorization: Bearer mF_9.AAW3_AH ``` **2 æ¾å¨è¯·æ±ä½** æ¾å¨bodyä¸çaccess\_tokenåæ°ä¸,并䏿»¡è¶³ä»¥ä¸æ¡ä»¶: * HTTP请æ±å¤´çContent-Type设置æapplication/x-www-form-urlencoded. * Bodyåæ°æ¯single-part. * HTTPè¯·æ±æ¹æ³åºè¯¥æ¯æ¨èå¯ä»¥æºå¸¦Bodyåæ°çæ¹æ³,æ¯å¦POST,䏿¨èGET. 示ä¾: ```text POST /resource HTTP/1.1 Host: server.example.com Content-Type: application/x-www-form-urlencoded access_token=mF_9.B5f-4.1JqM ``` **3 æ¾å¨URI** æ¾å¨uriä¸çaccess\_tokenåæ°ä¸ ```text GET /resource?access_token=mF_9.B5f-4.1JqM Host: server.example.com ``` ### JWT #### æ¦å¿µ [JWT](https://jwt.io/)æ¯ä¸ç§å®å ¨æ åãåºæ¬æè·¯å°±æ¯ç¨æ·æä¾ç¨æ·ååå¯ç ç»è®¤è¯æå¡å¨ï¼æå¡å¨éªè¯ç¨æ·æäº¤ä¿¡æ¯ä¿¡æ¯çåæ³æ§ï¼å¦æéªè¯æåï¼ä¼äº§çå¹¶è¿åä¸ä¸ªTokenï¼ä»¤çï¼ï¼ç¨æ·å¯ä»¥ä½¿ç¨è¿ä¸ªtokenè®¿é®æå¡å¨ä¸åä¿æ¤çèµæºã > JSON Web Token \(JWT\) is a compact URL-safe means of representing claims to be transferred between two parties. The claims in a JWT are encoded as a JSON object that is digitally signed using JSON Web Signature \(JWS\). -[RFC7519](https://tools.ietf.org/html/rfc7519) #### åç JWTçç»æå为ä¸ä¸ªé¨åheader.payload.signature: * Header: åæ¾Tokenç±»ååå å¯çæ¹æ³ * Payload: å å«ä¸äºç¨æ·èº«ä»½ä¿¡æ¯. * Signature: ç¾åæ¯å°åé¢çHeader,Payloadä¿¡æ¯ä»¥åä¸ä¸ªå¯é¥ç»åèµ·æ¥å¹¶ä½¿ç¨Headerä¸çç®æ³è¿è¡å å¯ æç»çæçæ¯ä¸ä¸ªæä¸¤ä¸ª.å·è¿æ¥çå符串,å两个é¨åæ¯HeaderåPayloadçBase64ç¼ç ,æåä¸ä¸ªæ¯ç¾å,å¦ä¸: ```text eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ ``` **HEADER:ALGORITHM & TOKEN TYPE** ```text 头é¨åç®å声æäºç±»å(JWT)以å产çç¾åæä½¿ç¨çç®æ³ ``` ```text { "alg": "HS256", "typ": "JWT" } ``` **PAYLOAD:DATA** ```text 声æé¨åæ¯æ´ä¸ªtokençæ ¸å¿ï¼è¡¨ç¤ºè¦åéçç¨æ·è¯¦ç»ä¿¡æ¯ã ``` ```text { "sub": "1234567890", "name": "John Doe", "iat": 1516239022 } ``` **VERIFY SIGNATURE** ```text ç¾åçç®çæ¯ä¸ºäºä¿è¯ä¸è¾¹ä¸¤é¨åä¿¡æ¯ä¸è¢«ç¯¡æ¹ã妿å°è¯ä½¿ç¨Bas64对解ç åçtokenè¿è¡ä¿®æ¹ï¼ç¾åä¿¡æ¯å°±ä¼å¤±æãä¸è¬ä½¿ç¨ä¸ä¸ªç§é¥ï¼private keyï¼éè¿ç¹å®ç®æ³å¯¹HeaderåClaimsè¿è¡æ··æ·äº§çç¾åä¿¡æ¯ï¼æä»¥åªæåå§çtokenæè½äºç¾åä¿¡æ¯å¹é ã è¿éæä¸ä¸ªéè¦çå®ç°ç»èãåªæè·åäºç§é¥çåºç¨ç¨åºï¼æ¯å¦æå¡å¨ç«¯åºç¨ï¼æè½å®å ¨è®¤è¯tokenå å«å£°æä¿¡æ¯çåæ³æ§ãæä»¥ï¼æ°¸è¿ä¸è¦æç§é¥ä¿¡æ¯æ¾å¨å®¢æ·ç«¯ï¼æ¯å¦æµè§å¨ï¼ã ``` ```text HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), your-256-bit-secret ) secret base64 encoded ``` #### åºç¨åºæ¯ **æ ç¶æçåå¸å¼API** JWTç主è¦ä¼å¿å¨äºä½¿ç¨æ ç¶æã坿©å±çæ¹å¼å¤çåºç¨ä¸çç¨æ·ä¼è¯ãæå¡ç«¯å¯ä»¥éè¿å åµç声æä¿¡æ¯ï¼å¾å®¹æå°è·åç¨æ·çä¼è¯ä¿¡æ¯ï¼èä¸éè¦å»è®¿é®ç¨æ·æä¼è¯çæ°æ®åºãå¨ä¸ä¸ªåå¸å¼çé¢åæå¡çæ¡æ¶ä¸ï¼è¿ä¸ç¹é常æç¨ã 使¯ï¼å¦æç³»ç»ä¸éè¦ä½¿ç¨é»ååå®ç°é¿æææçtokenå·æ°æºå¶ï¼è¿ç§æ ç¶æçä¼å¿å°±ä¸ææ¾äºã **ä¼å¿** * å¿«éå¼å * ä¸éè¦cookie * JSONå¨ç§»å¨ç«¯ç广æ³åºç¨ * ä¸ä¾èµäºç¤¾äº¤ç»å½ * ç¸å¯¹ç®åçæ¦å¿µçè§£ **éå¶** * Tokenæé¿åº¦éå¶ * Tokenä¸è½æ¤é * éè¦tokenæå¤±ææ¶é´éå¶\(exp\) * OAuth2使ç¨åºæ¯ ### åè [Status Code Definitions](https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html) [JWT宿¹ç½ç«](http://jwt.io) [OAuth2宿¹ç½ç«](http://oauth.net/2/) [çè§£OAuth 2.0](http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html) [OAuth2åJWT - å¦ä½è®¾è®¡å®å ¨çAPI](https://www.jianshu.com/p/1f2d6e5126cb) [OAuth,TokenåJWT](https://www.jianshu.com/p/9f80be6ba2e9) [OAuth 2.0 Tutorial](http://tutorials.jenkov.com/oauth2/overview.html)