導航:首頁 > IDC知識 > oauth伺服器

oauth伺服器

發布時間:2020-12-28 06:42:39

1、shiro+oauth2伺服器端是怎麼實現的

還是來把代碼貼出來吧. 程序源是順序執行的. 你的情況根據描述可能是第一次循環沒執行完,就開始了 第二次循環,然後第三次循環.. 你可以把數量設置低一些,一次寫3W條試試, 一次寫1W條試試. 或者先循環一次,break,看看有沒有問題,然後循環2次,

2、spring security oauth2 搭建資源伺服器,如何配置受保護資源,我想配置order路徑為保護資源,不起作用

我做了一個demo,你可以看下,有不懂的再問吧,

網頁鏈接

3、如何使用web api開發oauth2.0服務

連續2天的Peyote實驗後(你可能會找到更好的放鬆辦法),結論終於呈現在你眼前:Amazon是擁有最大的、使用最多的在線網路API的網路服務之一,並且根本不支持OAuth!
經過一個下午長時間的狂想之後,你最終敗下陣來,並看到Amazon是如何保持API請求安全的。你不清楚為什麼,但讀完整頁關於如何為Amazon網路服務裝配一個請求後,你依然覺得不完全合理。這個「簽名」和什麼連在一起?代碼示例中的「data」參數是什麼?這樣,你會繼續查找關於「安全API設計」的文章。。。
當遇到其他人問同樣的問題時,你看到一些指出"HMAC"或其他事物的優秀回復,但還是不太確定。
你找到其他鼓勵你使用「HMAC」的文章並且你正H-FINE地使用它,如果有人將「HMAC」解釋成簡明的H_ENGLISH的話。
你的確偶遇了一個有道理的蒸餾的基本概念,它是這樣一簡明的英語描述的:
一個伺服器和客戶端知道一個公鑰和一個私鑰;只有伺服器和客戶端知道私鑰,但每個人都知道公鑰。。。但不關心別人所知道的。
一個客戶端生成一個唯一的HMAC(哈希)表示它到伺服器的請求。通過把請求數據(參數和值或XML/JSON或任何它計劃發送的數據)以及請求數據的散列blob和私鑰結合來實現。
客戶端隨後將這個HASH以及所有它將要發送的參數和值一並發給伺服器。
伺服器接到請求,並使用與客戶端相同的方式重新生成自己獨有的基於提交值的HMAC(哈希)。
然後,伺服器比較這兩個HMAC,如果相同,伺服器就信任這個客戶端並執行請求。
這似乎很直截了當。最初讓你困惑的是,你以為原始請求是經過加密傳送的,但實際上,HMAC方法所做的一切只是使用只有客戶端和伺服器才知道的私鑰將參數生成為一些獨特的校驗和(哈希)。
隨後,客戶端將這個校驗和及原始參數和值發給伺服器,然後伺服器復核校驗和(哈希)以確定它接受客戶端所發的請求。
因為根據假設,只有在客戶端和伺服器知道私鑰,我們假設如果他們的哈希匹配,那麼它們會互相信任,以至伺服器隨即正常處理這個請求。
你知道在現實中,這就相當於某人過來對你說:「Jimmy讓我告訴你把錢給Johnny」,但你不知道這個人是誰,所以你要伸出手去試探他,看看他是否知道這個秘密握手。
如果三次握手證明無誤,則通訊繼續進行,否則中斷通訊。.

4、如何使用 Oauth 實現一個安全的 REST API 服務

連續2天的Peyote實驗後(你可能會找到更好的放鬆辦法),結論終於呈現在你眼前:是擁有最大的、使用最多的在線網路API的網路服務之一,並且根本不支持OAuth!
經過一個下午長時間的狂想之後,你最終敗下陣來,並看到Amazon是如何保持API請求安全的。你不清楚為什麼,但讀完整頁關於如何為Amazon網路服務裝配一個請求後,你依然覺得不完全合理。這個「簽名」和什麼連在一起?代碼示例中的「data」參數是什麼?這樣,你會繼續查找關於「安全API設計」的文章。。。
當遇到其他人問同樣的問題時,你看到一些指出"HMAC"或其他事物的優秀回復,但還是不太確定。

