轉載自http://www.html-js.com/?p=1297
最近看人人網的OAuth認證,發現他是OAuth2.0,之前一直看的是新浪的OAuth,是OAuth1.0.
二者還是有很多不同的,主要的不同點在access token的獲取方式.
OAuth1.0的access token獲取過來之后,就可以存到數據庫里,然后長期使用,因為它有效期很長,通常有效期是無限的.
但是OAuth2.0為了增強安全性,access token的有效期被大大縮短,通常只有幾個小時,也可以申請增加到幾十天,但是總是會有過期的時候.
為此,OAuth2.0增加了一個refresh token的概念,這個token並不能用於請求api.它是用來在access token過期后刷新access token的一個標記.
這里所描述的場景,通常是指那種長周期的應用.也就是需要一直保持用戶在線的應用.
在線並不是說用戶一直在用這個應用,也可能是用戶已經離開,我們在后台仍然可以自動維持用戶的狀態.例如一個自動發狀態的應用.用戶並不需要操作這個應用,我們會定時在后台利用用戶的accesskey幫助用戶發送狀態.這也算是用戶維持登錄狀態的一種.
登錄狀態的維持,在OAuth中靠的是access token,只要我們的應用定時從數據庫里取出用戶的access token,然后利用access token就可以使用這個用戶的身份去請求api了.
在OAuth1.0中用戶的登錄狀態是一直存在的.
在OAuth2.0中用戶的登錄狀態需要通過不斷刷新來維持.
例如上面提到的應用.假設更詳細的場景,這個應用在用戶授權之后,每天給用戶的人人網發送一條狀態報告當天的日期.
用戶授權之后,獲取到一個access token和一個refresh token,還有一個是session key,這個是國內大多數開放平台自己添加的一個標記,可以讓用戶使用http來調用api,如果沒有它,用戶只能通過https來調用api.session key的生命周期和access token是相同的.
我們把這三個值存到一個隊列的數據庫中.
然后,在每天的10點,我們遍歷這個數據庫表,取出它的access token和session key,然后用他們去請求api,如果發現他們已經過期,我們就需要利用refresh token去重新刷新,獲取新的access token和session key.然后利用他們去請求api,如果請求的時候提示refresh token也已經過期,那么這時候用戶的登錄狀態就會過期,這說明這個用戶至少2各月沒有在此應用活躍了,這個活躍不光指用戶自己在使用應用,也包括應用自動調用用戶api的行為.
每次刷新token的時候都會返回一個新的refresh token,所以說如果你的應用每個月幫用戶發一條狀態的話,走上面的流程,一直下去,這個用戶的登錄狀態一直都不會過期,至於為什么,自己去琢磨哦,琢磨透了也就理解了.
目前新浪微博的Oauth2.0的refresh token不對外開放。