實現此功能的場景是在當下用戶對手機APP體驗要求高,並且相對安全前提的推動下誕生;當你下載了一個QQ,微信第一次進行了賬號和密碼的登錄,你從此以后打開應用免去了你每日打開應用都要輸入賬號跟密碼的痛苦過程,在產品體驗方面來講,這種體驗更為讓用戶容易接受。那么,這種自動登錄如何實現;
之前在APP里面接入達達配送的時候,看到他們提供的API接口里面大致有了這個一個認證的過程,自己琢磨了一下,依稀的弄出了一個類似這樣的自動登錄的流程;
一、獲取token登錄令牌接口(可以理解為登錄接口)
這一步是需要用戶使用賬號和密碼進行登錄去獲取,用戶如果登錄成功,那么后台返回一個token及token的失效時間,及未來如果token失效之后刷新token的令牌!
返回參數示例及說明:
{ //狀態位,ok表示成功 "status":"0", //申請的有效token值 "token":"4a28d8516d42f4821e6d5782d1a79a7a", //token的有效時間,單位為秒,這里設定7天有效期(604800秒) "expires_in":"604800", //token過期情況下,用來刷新access_token值,設置30天的有效期 "refresh_token":"8ab486662d50e6d51a5a5dd6a25c9a4b" }
說明:
用戶第一次進入APP,APP判斷手機上是否存在token值,不存在,表明用戶第一次進入APP,跳轉登錄界面讓用戶進行登錄
用戶使用賬號和密碼登錄成功,后台進行認證,認證成功,返回token、expires_in、refresh_token,APP需把這幾個值安全保存在手機本地,便於下一次用戶進入app的一些流程判斷
繼續上一步中間插入一個小細節,后台在登錄成功之后,需要把token、expires_in、refresh_token(其他附加值:如設備唯一編號、或其他密令…)保存在數據庫和用戶關聯的表里,便於未來用戶自動登錄認證使用
上面步驟進行完畢,APP即跳入到應用首頁,用戶可以完全使用APP
二、刷新token登錄令牌接口
此接口是對第一個接口的一些彌補,token的過期時間原理上可以說是越短越安全,那么存在的問題就是token有一個過期時間,那么過期之后是不可能讓用戶重新輸入用戶名和密碼來重新獲取token的,那樣完全違背了提升體驗的初衷,相當於此功能是一個累贅了;
在token過期的情況,我們可以使用保存在手機本地的refresh_token去后台刷新一下token,重新獲取一組令牌信息,覆蓋掉以前保存在手機上的令牌信息,這也算是提升了一點安全性,為避免以前的令牌信息如果真落入別人之手;
此接口的請求參數可以參考以下參數:
1
2 { 3
4 //用戶賬號,大多數APP用的是手機號登錄,這里也可以是其他值,能表名是將要自動登錄的用戶即可
5
6 "username":"13000000007", 7
8 //手機設備的唯一值
9
10 "imei":"928347024892343", 11
12 //刷新token的令牌
13
14 "refresh_token":"8ab486662d50e6d51a5a5dd6a25c9a4b"
15
16 }
返回參數示例及說明:
1
2 { 3
4 //狀態位,ok表示成功
5
6 "status":"0", 7
8 //申請的有效token值
9
10 "token":"4a28d8516d42f4821e6d5782d1a79a7a", 11
12 //token的有效時間,單位為秒,這里設定7天有效期(604800秒)
13
14 "expires_in":"604800", 15
16 //token過期情況下,用來刷新access_token值,設置30天的有效期
17
18 "refresh_token":"8ab486662d50e6d51a5a5dd6a25c9a4b"
19
20 }
說明:
看着是不是和獲取token的接口返回值一樣,對,你沒有看錯,這確實就是和獲取token的接口是一樣的,把返回的這些令牌信息覆蓋掉之前保存在手機上的老的令牌信息就可以了;特別是這里為了節省請求接口的次數,刷新token成功之后就可以讓用戶跳轉到首頁進行使用app了,不用再次請求其他認證token的接口了
從請求到響應之后的一系列處理流程為:
場景是用戶過了1天之后再次打開了APP,APP首先獲取本地是否存在token,如存在,會去請求第三步的token認證接口,需要用到刷新token這個接口的前提必須是token認證接口的返回值表示token過期了,那么此時本接口(刷新登錄令牌的接口就有了作用),這里可以使用賬號、設備編號、刷新token的令牌或者你還可以自己定一些加密方案的參數一同傳入后台進行認證,當后台認證此刷新令牌(refresh_token)有效且合法,那么重新生成一組令牌保存在數據庫,同時返回這一組令牌到APP(這一組令牌全部都是需要重新生成,並且過期時間重新全部初始化)
APP同樣把成功響應的一組令牌值覆蓋掉以前保存在本地的令牌值
成功的情況,此時,可以讓用戶跳轉到首頁讓用戶使用APP
失敗的情況,如refresh_token也過期了,這里特別說一下,一般refresh_token的過期時間是比較長的,如果連這個也過期的話,說明用戶已經太久沒有使用過APP了,需要讓用戶重新登錄
三、token認證接口(可理解為自動登錄接口)
此接口相當而言算是請求頻率比較多的一個接口,他對token進行認證成功和失敗有不同的處理方式;
此接口的請求參數可以參考以下參數:
1
2 { 3
4 //用戶賬號,大多數APP用的是手機號登錄,這里也可以是其他值,能表名是將要自動登錄的用戶即可
5
6 "username":"13000000007", 7
8 //手機設備的唯一值
9
10 "imei":"928347024892343", 11
12 //token認證令牌
13
14 "token":"4a28d8516d42f4821e6d5782d1a79a7a"
15
16 }
返回參數示例及說明:
1
2 { 3
4 "status":"0"//響應結果,成功
5
6 } 7
8 or 9
10 { 11
12 "status":"1"//響應結果,token過期
13
14 }
說明:
這里如果返回成功,可以讓用戶跳轉到首頁使用APP
如果返回token過期,調用第二步的刷新token令牌的接口去重新獲取令牌