你找到其他鼓勵你使用「HMAC」的文章並且你正H-FINE地使用它,如果有人將「HMAC」解釋成簡明的H_ENGLISH的話。
你的確偶遇了一個有道理的蒸餾的基本概念,它是這樣一簡明的英語描述的:
一個伺服器和客戶端知道一個公鑰和一個私鑰;只有伺服器和客戶端知道私鑰,但每個人都知道公鑰。。。但不關心別人所知道的。
一個客戶端生成一個唯一的HMAC(哈希)表示它到伺服器的請求。通過把請求數據(參數和值或XML/JSON或任何它計劃發送的數據)以及請求數據的散列blob和私鑰結合來實現。
客戶端隨後將這個HASH以及所有它將要發送的參數和值一並發給伺服器。
伺服器接到請求,並使用與客戶端相同的方式重新生成自己獨有的基於提交值的HMAC(哈希)。
然後,伺服器比較這兩個HMAC,如果相同,伺服器就信任這個客戶端並執行請求。

這似乎很直截了當。最初讓你困惑的是,你以為原始請求是經過加密傳送的,但實際上,HMAC方法所做的一切只是使用只有客戶端和伺服器才知道的私鑰將參數生成為一些獨特的校驗和(哈希)。
隨後,客戶端將這個校驗和及原始參數和值發給伺服器,然後伺服器復核校驗和(哈希)以確定它接受客戶端所發的請求。
因為根據假設,只有在客戶端和伺服器知道私鑰,我們假設如果他們的哈希匹配,那麼它們會互相信任,以至伺服器隨即正常處理這個請求。
你知道在現實中,這就相當於某人過來對你說:「Jimmy讓我告訴你把錢給Johnny」,但你不知道這個人是誰,所以你要伸出手去試探他,看看他是否知道這個秘密握手。

如果三次握手證明無誤,則通訊繼續進行,否則中斷通訊。.

你明白了大概是怎麼回事,但還是想會不會還有更好的方法呢?還好,有tarsnap網站 tarsnap幫你答疑解惑。看看亞馬遜是如何解決簽名認證問題的Amazon screwed this up with Signature Version 1.

看完了亞馬遜的web service是如何鑒權的,re-read how Amazon Web Services does authentication 講的確實有道理,整個流程如下:
[客戶端]在調用REST API之前,首先將待發送消息體打包, combine a bunch of unique data together(websevice端將要接收的數據)

[客戶端]用系統分派的密鑰使用哈希(最好是HMAC-SHA1 or SHA256 ) 加密(第一步的數據).

[客戶端]向伺服器發送數據:

用戶身份認證信息例如,用戶ID,客戶ID或是其他能別用戶身份的信息。這是公共API,大家都能訪問的到(自然也包括了那些居心叵測的訪問者)系統僅僅需要這部分信息來區分發信人而不考慮可靠與否(當然可以通過HMAC來判斷可靠性).

發送生成的HMAC碼.
發送消息體(屬性名和屬性值),如果是私有信息需要加密,像是(「mode=start&number=4&order=desc」或其他不重要的信息)直接發送即可.
(可選項)避免重放攻擊 「replay attacks」 o的唯一辦法就是加上時間戳。在使用HMAC演算法時加入時間戳,這樣系統就能依據一定的條件去驗證是否有重放的請求並拒絕.

[伺服器端]接收客戶端發來的消息.
[伺服器端] (參看可選項)檢查接收時間和發送時間的間隔是否在允許范圍內(5-15分)以避免重放攻擊replay attacks.
提示: 確保待檢對象的時區無誤daylight savings time
更新: 最近得到的結論就是直接使用UTC時區而無需考慮DST的問題 use UTC time .
[伺服器端]使用發送請求中用戶信息(比如.API值)從資料庫檢索出對應的私匙.

[伺服器端]

跟客戶端相同,先將消息體打包然後用剛得到的私匙加密(生成HMAC)消息體.
(參看可選項) 如果你使用了加入時間戳的方式避免重放攻擊,請確保服務端生成的加密信息中擁有和客戶端相同的時間戳信息以避免中間人攻擊man-in-the-middle attack.
[伺服器端] 就像在客戶端一樣,使用HMAC哈希加密剛才的信息體.

[伺服器端]

