SSO單點(diǎn)登錄三種情況的實(shí)現(xiàn)方式詳解

單點(diǎn)登錄(SSO——Single Sign On)對(duì)于我們來(lái)說(shuō)已經(jīng)不陌生了。對(duì)于大型系統(tǒng)來(lái)說(shuō)使用單點(diǎn)登錄可以減少用戶很多的麻煩。就拿百度來(lái)說(shuō)吧,百度下面有很多的子系統(tǒng)——百度經(jīng)驗(yàn)、百度知道、百度文庫(kù)等等,如果我們使用這些系統(tǒng)的時(shí)候,每一個(gè)系統(tǒng)都需要我們輸入用戶名和密碼登錄一次的話,我相信用戶體驗(yàn)肯定會(huì)直線下降。當(dāng)然,對(duì)于個(gè)人博客這類(lèi)系統(tǒng)來(lái)說(shuō)根本就用不上單點(diǎn)登錄了。

假如,我們的系統(tǒng)很龐大,但是就是這一個(gè)系統(tǒng),并沒(méi)有什么子系統(tǒng)。這時(shí)我們也不需要單點(diǎn)登錄。我們需要的是搭建集群環(huán)境,這里雖說(shuō)只有一個(gè)系統(tǒng),但是多臺(tái)主機(jī)負(fù)載均衡的話就涉及到session共享的問(wèn)題了。Session共享問(wèn)題較之于SSO來(lái)說(shuō)將比較容易解決了。

好,我們不管不需要單點(diǎn)登錄的系統(tǒng)了。題目中已經(jīng)標(biāo)明了SSO單點(diǎn)登錄的三種情況,下面我們分別來(lái)介紹這三種情況。

在同一個(gè)域名下的不同站點(diǎn)是如何進(jìn)行驗(yàn)證的

我們知道,PHP表單驗(yàn)證是完全依賴于Cookie的。因此說(shuō),如果兩個(gè)站點(diǎn)可以共享相同的驗(yàn)證Cookie,這將很容易實(shí)現(xiàn)使用同一個(gè)用戶登錄多個(gè)站點(diǎn)。

按照HTTP協(xié)議規(guī)定,兩個(gè)站點(diǎn)是可以共享Cookie的。前提是這兩個(gè)站點(diǎn)是在同一個(gè)域名下面(或者是二級(jí)域名也可)。這種情況是屬于同域下的Cookie。瀏覽器會(huì)將Cookie以及該Cookie所屬的域存在本地。當(dāng)你對(duì)該域下的任何子站點(diǎn)進(jìn)行訪問(wèn)的時(shí)候,瀏覽器都會(huì)將這些Cookie發(fā)送給站點(diǎn)系統(tǒng)。

假設(shè)我們有兩個(gè)站點(diǎn)

www.onmpw.com/site1

www.onmpw.com/site2

這兩個(gè)站點(diǎn)共享同一個(gè)主機(jī)地址,并且二者在同一域名下。加入你剛剛登錄了www.onmpw.com/site1,你的瀏覽器會(huì)有一個(gè)來(lái)自www.onmpw.com/site1的身份鑒證的cookie。當(dāng)你點(diǎn)擊site1下的任何的子頁(yè)面的時(shí)候,這些cookie都會(huì)發(fā)送給site1。這是很容易理解的。同樣的,當(dāng)你請(qǐng)求www.onmpw.com/site2的時(shí)候,對(duì)于site2下面的任何頁(yè)面這些cookie也同樣會(huì)隨著請(qǐng)求發(fā)送過(guò)去。為什么是這樣,因?yàn)樵跒g覽器端存儲(chǔ)的cookie的域是www.onmpw.com。site1和site2兩個(gè)站點(diǎn)是同屬于該域的。所以對(duì)于該域下的cookie,兩個(gè)站點(diǎn)都可以得到。

這種情況,如果系統(tǒng)是PHP的話我們根本不需要進(jìn)行什么特殊的處理。只需要按照正常的驗(yàn)證方式進(jìn)行驗(yàn)證即可。因?yàn)槎叩膕essionId是相同的,只要它們的session信息是保存在同一個(gè)地方即可。

