Oauth2.0 數據庫字段說明

轉載至:http://andaily.com/spring-oauth-server/db_table_description.html

 

spring-oauth-server 數據庫表說明

以下對spring-oauth-server項目中的oauth.ddl文件(位於/others/database目錄)中的表字及段進行說明, 內容包括字段說明與使用場合

表名 字段名 字段說明
oauth_client_details client_id 主鍵,必須唯一,不能爲空. 
用於唯一標識每一個客戶端(client); 在註冊時必須填寫(也可由服務端自動生成). 
對於不同的grant_type,該字段都是必須的. 在實際應用中的另一個名稱叫appKey,與client_id是同一個概念.
resource_ids 客戶端所能訪問的資源id集合,多個資源時用逗號(,)分隔,如: "unity-resource,mobile-resource". 
該字段的值必須來源於與security.xml中標籤‹oauth2:resource-server的屬性resource-id值一致. 在security.xml配置有幾個‹oauth2:resource-server標籤, 則該字段可以使用幾個該值. 
在實際應用中, 我們一般將資源進行分類,並分別配置對應的‹oauth2:resource-server,如訂單資源配置一個‹oauth2:resource-server, 用戶資源又配置一個‹oauth2:resource-server. 當註冊客戶端時,根據實際需要可選擇資源id,也可根據不同的註冊流程,賦予對應的資源id.
client_secret 用於指定客戶端(client)的訪問密匙; 在註冊時必須填寫(也可由服務端自動生成). 
對於不同的grant_type,該字段都是必須的. 在實際應用中的另一個名稱叫appSecret,與client_secret是同一個概念.
scope 指定客戶端申請的權限範圍,可選值包括read,write,trust;若有多個權限範圍用逗號(,)分隔,如: "read,write". 
scope的值與security.xml中配置的‹intercept-urlaccess屬性有關係. 如‹intercept-url的配置爲
‹intercept-url pattern="/m/**" access="ROLE_MOBILE,SCOPE_READ"/>
則說明訪問該URL時的客戶端必須有read權限範圍. write的配置值爲SCOPE_WRITEtrust的配置值爲SCOPE_TRUST
在實際應該中, 該值一般由服務端指定, 常用的值爲read,write.
authorized_grant_types 指定客戶端支持的grant_type,可選值包括authorization_code,password,refresh_token,implicit,client_credentials, 若支持多個grant_type用逗號(,)分隔,如: "authorization_code,password". 
在實際應用中,當註冊時,該字段是一般由服務器端指定的,而不是由申請者去選擇的,最常用的grant_type組合有: "authorization_code,refresh_token"(針對通過瀏覽器訪問的客戶端); "password,refresh_token"(針對移動設備的客戶端). 
implicitclient_credentials在實際中很少使用.
web_server_redirect_uri 客戶端的重定向URI,可爲空, 當grant_type爲authorization_codeimplicit時, 在Oauth的流程中會使用並檢查與註冊時填寫的redirect_uri是否一致. 下面分別說明:
  • 當grant_type=authorization_code時, 第一步 從 spring-oauth-server獲取 'code'時客戶端發起請求時必須有redirect_uri參數, 該參數的值必須與web_server_redirect_uri的值一致. 第二步 用 'code' 換取 'access_token' 時客戶也必須傳遞相同的redirect_uri
    在實際應用中, web_server_redirect_uri在註冊時是必須填寫的, 一般用來處理服務器返回的code, 驗證state是否合法與通過code去換取access_token值. 
    spring-oauth-client項目中, 可具體參考AuthorizationCodeController.java中的authorizationCodeCallback方法.
  • 當grant_type=implicit時通過redirect_uri的hash值來傳遞access_token值.如:
    http://localhost:7777/spring-oauth-client/implicit#access_token=dc891f4a-ac88-4ba6-8224-a2497e013865&token_type=bearer&expires_in=43199
    然後客戶端通過JS等從hash值中取到access_token值.
authorities 指定客戶端所擁有的Spring Security的權限值,可選, 若有多個權限值,用逗號(,)分隔, 如: "ROLE_UNITY,ROLE_USER". 
對於是否要設置該字段的值,要根據不同的grant_type來判斷, 若客戶端在Oauth流程中需要用戶的用戶名(username)與密碼(password)的(authorization_code,password), 
則該字段可以不需要設置值,因爲服務端將根據用戶在服務端所擁有的權限來判斷是否有權限訪問對應的API. 
但如果客戶端在Oauth流程中不需要用戶信息的(implicit,client_credentials), 
則該字段必須要設置對應的權限值, 因爲服務端將根據該字段值的權限來判斷是否有權限訪問對應的API. 

(請在spring-oauth-client項目中來測試不同grant_type時authorities的變化)

access_token_validity 設定客戶端的access_token的有效時間值(單位:秒),可選, 若不設定值則使用默認的有效時間值(60 * 60 * 12, 12小時). 
在服務端獲取的access_token JSON數據中的expires_in字段的值即爲當前access_token的有效時間值. 
在項目中, 可具體參考DefaultTokenServices.java中屬性accessTokenValiditySeconds
在實際應用中, 該值一般是由服務端處理的, 不需要客戶端自定義.
refresh_token_validity 設定客戶端的refresh_token的有效時間值(單位:秒),可選, 若不設定值則使用默認的有效時間值(60 * 60 * 24 * 30, 30天). 
若客戶端的grant_type不包括refresh_token,則不用關心該字段 在項目中, 可具體參考DefaultTokenServices.java中屬性refreshTokenValiditySeconds