將伺服器端剛生成的哈希與客戶端的對比。如果一致,則通訊繼續;否則,拒絕請求!

提示: 在打包消息體的時候一定要考慮清楚,如果像亞馬遜進行簽名版本1中信息識別那樣會面臨哈希沖突的問題 open yourself up to hash-collisions! (建議:將整個包含URL的請求加密即可!)
特別提示:私匙絕對不能在通訊過程中傳遞,它僅僅用來生成HMAC,伺服器端會自動查詢出它的私匙並重新生成自己的HMAC.我來翻譯公匙僅僅用來區分不同的用戶,即使被破解也無所謂。因為此時的消息無需判斷其可靠性,服務端和客戶端還是要通過私匙來加密(比如,前綴、後綴,倍數等等)

10/13/11更新:Chris最近發現 pointed out 如果在HMAC計算中加入了URI或是HTTP請求/回復,攻擊者更易通過更改末端或是HTTP方法來搞破壞。比如,在HTTP POST方法中將/issue/create改成/user/delete。多謝Chris的提醒!

總結

經過幾天的煎熬,你終於設計出了一個安全的API訪問機制,感到很驕傲吧。更值得驕傲的是,通過這種設計方式很好的避開了另一種常見的API訪問危機:劫持 side-jacking.
會話劫持是通過嗅探出的會話ID來破解短時效的操作數(比如,1小時內).但採用上面的設計就很好的避免了這一點,因為通訊過程中往來操作均被校驗過,根本無需生成會話ID.

興奮啊.
但是你慢慢的意識到在某些時候確實還是得使用OAuth,have to implement OAuth, 也許就是還未成熟的 isn』t quite ready yet OAuth2.0吧 OAuth 2.0 support
我也剛接觸RESTful架構沒多長時間,只是關注了一下客戶端的包文件部分 client-side libraries.
如果上文中遺漏了什麼,請幫忙之處,我會盡快修訂。如果您對上文中有任何的意見和建議,請留下您的寶貴意見。
或者,也可以給我發郵件,一起討論一下!

留觀室(待解決問題)

<此處已刪除,只要你使用UTC時區 using UTC time 就不會有時差問題了,所以我的提議也沒什麼意義了.>

題外話

如果是為Twitter這種模式開發API呢,那會有成千上萬台手機上安裝被植入公匙私匙的應用private keys embedded in the app。
在設備上,用戶很可能破解出應用中的私匙,這不是很危險么?
是的,是很危險。
那該怎麼辦呢?
按照Twitter的說法,這種情況無法避免。應用需要它的私匙(它們稱之為密匙),那也意味著在安全方面要做出妥協。
目前能做的就是生成應用級別的私匙而非用戶級別的。那樣的話,如果應用被黑了可以禁用直到發布包含新生成私匙的新版本應用。

如果剛更新的私匙又被黑了怎麼辦?
對,這很有可能。你可以自己再加密原有的私匙,或是祈求自己的應用不會再被黑掉.
無所謂,你甚至可以再加密一次私匙但至少這樣你就能在凶險的網路環境中使用自己的新應用了。這總比賬戶被鎖,應用無法使用要好得多.

更新#1:在評論中有很多很好的建議和觀點,我在這引述幾條:
使用nonce 「nonce」來避開重放攻擊 (每次都採用不同的token)並實現idempotentcy implement idempotentcy in your API.
上面的演算法跟雙數據模式的OAutho1.0有95%的相似「95% similar to 『two-legged』 OAuth 1.0「,所以還是看一下OAuth的說明為妙.
通過SSL發送消息可以減少復雜的安全性訪問設計sending all traffic to go over SSL (HTTPS)!
更新 #2: 我又看了一下雙數據模式的OAuth,正如大家指出的,確實跟上面的過程很像。使用OAuth的唯一好處就是有很多現成的客戶端庫文件 OAuth client libraries