同一個(gè)域但是不同的子域如何進(jìn)行單點(diǎn)登錄

假如我們的站點(diǎn)是按照下面的域名進(jìn)行部署的

sub1.onmpw.com

sub2.onmpw.com

這兩個(gè)站點(diǎn)共享同一域onmpw.com。

默認(rèn)情況下,瀏覽器會(huì)發(fā)送cookie所屬的域?qū)?yīng)的主機(jī)。也就是說(shuō),來(lái)自于sub1.onmpw.com的cookie默認(rèn)所屬的域是.sub1.onmpw.com。因此,sub2.onmpw.com不會(huì)得到任何的屬于sub1.onmpw.com的cookie信息。因?yàn)樗鼈兪窃诓煌闹鳈C(jī)上面,并且二者的子域也是不同的。

這種情況,如果我們使用PHP來(lái)實(shí)現(xiàn)的話,可以設(shè)置二者的cookie信息在同一個(gè)域下。

第一 登錄sub1.onmpw.com系統(tǒng)

第二 登錄成功以后,設(shè)置cookie信息。這里需要注意,我們可以將用戶名和密碼存到cookie中,但是在設(shè)置的時(shí)候必須將這cookie的所屬域設(shè)置為頂級(jí)域 .onmpw.com。這里可以使用setcookie函數(shù),該函數(shù)的第四個(gè)參數(shù)是用來(lái)設(shè)置cookie所述域的。

setcookie(‘username’,’onmpw’,null,’.onmpw.com’);

setcookie(‘password’,’pwd’,null,’.onmpw.com’);

第三 訪問(wèn)sub2.onmpw.com系統(tǒng),瀏覽器會(huì)將cookie中的信息username和password附帶在請(qǐng)求中一塊兒發(fā)送到sub2.onmpw.com系統(tǒng)。這時(shí)該系統(tǒng)會(huì)先檢查session是否登錄,如果沒(méi)有登錄則驗(yàn)證cookie中的username和password從而實(shí)現(xiàn)自動(dòng)登錄。

第四 sub2.onmpw.com 登錄成功以后再寫(xiě)session信息。以后的驗(yàn)證就用自己的session信息驗(yàn)證就可以了。

當(dāng)然,先登錄sub2.onmpw.com的方式也是相同的。經(jīng)過(guò)上面的步驟就可以實(shí)現(xiàn)不同二級(jí)域名的單點(diǎn)登錄了。

但是,這里存在一個(gè)問(wèn)題就是sub1系統(tǒng)退出以后,除了可以清除自身的session信息和所屬域?yàn)?onmpw.com的cookie的信息。它并不能清除sub2系統(tǒng)的session信息。那sub2仍然是登錄狀態(tài)。也就是說(shuō),這種方式雖說(shuō)可以實(shí)現(xiàn)單點(diǎn)登錄,但是不能實(shí)現(xiàn)同時(shí)退出。原因是,sub1和sub2雖說(shuō)通過(guò)setcookie函數(shù)的設(shè)置可以共享cookie,但是二者的sessionId是不同的,而且這個(gè)sessionId在瀏覽器中也是以cookie的形式存儲(chǔ)的,不過(guò)它所屬的域并不是.onmpw.com。也就是說(shuō)二者的sessionId是不同的。

那如何解決這個(gè)問(wèn)題呢?我們知道,對(duì)于這種情況,只要是兩個(gè)系統(tǒng)的sessionId相同就可以解決這個(gè)問(wèn)題了。也就是說(shuō)存放sessionId的cookie所屬的域也是.onmpw.com。在PHP中,sessionId是在session_start()調(diào)用以后生成的。要想使sub1和sub2有共同的sessionId,那必須在session_start()之前設(shè)置sessionId所屬域。有兩種方式:

第一 使用php函數(shù)ini_set函數(shù)進(jìn)行如下設(shè)置

ini_set('session.cookie_path', '/');

ini_set('session.cookie_domain', '.onmpw.com');