在實際應用中, 該值一般是由服務端處理的, 不需要客戶端自定義.
additional_information 這是一個預留的字段,在Oauth的流程中沒有實際的使用,可選,但若設置值,必須是JSON格式的數據,如:
{"country":"CN","country_code":"086"}
按照spring-security-oauth項目中對該字段的描述 
Additional information for this client, not need by the vanilla OAuth protocol but might be useful, for example,for storing descriptive information. 
(詳見ClientDetails.javagetAdditionalInformation()方法的註釋)在實際應用中, 可以用該字段來存儲關於客戶端的一些其他信息,如客戶端的國家,地區,註冊時的IP地址等等.
create_time 數據的創建時間,精確到秒,由數據庫在插入數據時取當前系統時間自動生成(擴展字段)
archived 用於標識客戶端是否已存檔(即實現邏輯刪除),默認值爲'0'(即未存檔). 
對該字段的具體使用請參考CustomJdbcClientDetailsService.java,在該類中,擴展了在查詢client_details的SQL加上archived = 0條件 (擴展字段)
trusted 設置客戶端是否爲受信任的,默認爲'0'(即不受信任的,1爲受信任的). 
該字段只適用於grant_type="authorization_code"的情況,當用戶登錄成功後,若該值爲0,則會跳轉到讓用戶Approve的頁面讓用戶同意授權, 
若該字段爲1,則在登錄後不需要再讓用戶Approve同意授權(因爲是受信任的). 
對該字段的具體使用請參考OauthUserApprovalHandler.java. (擴展字段)
autoapprove 設置用戶是否自動Approval操作, 默認值爲 'false', 可選值包括 'true','false', 'read','write'. 
該字段只適用於grant_type="authorization_code"的情況,當用戶登錄成功後,若該值爲'true'或支持的scope值,則會跳過用戶Approve的頁面, 直接授權. 
該字段與 trusted 有類似的功能, 是 spring-security-oauth2 的 2.0 版本後添加的新屬性.

 在項目中,主要操作oauth_client_details表的類是JdbcClientDetailsService.java, 更多的細節請參考該類. 
也可以根據實際的需要,去擴展或修改該類的實現.

oauth_client_token create_time 數據的創建時間,精確到秒,由數據庫在插入數據時取當前系統時間自動生成(擴展字段)
token_id 從服務器端獲取到的access_token的值.
token 這是一個二進制的字段, 存儲的數據是OAuth2AccessToken.java對象序列化後的二進制數據.
authentication_id 該字段具有唯一性, 是根據當前的username(如果有),client_id與scope通過MD5加密生成的. 
具體實現請參考DefaultClientKeyGenerator.java類.
user_name 登錄時的用戶名
client_id  

 該表用於在客戶端系統中存儲從服務端獲取的token數據, 在spring-oauth-server項目中未使用到. 
oauth_client_token表的主要操作在JdbcClientTokenServices.java類中, 更多的細節請參考該類.

oauth_access_token create_time 數據的創建時間,精確到秒,由數據庫在插入數據時取當前系統時間自動生成(擴展字段)
token_id 該字段的值是將access_token的值通過MD5加密後存儲的.
token 存儲將OAuth2AccessToken.java對象序列化後的二進制數據, 是真實的AccessToken的數據值.
authentication_id 該字段具有唯一性, 其值是根據當前的username(如果有),client_id與scope通過MD5加密生成的. 具體實現請參考DefaultAuthenticationKeyGenerator.java類.
user_name 登錄時的用戶名, 若客戶端沒有用戶名(如grant_type="client_credentials"),則該值等於client_id
client_id  
authentication 存儲將OAuth2Authentication.java對象序列化後的二進制數據.
refresh_token 該字段的值是將refresh_token的值通過MD5加密後存儲的.

 在項目中,主要操作oauth_access_token表的對象是JdbcTokenStore.java. 更多的細節請參考該類.

oauth_refresh_token create_time 數據的創建時間,精確到秒,由數據庫在插入數據時取當前系統時間自動生成(擴展字段)
token_id 該字段的值是將refresh_token的值通過MD5加密後存儲的.
token 存儲將OAuth2RefreshToken.java對象序列化後的二進制數據.
authentication 存儲將OAuth2Authentication.java對象序列化後的二進制數據.

 在項目中,主要操作oauth_refresh_token表的對象是JdbcTokenStore.java. (與操作oauth_access_token表的對象一樣);更多的細節請參考該類. 
如果客戶端的grant_type不支持refresh_token,則不會使用該表.

oauth_code create_time 數據的創建時間,精確到秒,由數據庫在插入數據時取當前系統時間自動生成(擴展字段)
code 存儲服務端系統生成的code的值(未加密).
authentication 存儲將AuthorizationRequestHolder.java對象序列化後的二進制數據.

 在項目中,主要操作oauth_code表的對象是JdbcAuthorizationCodeServices.java. 更多的細節請參考該類. 
只有當grant_type爲"authorization_code"時,該表中才會有數據產生; 其他的grant_type沒有使用該表.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章