過程二:頒發通路令牌access_token
xx最終要擷取通路令牌access_token,才可請求受保護資源。而授權碼隻是一個換取通路令牌access_token的臨時憑證。
當小兔拿着授權碼code來請求的時候,授權服務需要為之生成最終的請求通路令牌。
第一步,驗證第三方軟體是否存在
此時,接收到的grant_type的類型為authorization_code。
String grantType = request.getParameter("grant_type");
if("authorization_code".equals(grantType)){
}
頒發通路令牌是後端完成,是以校驗app_id、app_secret。
if(!appMap.get("app_id").equals(appId)){
//app_id不存在
}
if(!appMap.get("app_secret").equals(appSecret)){
//app_secret不合法
}
第二步-驗證授權碼code值是否合法
授權服務在頒發授權碼code的階段已存儲code值,此時對比從request中接收到的code值和從存儲中取出來的code值。在我們給出的課程相關代碼中,code值對應的key是app_id和user的組合值。
String code = request.getParameter("code");
if(!isExistCode(code)){//驗證code值
//code不存在
return;
}
codeMap.remove(code);//授權碼一旦被使用,須立即廢棄
确認過授權碼code值有效後,應立刻從存儲中删除目前code值,以防止第三方軟體惡意使用一個失竊的授權碼code值來請求授權服務。
第三步-生成通路令牌access_token值
OAuth 2.0規範規定必須符合三個原則:唯一性、不連續性、不可猜性。UUID可考慮來作為示例的。
和授權碼code值一樣,需要存儲通路令牌access_token值,并将其與三方軟體應用辨別app_id和資源擁有者辨別user映射。也就是說,一個通路令牌access_token表示某一個使用者給某一個第三方軟體進行授權。
同時,授權服務還需要将授權範圍跟通路令牌access_token做綁定。最後要為該通路令牌設定一個過期時間expires_in。
Map<String,String[]> tokenScopeMap = new HashMap<String, String[]>();
String accessToken = generateAccessToken(appId,"USERTEST");//生成通路令牌access_token的值
tokenScopeMap.put(accessToken,codeScopeMap.get(code));//授權範圍與通路令牌綁定
//生成通路令牌的方法
private String generateAccessToken(String appId,String user){
String accessToken = UUID.randomUUID().toString();
String expires_in = "1";//1天時間過期
tokenMap.put(accessToken,appId+"|"+user+"|"+System.currentTimeMillis()+"|"+expires_in);
return accessToken;
}
OAuth 2.0沒有限制通路令牌内容的生成規則,可以生成一個UUID存儲,讓授權服務和受保護資源共享該資料,也可将一些必要資訊通過結構化處理放入令牌本身。我們将包含一些資訊的令牌,稱為結構化令牌,簡稱JWT。
至此,授權碼許可類型下授權服務的兩大主要過程,也就是頒發授權碼和頒發通路令牌的流程,我就與你講完了。
頒發授權碼和頒發通路令牌,就是授權服務的核心。