ini_set('session.cookie_lifetime', '0');

第二 直接修改php.ini 文件

session.cookie_path = /

session.cookie_domain = '.onmpw.com'

session.cookie_lifetime = 0

對(duì)于這種情況,我們有兩種實(shí)現(xiàn)方式,其中我們先來(lái)介紹實(shí)現(xiàn)比較簡(jiǎn)單的方式。

方式一

為了實(shí)現(xiàn)單點(diǎn)登錄,當(dāng)用戶登錄其中的任何一個(gè)站點(diǎn)時(shí),我們需要針對(duì)其他每個(gè)站點(diǎn)在瀏覽器端設(shè)置cookie信息。

如果用戶在onmpw1站點(diǎn)進(jìn)行登錄,登錄成功授權(quán)以后,瀏覽器將會(huì)存儲(chǔ)一份兒onmpw1站點(diǎn)的cookie信息。同時(shí),為了可以登錄onmpw2和onmpw3,我們需要在設(shè)置onmpw1的cookie的同事也對(duì)onmpw2和onmpw3進(jìn)行cookie設(shè)置。因此在對(duì)onmpw1進(jìn)行響應(yīng)之前,我們需要先跳轉(zhuǎn)到onmpw2和onmpw3站點(diǎn)去設(shè)置cookie信息。


下圖是對(duì)于兩個(gè)站點(diǎn)的單點(diǎn)登錄模型(三個(gè)的圖畫(huà)起來(lái)比較麻煩,為了節(jié)省時(shí)間,就用兩個(gè)來(lái)表示,但是原理是相同的)


此種情況的驗(yàn)證步驟是這樣的:

一、用戶向www.onmpw1.com(以下簡(jiǎn)稱(chēng)onmpw1)請(qǐng)求一個(gè)需要驗(yàn)證的頁(yè)面。

[狀態(tài): 瀏覽器還沒(méi)有驗(yàn)證的cookie信息]

二、瀏覽器向onmpw1發(fā)送請(qǐng)求(該請(qǐng)求沒(méi)有cookie信息,因?yàn)樗€沒(méi)有存儲(chǔ)所屬域?yàn)閛nmpw1.com的cookie信息)。

[狀態(tài): 瀏覽器還沒(méi)有驗(yàn)證的cookie信息]

三、onmpw1發(fā)現(xiàn)在請(qǐng)求中沒(méi)有帶cookie信息,所以它將請(qǐng)求重定向到登錄頁(yè)面

[狀態(tài): 瀏覽器還沒(méi)有驗(yàn)證的cookie信息]

四、用戶提交了登錄所需驗(yàn)證的信息并且點(diǎn)擊登錄按鈕,瀏覽器發(fā)送一個(gè)post請(qǐng)求到onmpw1。

[狀態(tài): 瀏覽器還沒(méi)有驗(yàn)證的cookie信息]

五、onmpw1收到提交的驗(yàn)證信息,開(kāi)始驗(yàn)證這些信息。如果驗(yàn)證成功,則標(biāo)記該用戶已經(jīng)登錄。然后會(huì)創(chuàng)建帶有登錄用戶信息的cookie,并將其加入響應(yīng)信息中。

[狀態(tài): 瀏覽器還沒(méi)有驗(yàn)證的cookie信息]

六、onmpw1暫時(shí)還不去響應(yīng)瀏覽器的請(qǐng)求。這時(shí)它將會(huì)向?yàn)g覽器發(fā)送重定向到www.onmpw2.com(以下簡(jiǎn)稱(chēng)onmpw2)的命令,并且還帶有在onmpw2站點(diǎn)需要返回的url地址,該地址為最初onmpw1中的。因?yàn)閏ookie信息已經(jīng)在響應(yīng)信息中,所以這個(gè)cookie也被發(fā)送給瀏覽器了。

[狀態(tài): 瀏覽器還沒(méi)有驗(yàn)證的cookie信息]