關於OAuth需要注意的地方:
OAuth的說明文檔super-specific 指出了如何在HMAC計算中完成轉碼,排序並打包(在OAuth叫「方法標識「)
在OAuth使用HMAC-SHA1加密時,會要求發送端提供一個簡述隨機數。並以此簡述隨機數和時間戳來確保請求的唯一性(潛在的「重放攻擊」 )原理上,你可以在數據存儲後失效這些數據,但最好還是把它們保存在文件中以便後用.
簡述隨機數可以公開。它就是在關聯某個時間戳時附加的一些欄位。它們的關系就好像一個指紋來確保「12:22pm 收到一條包含HdjS872djas83的消息請求 「這就杜絕了使用中間人重放攻擊的可能,因為所有HMAC加密演算法中都同時含有簡述隨機數和時間戳。如果受到攻擊,它會告訴你」這條消息兩小時前處理過了,你想干什麼呢?!」
這些所有的數據都以逗號分隔並塞入很大的鑒權HTTP包頭中,而並非通過GET方法傳值.
這確實是雙數據模式的OAuth的過人之處。HMAC計算時需要的請求數據無需改變就原封不動的放在那裡,發送過程中的簡述隨機數和時間戳也一樣就連發送請求中的參數也一樣.

5、自己建DNS伺服器對公網開放進行解析需要什麼手續?怎麼拿到根伺服器的授權?

。。。不需要什麼手續的,根DNS是接受任何遞歸查詢請求的。你自己用bind搭建個dns默認就是向根DNS查詢版了,不需權要任何人批准。或者你也可以遞歸到其他公共DNS上,例如OneDNS等,這樣比直接遞歸到根DNS要快些。

6、自己大家DNS伺服器然後對公網開放,怎麼拿到授權

自己開這個做什麼,又沒任何好處,

你應該就是個轉發,又沒任何數據對吧

7、Oracle伺服器執行錯誤 java.sql.SQLException: OAUTH 編集失敗

jdk的版本問題,你升級一下jdk的版本吧,我之前也遇到過這個問題,jdk是1.6.0_10的,升級到1.6.0_30就解決了

8、如何設計伺服器端 OAuth2 access token 的存儲

資料庫保存你最後獲來取自到的access_token就可以了,當然,現在由於有refresh_token的存在,你還必須保存下refresh_token和過期時間,以用於更新access_token 至於access_token如何使用,其實就是相當於一個key你直接使用就可以了,你可以看這里 比...

9、請求因HTTP狀態401失敗:Unauthorized 的原因?

HTTP401錯誤原因:用戶沒有訪問許可權,需要進行身份認證。

任何客戶端 ( 例如您的瀏覽器) ,都需要通過以下循環:從站點的 IP 名稱 ( 即您站點的網址-URL, 不帶起始的 『http://') 獲得一個 IP 地址。這個對應關系 ( 即由 IP 名稱向 IP 地址轉換的對應關系 ) 由域名伺服器 (DNSs) 提供。

打開一個 IP 套接字 (socket) 連接到該 IP 地址。通過該套接字寫 HTTP 數據流。從Web伺服器接受響應的 HTTP 數據流。該數據流包括狀態編碼, 其值取決於 HTTP 協議 。 解析該數據流得到 狀態編碼和其他有用信息。

該錯誤在以上所述的最後一步生成,即當客戶端收到 HTTP 狀態編碼並識別其為 401。瀏覽器接收到401錯誤信息之後,進行解釋,提供一個對話框用於輸入用戶名/密碼。在完成之後送交伺服器。伺服器驗證之後,在驗證通過的情況下把請求的資源送給瀏覽器,否則可能再送出401錯誤信息。

(9)oauth伺服器擴展資料:

相關錯誤碼:

HTTP 400 - 請求無效;

HTTP 401.1 - 未授權:登錄失敗;

HTTP 401.2 - 未授權:伺服器配置問題導致登錄失敗;

HTTP 401.3 - ACL 禁止訪問資源;

HTTP 401.4 - 未授權:授權被篩選器拒絕;

HTTP 401.5 - 未授權:ISAPI 或 CGI 授權失敗。

10、如何獲取微信用戶openid

方法/步驟
要獲取openid,必須要通過OAuth2.0來完成網頁授權才能完成的,通過OAuth2.0來完成網頁授權後,在經過用戶許可後,就可以通過授權頁面,獲得用戶的openid

如何通過OAuth2.0網頁授權呢?要先通過申請高級介面功能

申請通過後,還要做一個授權頁面,引導用戶授權就能獲得openid!

與oauth伺服器相關的知識