access key 筆記

用戶認證

後臺服務要提供公共接口給用戶調用,必需要提供認證機制,一旦用戶認證經過,才讓用戶調用API。對於次,能夠經過(access_key,secret_access_key)來認證。
這個(access_key,secret_access_key)是成對存在的。用戶要調用API必需要申請這樣的一對數據。通常工做流程是:前端

  1. 用戶在前端申請access key
  2. 服務器在後臺生成(access_key,secret_access_key),而後存進數據庫,而後把這對數據返回給用戶

用戶的調用API流程是:算法

  1. 經過secret_access_key來給請求參數簽名,而且把簽名附加到請求裏,而後發請求給服務器
  2. 服務器經過請求裏的參數access_key來查詢數據庫裏的secret_access_key,而後用secret_access_key計算請求參數的簽名是否跟請求裏的簽名一致,一致則確認用戶身份,不一致則拒絕訪問。

簽名

接下來介紹給參數簽名的方法。若是請求參數以下:數據庫

{
    'name': 'fami',
    'address': 'pek'
}

把access_key加進這個請求裏:api

{
    'name': 'fami',
    'address': 'pek',
    'access_key': 'abc'
}

將這些參數按key的字母升序排序,而後以key=value的形式表示,而後用&鏈接起來。效果以下:瀏覽器

access_key=abc&address=pek&name=fami

而後用以secret_access_key爲key用sha256(或其餘算法)對這個字符串進行簽名,若是簽名後獲得`安全

signature = 'xxxxxxxx'

那麼把這個簽名添加到請求參數裏,獲得服務器

{
    'access_key': 'abc',
    'name': 'fami',
    'address': 'pek',
    'signature': 'xxxxxxxx'
}

最終把這個發給服務器,服務器根據參數裏的access_key去查看secret_access_key,而後把參數裏的signature字段取出來,用前面的簽名方法來對剩下的參數進行簽名,若是發現本身計算的簽名跟請求參數裏的簽名同樣,那麼則經過認證。微信

安全問題

這裏會有一個問題:若是這個(access_key,secret_access_key)被別人知道了,那麼別人就會以個人身份去調用API了。確實會有這個問題,針對此,能夠用如下的方法來減少影響。app

  1. access key支持ip白名單,只有在白名單內的ip才能夠調用API。
  2. access key支持設置有效期,也就是在有效時間內,該access key有效,過了這個有效期,就拒絕訪問。
  3. access key支持修改狀態,只有狀態爲可用的狀況下,服務器纔會接受。

用戶使用API必然會擔憂安全問題。在此以外還能夠作些相似按期提醒用戶修改access key狀態,或者按期刪除access key。code

題外話

微信公衆號開發接口裏面,是經過access_token調用微信的接口的。access_token生成方式以下:

接口調用請求說明

https請求方式: GET
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET

經過傳appid, appsecret給微信api後臺,後臺就會返回access_token,這個access_token是有有效期的,有點相似瀏覽器登陸。
正常狀況下,微信會返回下述JSON數據:

{"access_token":"ACCESS_TOKEN","expires_in":7200}

不過我的以爲傳appsecret的方式不太優雅。

相關文章
相關標籤/搜索