七、瀏覽器接收道帶有驗(yàn)證的cookie信息和重定向到onmpw2的命令的響應(yīng)信息以后,將cookie信息的域設(shè)置為onmpw2存儲(chǔ)到本地,并且想onmpw2發(fā)送請(qǐng)求。這個(gè)請(qǐng)求中會(huì)帶有剛才的cookie信息。

[狀態(tài):瀏覽器中已經(jīng)有所屬域?yàn)閛nmpw2的cookie信息]

八、onmpw2立刻會(huì)重定向到需要返回的url地址,并且通過(guò)讀取瀏覽器發(fā)送的cookie信息,獲取到onmpw1的cookie。并將這cookie也一同發(fā)送給瀏覽器。

[狀態(tài):瀏覽器中已經(jīng)有所屬域?yàn)閛nmpw2的cookie信息]

九、瀏覽器在接受到這些信息以后,會(huì)將所屬域?yàn)閛nmpw1的cookie存儲(chǔ)在本地。并且再次向onmpw1發(fā)送一個(gè)帶有cookie信息的請(qǐng)求。

[狀態(tài):瀏覽器中已經(jīng)有所屬域?yàn)閛nmpw2和onmpw1的cookie信息]

十、onmpw1接收到驗(yàn)證信息以后,知道驗(yàn)證cookie已經(jīng)設(shè)置成功。此時(shí)onmpw1會(huì)返回相應(yīng)的請(qǐng)求界面,而不再是登錄界面。

[狀態(tài):瀏覽器中已經(jīng)有所屬域?yàn)閛nmpw2和onmpw1的cookie信息]

所以說(shuō),當(dāng)用戶再次訪問(wèn)onmpw2的時(shí)候,cookie信息已經(jīng)存儲(chǔ)到瀏覽器中了。這時(shí)onmpw2會(huì)在cookie中讀取到登錄的用戶的信息,然后提供相應(yīng)的界面給瀏覽器。

這樣,單點(diǎn)登錄就已經(jīng)設(shè)置成功了。在本例中,按照上述步驟,登錄onmpw1以后,onmpw2和onmpw3就可以同時(shí)實(shí)現(xiàn)登錄了。

如何退出登錄

既然我們已經(jīng)實(shí)現(xiàn)了單點(diǎn)登錄,但是我們還得考慮退出的問(wèn)題。既然是同時(shí)登錄的,那總不能在退出的時(shí)候一個(gè)一個(gè)的退出吧!所以說(shuō)我們還要設(shè)置單點(diǎn)退出。

要想實(shí)現(xiàn)單點(diǎn)退出,在本例中,我們需要做的是當(dāng)在一個(gè)站點(diǎn)退出的時(shí)候,其他兩個(gè)站點(diǎn)的cookie同樣也需要在瀏覽器中清除。這樣才可以實(shí)現(xiàn)單點(diǎn)退出。

這樣其實(shí)也很簡(jiǎn)單,在理解了上述單點(diǎn)登錄的流程以后,單點(diǎn)退出只是按照上面的步驟將設(shè)置驗(yàn)證cookie改成從響應(yīng)信息中移除cookie就可以實(shí)現(xiàn)了。

對(duì)于這種情況,不管是單點(diǎn)登錄也好,還是單點(diǎn)退出。都存在一個(gè)問(wèn)題,在本例中我們只是有三個(gè)站點(diǎn)。如果說(shuō)我們整個(gè)系統(tǒng)有10個(gè)20個(gè)或者更多站點(diǎn),那像我們這樣來(lái)回的重定向會(huì)很影響效率。

方式二

接下來(lái)我們來(lái)介紹另一種方式。這種方式需要我們借助一個(gè)單獨(dú)的SSO服務(wù),專(zhuān)門(mén)做驗(yàn)證用。而且我們還需要對(duì)于不同的站點(diǎn)的用戶要有一個(gè)統(tǒng)一的用戶數(shù)據(jù)。相對(duì)于前一種方式——瀏覽器需要存儲(chǔ)每個(gè)站點(diǎn)的cookie——來(lái)說(shuō),這種方式瀏覽器只需要存儲(chǔ)SSO服務(wù)站點(diǎn)的cookie信息。將這個(gè)cookie信息用于其他站點(diǎn)從而實(shí)現(xiàn)單點(diǎn)登錄。我們暫且將這個(gè)SSO服務(wù)站點(diǎn)成為www.SSOsite.com(以下簡(jiǎn)稱(chēng)SSOsite)。

在這種模型下,針對(duì)任何站點(diǎn)的請(qǐng)求都將會(huì)先重定向到SSOsite去驗(yàn)證一個(gè)身份驗(yàn)證cookie是否存在。如果存在,則驗(yàn)證過(guò)的頁(yè)面將會(huì)發(fā)送給瀏覽器。否則用戶將會(huì)被重定向到登錄頁(yè)面。


為了理解此種方式,現(xiàn)在假設(shè)我們來(lái)運(yùn)用這種模型實(shí)現(xiàn)以下兩個(gè)站點(diǎn)的單點(diǎn)登錄。

www.onmpw1.com(以下簡(jiǎn)稱(chēng)onmpw1)

www.onmpw2.com(以下簡(jiǎn)稱(chēng)onmpw2)

并且我們還有一個(gè)專(zhuān)門(mén)用來(lái)進(jìn)行驗(yàn)證的服務(wù)站點(diǎn)www.SSOsite.com(以下簡(jiǎn)稱(chēng)SSOsite) 。

第一部分


實(shí)現(xiàn)流程

·用戶請(qǐng)求onmpw1的一個(gè)需要驗(yàn)證的頁(yè)面

·onmpw1向?yàn)g覽器發(fā)送重定向到SSOsite的命令。并且在地址中添加一個(gè)返回地址(ReturnUrl)參數(shù)query string,該參數(shù)的值就是最初向onmpw1請(qǐng)求的地址。

·SSOsite會(huì)在請(qǐng)求中檢查是否有身份驗(yàn)證cookie,或者任何用戶token。沒(méi)有這些信息,則會(huì)再次重定向到onmpw1,在重定向到onmpw1中的請(qǐng)求中會(huì)帶有參數(shù)讓用戶登錄的url參數(shù)和最初的瀏覽器請(qǐng)求onmpw1的地址——ReturnUrl。

·onmpw1會(huì)檢測(cè)從SSOsite重定向來(lái)的請(qǐng)求的參數(shù)。這時(shí)onmpw1了解到該用戶需要登錄,因此onmpw1會(huì)重定向到登錄界面,并且通知瀏覽器該請(qǐng)求不用再重定向到SSOsite。

第二部分


·用戶提供了身份驗(yàn)證信息并且點(diǎn)擊了登錄按鈕。現(xiàn)在不會(huì)再去重定向到SSOsite。這時(shí),onmpw1調(diào)用SSOsite 中的web/WCF服務(wù)去檢查用戶提供的身份驗(yàn)證信息。成功驗(yàn)證,會(huì)將帶有token屬性的用戶對(duì)象返回給onmpw1。而這個(gè)token是每一次用戶登錄都會(huì)生成的。

·onmpw1標(biāo)記用戶已經(jīng)登錄成功,然后會(huì)生成一個(gè)URL地址,該地址會(huì)帶有用戶token,重定向到SSOsite。

·SSOsite檢查收到的URL地址,會(huì)在其中發(fā)現(xiàn)用戶token。通過(guò)該token可以知道用戶已經(jīng)成功登錄onmpw1了,所以SSOsite需要準(zhǔn)備驗(yàn)證的cookie信息。因此,它會(huì)使用token在緩存中取出用戶信息來(lái)生成cookie信息,而且還會(huì)在cookie中設(shè)置一些其他的信息(例如過(guò)期時(shí)間等)。然后把cookie加入到響應(yīng)信息中。最后重定向到最初的ReturnUrl地址。同時(shí)token還是要被加在query string中帶過(guò)去的。

·瀏覽器得到重定向到onmpw1的命令,并且從SSOsite中得到cookie信息。因此瀏覽器將所屬域?yàn)镾SOsite的cookie保存在本地。然后帶著token去請(qǐng)求onmpw1。

·現(xiàn)在onmpw1看到用戶token在query string 參數(shù)中,然后會(huì)再次通過(guò)web/WCF服務(wù)去在SSOsite上驗(yàn)證token。驗(yàn)證成功以后會(huì)將最初剛開(kāi)始請(qǐng)求的頁(yè)面發(fā)送給瀏覽器用于向用戶輸出。

第三部分


·用戶現(xiàn)在去請(qǐng)求onmpw2。

·onmpw2重定向到SSOsite,同樣設(shè)置ReturnUrl為剛開(kāi)始請(qǐng)求的onmpw2的頁(yè)面地址。

·瀏覽器接收到重定向的命令以后,因?yàn)楸镜卮嬖赟SOsite的cookie,所以會(huì)cookie加到請(qǐng)求中發(fā)送給SSOsite。

·SSOsite檢查接收到的請(qǐng)求中發(fā)現(xiàn)有cookie信息,首先會(huì)檢查該cookie信息是否過(guò)期,如果沒(méi)有過(guò)期,將會(huì)從cookie中提取出用戶token。然后帶著token重定向到最初的onmpw2中的地址。

·onmpw2發(fā)現(xiàn)請(qǐng)求中有用戶token,然后他會(huì)通過(guò)SSOsite的web/WCF服務(wù)驗(yàn)證token的合法性。驗(yàn)證成功以后,將最初瀏覽器請(qǐng)求onmpw2的頁(yè)面發(fā)送給瀏覽器用以向用戶輸出。

總結(jié)

哇哦,看起來(lái)有很多東西需要做。其實(shí)并沒(méi)有那么復(fù)雜。

起初,瀏覽器沒(méi)有所屬域?yàn)镾SOsite的cookie信息。因此無(wú)論是點(diǎn)擊任何站點(diǎn)的需要驗(yàn)證的界面都會(huì)跳轉(zhuǎn)到登錄頁(yè)(這個(gè)過(guò)程是由程序內(nèi)部重定向到SSOsite來(lái)檢查是否存在cookie的)。一旦用戶登錄成功,所屬域?yàn)镾SOsite的,并且?guī)в械卿浻脩粜畔⒌腸ookie會(huì)被瀏覽器存儲(chǔ)在本地。

然后,當(dāng)用戶再次訪問(wèn)需要驗(yàn)證的頁(yè)面的時(shí)候,同樣請(qǐng)求會(huì)在被重定向到SSOsite,并且瀏覽器會(huì)帶上先前已經(jīng)保存的cookie信息。SSOsite檢索cookie,從中提取出用戶token,并帶著這個(gè)token重定向到最初請(qǐng)求的站點(diǎn)頁(yè)面。然后該站點(diǎn)會(huì)通過(guò)web/WCF服務(wù)去驗(yàn)證token的合法性。然后將相應(yīng)的頁(yè)面發(fā)送給客戶端。

一旦用戶通過(guò)該單點(diǎn)登錄模型登錄到站點(diǎn)上,請(qǐng)求任何需要驗(yàn)證的頁(yè)面都會(huì)內(nèi)部重定向到SSOsite驗(yàn)證cookie和提取用戶token,然后將請(qǐng)求的頁(yè)面發(fā)送給瀏覽器輸出。

本文比較長(zhǎng),顯得有些啰嗦。但是總是希望過(guò)程能給大家講清楚。希望本文對(duì)大家有所幫助。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,565評(píng)論 6 539
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,115評(píng)論 3 423
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 177,577評(píng)論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 63,514評(píng)論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,234評(píng)論 6 410
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 55,621評(píng)論 1 326
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,641評(píng)論 3 444
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 42,822評(píng)論 0 289
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,380評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,128評(píng)論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,319評(píng)論 1 371
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,879評(píng)論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,548評(píng)論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 34,970評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 36,229評(píng)論 1 291
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,048評(píng)論 3 397
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,285評(píng)論 2 376

推薦閱讀更多精彩內(nèi)容