前后端常見的幾種鑒權(quán)方式

此文章轉(zhuǎn)載于https://blog.csdn.net/wang839305939/article/details/78713124悠咱,收藏,學(xué)習(xí)返敬!

最近在重構(gòu)公司以前產(chǎn)品的前端代碼,擯棄了以前的session-cookie鑒權(quán)方式,采用token鑒權(quán)蜈出,忙里偷閑覺得有必要對(duì)幾種常見的鑒權(quán)方式整理一下。

目前我們常用的鑒權(quán)有四種:

1.HTTP Basic Authentication

2.session-cookie

3.Token 驗(yàn)證

4.OAuth(開放授權(quán))

一.HTTP Basic Authentication

???這種授權(quán)方式是瀏覽器遵守http協(xié)議實(shí)現(xiàn)的基本授權(quán)方式,HTTP協(xié)議進(jìn)行通信的過程中涛酗,HTTP協(xié)議定義了基本認(rèn)證認(rèn)證允許HTTP服務(wù)器對(duì)客戶端進(jìn)行用戶身份證的方法铡原。

認(rèn)證過程:

??1. 客戶端向服務(wù)器請(qǐng)求數(shù)據(jù)偷厦,請(qǐng)求的內(nèi)容可能是一個(gè)網(wǎng)頁或者是一個(gè)ajax異步請(qǐng)求,此時(shí)燕刻,假設(shè)客戶端尚未被驗(yàn)證只泼,則客戶端提供如下請(qǐng)求至服務(wù)器:

Get /index.html HTTP/1.0

Host:www.google.com

??2. 服務(wù)器向客戶端發(fā)送驗(yàn)證請(qǐng)求代碼401,(WWW-Authenticate: Basic realm=”google.com”這句話是關(guān)鍵,如果沒有客戶端不會(huì)彈出用戶名和密碼輸入界面)服務(wù)器返回的數(shù)據(jù)大抵如下:

HTTP/1.0 401 Unauthorised

Server: SokEvo/1.0

WWW-Authenticate: Basic realm=”google.com”

Content-Type: text/html

Content-Length: xxx

??3. 當(dāng)符合http1.0或1.1規(guī)范的客戶端(如IE卵洗,F(xiàn)IREFOX)收到401返回值時(shí)请唱,將自動(dòng)彈出一個(gè)登錄窗口,要求用戶輸入用戶名和密碼过蹂。

??4. 用戶輸入用戶名和密碼后十绑,將用戶名及密碼以BASE64加密方式加密,并將密文放入前一條請(qǐng)求信息中酷勺,則客戶端發(fā)送的第一條請(qǐng)求信息則變成如下內(nèi)容:

Get /index.html HTTP/1.0

Host:www.google.com

Authorization: Basic d2FuZzp3YW5n

注:d2FuZzp3YW5n表示加密后的用戶名及密碼(用戶名:密碼 然后通過base64加密本橙,加密過程是瀏覽器默認(rèn)的行為,不需要我們?nèi)藶榧用艽嗨撸覀冎恍枰斎胗脩裘艽a即可)

??5. 服務(wù)器收到上述請(qǐng)求信息后甚亭,將Authorization字段后的用戶信息取出、解密击胜,將解密后的用戶名及密碼與用戶數(shù)據(jù)庫進(jìn)行比較驗(yàn)證狂鞋,如用戶名及密碼正確,服務(wù)器則根據(jù)請(qǐng)求潜的,將所請(qǐng)求資源發(fā)送給客戶端

效果:

客戶端未未認(rèn)證的時(shí)候骚揍,會(huì)彈出用戶名密碼輸入框,這個(gè)時(shí)候請(qǐng)求時(shí)屬于pending狀態(tài)啰挪,這個(gè)時(shí)候其實(shí)服務(wù)當(dāng)用戶輸入用戶名密碼的時(shí)候客戶端會(huì)再次發(fā)送帶Authentication頭的請(qǐng)求信不。

?

認(rèn)證成功:

?

server.js

let express = require("express");

let app = express();

? ? app.use(express.static(__dirname+'/public'));

? ? app.get("/Authentication_base",function(req,res){

? ? ? ? console.log('req.headers.authorization:',req.headers)

? ? ? ? if(!req.headers.authorization){

? ? ? ? ? ? res.set({

? ? ? ? ? ? ? 'WWW-Authenticate':'Basic realm="wang"'

? ? ? ? ? ? });

? ? ? ? ? ? res.status(401).end();

? ? ? ? }else{

? ? ? ? ? ? let base64 = req.headers.authorization.split(" ")[1];

? ? ? ? ? ? let userPass = new Buffer(base64, 'base64').toString().split(":");

? ? ? ? ? ? let user = userPass[0];

? ? ? ? ? ? let pass = userPass[1];

? ? ? ? ? ? if(user=="wang"&&pass="wang"){

? ? ? ? ? ? ? ? res.end("OK");

? ? ? ? ? ? }else{

? ? ? ? ? ? ? ? res.status(401).end();

? ? ? ? ? ? }

? ? ? ? }

? ? })

? ? app.listen(9090)

index.html:

<!DOCTYPE html>

<html>

? ? <head>

? ? ? ? <meta charset="UTF-8">

? ? ? ? <title>HTTP Basic Authentication</title>

? ? </head>

? ? <body>

? ? ? ? <div></div>

? ? ? ? <script src="js/jquery-3.2.1.js"></script>

? ? ? ? <script>

? ? ? ? ? ? $(function(){

? ? ? ? ? ? ? send('./Authentication_base');

? ? ? ? ? ? })

? ? ? ? ? ? var send = function(url){

? ? ? ? ? ? ? ? ? ? ? ? $.ajax({?

? ? ? ? ? ? ? ? ? ? ? ? url : url,?

? ? ? ? ? ? ? ? ? ? ? ? method : 'GET',?

? ? ? ? ? ? ? ? ? ? });

? ? ? ? ? }

? ? ? ? </script>

? ? </body>

</html>

當(dāng)然有登陸就有注銷,我們會(huì)發(fā)現(xiàn)當(dāng)我們認(rèn)證成功后每次請(qǐng)求請(qǐng)求頭都會(huì)帶上Authentication及里面的內(nèi)容亡呵,那么如何做到讓這次登陸失效的抽活?

??網(wǎng)上查了半天,目前最有效的方式就是在注銷操作的時(shí)候锰什,專門在服務(wù)器設(shè)置一個(gè)專門的注銷賬號(hào)下硕,當(dāng)接收到的Authentication信息為注銷用戶名密碼的時(shí)候糾就帶便注銷成功了,而客戶端在注銷操作的時(shí)候汁胆,手動(dòng)的的去修改請(qǐng)求頭重的Authentication梭姓,將他設(shè)置未服務(wù)器默認(rèn)的注銷賬號(hào)和密碼。

??通過上面的簡單講解 其實(shí)我們已經(jīng)可以返現(xiàn)這種驗(yàn)證方式的缺陷加密方式簡單嫩码,僅僅是base64加密誉尖,這種加密方式是可逆的。同時(shí)在每個(gè)請(qǐng)求的頭上都會(huì)附帶上用戶名和密碼信息铸题,這樣在外網(wǎng)是很容易被嗅探器探測到的铡恕。

總結(jié):

??正式因?yàn)檫@樣琢感,這種加密方式一般多被用在內(nèi)部安全性要求不高的的系統(tǒng)上,只是相對(duì)的多探熔,總的來說現(xiàn)在使用這種鑒權(quán)比較少了驹针。如果項(xiàng)目需要部署在公網(wǎng)上,這種方式不推薦诀艰,當(dāng)然你也可以和SSL來加密傳輸柬甥,這樣會(huì)好一點(diǎn),這個(gè)如果我后面有時(shí)間來研究一下涡驮。

二.session-cookie

第二種這個(gè)方式是利用服務(wù)器端的session(會(huì)話)和瀏覽器端的cookie來實(shí)現(xiàn)前后端的認(rèn)證,由于http請(qǐng)求時(shí)是無狀態(tài)的喜滨,服務(wù)器正常情況下是不知道當(dāng)前請(qǐng)求之前有沒有來過捉捅,這個(gè)時(shí)候我們?nèi)绻涗洜顟B(tài),就需要在服務(wù)器端創(chuàng)建一個(gè)會(huì)話(seesion),將同一個(gè)客戶端的請(qǐng)求都維護(hù)在各自得會(huì)會(huì)話中虽风,每當(dāng)請(qǐng)求到達(dá)服務(wù)器端的時(shí)候棒口,先去查一下該客戶端有沒有在服務(wù)器端創(chuàng)建seesion什乙,如果有則已經(jīng)認(rèn)證成功了辽俗,否則就沒有認(rèn)證。

session-cookie認(rèn)證主要分四步:

1谤狡,服務(wù)器在接受客戶端首次訪問時(shí)在服務(wù)器端創(chuàng)建seesion厂抖,然后保存seesion(我們可以將seesion保存在內(nèi)存中茎毁,也可以保存在redis中,推薦使用后者)忱辅,然后給這個(gè)session生成一個(gè)唯一的標(biāo)識(shí)字符串,然后在響應(yīng)頭中種下這個(gè)唯一標(biāo)識(shí)字符串七蜘。

2.簽名。這一步只是對(duì)sid進(jìn)行加密處理墙懂,服務(wù)端會(huì)根據(jù)這個(gè)secret密鑰進(jìn)行解密橡卤。(非必需步驟)

3.瀏覽器中收到請(qǐng)求響應(yīng)的時(shí)候會(huì)解析響應(yīng)頭,然后將sid保存在本地cookie中损搬,瀏覽器在下次http請(qǐng)求de 請(qǐng)求頭中會(huì)帶上該域名下的cookie信息碧库,

4.服務(wù)器在接受客戶端請(qǐng)求時(shí)會(huì)去解析請(qǐng)求頭cookie中的sid,然后根據(jù)這個(gè)sid去找服務(wù)器端保存的該客戶端的session巧勤,然后判斷該請(qǐng)求是否合法嵌灰。

?

server.js(nodejs+express+seesion+redis)

var express = require('express');

var RedisStore = require('connect-redis')(express.session);

var app = express();

var secret? = "wang839305939"

// 設(shè)置 Cookie

app.use(express.cookieParser(secret));

// 設(shè)置 Session

app.use(express.session({

? store: new RedisStore({

? ? host: "127.0.0.1",

? ? port: 6379,

? ? db: "session_db"

? }),

? secret: secret

}))

app.get("/", function(req, res) {

? var session = req.session;

? session.time= session.time|| 0;

? var n = session.time++;

? res.send('hello, session id:' + session.id + ' count:' + n);

});

app.listen(9080);

三.Token 驗(yàn)證

使用基于 Token 的身份驗(yàn)證方法,大概的流程是這樣的:

1. 客戶端使用用戶名跟密碼請(qǐng)求登錄

2. 服務(wù)端收到請(qǐng)求颅悉,去驗(yàn)證用戶名與密碼

3. 驗(yàn)證成功后伞鲫,服務(wù)端會(huì)簽發(fā)一個(gè) Token,再把這個(gè) Token 發(fā)送給客戶端

4. 客戶端收到 Token 以后可以把它存儲(chǔ)起來签舞,比如放在 Cookie 里或者 Local Storage 里

5. 客戶端每次向服務(wù)端請(qǐng)求資源的時(shí)候需要帶著服務(wù)端簽發(fā)的 Token

6. 服務(wù)端收到請(qǐng)求秕脓,然后去驗(yàn)證客戶端請(qǐng)求里面帶著的 Token柒瓣,如果驗(yàn)證成功,就向客戶端返回請(qǐng)求的數(shù)據(jù)

??總的來說就是客戶端在首次登陸以后吠架,服務(wù)端再次接收http請(qǐng)求的時(shí)候芙贫,就只認(rèn)token了,請(qǐng)求只要每次把token帶上就行了傍药,服務(wù)器端會(huì)攔截所有的請(qǐng)求磺平,然后校驗(yàn)token的合法性,合法就放行拐辽,不合法就返回401(鑒權(quán)失敿鹋病)。

乍的一看好像和前面的seesion-cookie有點(diǎn)像俱诸,seesion-cookie是通過seesionid來作為瀏覽器和服務(wù)端的鏈接橋梁菠劝,而token驗(yàn)證方式貌似是token來起到seesionid的角色。其實(shí)這兩者差別是很大的睁搭。

1. sessionid 他只是一個(gè)唯一標(biāo)識(shí)的字符串赶诊,服務(wù)端是根據(jù)這個(gè)字符串,來查詢?cè)诜?wù)器端保持的seesion园骆,這里面才保存著用戶的登陸狀態(tài)舔痪。但是token本身就是一種登陸成功憑證,他是在登陸成功后根據(jù)某種規(guī)則生成的一種信息憑證锌唾,他里面本身就保存著用戶的登陸狀態(tài)锄码。服務(wù)器端只需要根據(jù)定義的規(guī)則校驗(yàn)這個(gè)token是否合法就行。

2. session-cookie是需要cookie配合的晌涕,居然要cookie巍耗,那么在http代理客戶端的選擇上就是只有瀏覽器了,因?yàn)橹挥袨g覽器才會(huì)去解析請(qǐng)求響應(yīng)頭里面的cookie,然后每次請(qǐng)求再默認(rèn)帶上該域名下的cookie渐排。但是我們知道http代理客戶端不只有瀏覽器炬太,還有原生APP等等,這個(gè)時(shí)候cookie是不起作用的驯耻,或者瀏覽器端是可以禁止cookie的(雖然可以亲族,但是這基本上是屬于吃飽沒事干的人干的事)…,但是token 就不一樣可缚,他是登陸請(qǐng)求在登陸成功后再請(qǐng)求響應(yīng)體中返回的信息霎迫,客戶端在收到響應(yīng)的時(shí)候,可以把他存在本地的cookie,storage帘靡,或者內(nèi)存中知给,然后再下一次請(qǐng)求的請(qǐng)求頭重帶上這個(gè)token就行了。簡單點(diǎn)來說cookie-session機(jī)制他限制了客戶端的類型,而token驗(yàn)證機(jī)制豐富了客戶端類型涩赢。

3. 時(shí)效性戈次。session-cookie的sessionid實(shí)在登陸的時(shí)候生成的而且在登出事時(shí)一直不變的,在一定程度上安全就會(huì)低筒扒,而token是可以在一段時(shí)間內(nèi)動(dòng)態(tài)改變的怯邪。

4. 可擴(kuò)展性。token驗(yàn)證本身是比較靈活的花墩,一是token的解決方案有許多悬秉,常用的是JWT,二來我們可以基于token驗(yàn)證機(jī)制,專門做一個(gè)鑒權(quán)服務(wù)冰蘑,用它向多個(gè)服務(wù)的請(qǐng)求進(jìn)行統(tǒng)一鑒權(quán)和泌。

下面就拿最常用的JWT(JSON WEB TOKEN)來說:

JWT是Auth0提出的通過對(duì)JSON進(jìn)行加密簽名來實(shí)現(xiàn)授權(quán)驗(yàn)證的方案,就是登陸成功后將相關(guān)信息組成json對(duì)象祠肥,然后對(duì)這個(gè)對(duì)象進(jìn)行某中方式的加密武氓,返回給客戶端,客戶端在下次請(qǐng)求時(shí)帶上這個(gè)token搪柑,服務(wù)端再收到請(qǐng)求時(shí)校驗(yàn)token合法性聋丝,其實(shí)也就是在校驗(yàn)請(qǐng)求的合法性索烹。

JWT對(duì)象通常由三部分構(gòu)成:

1.Headers: 包括類別(typ)工碾、加密算法(alg)

? {

? ? ? "alg": "HS256",

? ? ? "typ": "JWT"

? ? }

Claims :包括需要傳遞的用戶信息

? ? {

? ? ? "sub": "1234567890",

? ? ? "name": "John Doe",

? ? ? "admin": true

? ? }

? ? 1.Signature: 根據(jù)alg算法與私有秘鑰進(jìn)行加密得到的簽名字串, 這一段是最重要的敏感信息百姓,只能在服務(wù)端解密渊额;

HMACSHA256(?

? ? base64UrlEncode(Headers) + "." +

? ? base64UrlEncode(Claims),

? ? SECREATE_KEY

)

編碼之后的JWT看起來是這樣的一串字符:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ

nodejs+express+jwt-simple

auth.js

let jwt = require('jwt-simple');

let secret = "wangyy";

let time = 10;

module.exports = {

/*

? *檢驗(yàn)token合法性

*/

validate:function(req,res,next){

? ? ? let token = req.body.token||req.headers["xssToken"];

? ? ? ? if(token){

? ? ? ? ? let decodeToken = null;

? ? ? ? ? try { //防止假冒token解析報(bào)錯(cuò)

? ? ? ? ? ? decodeToken = jwt.decode(token,secret,'HS256');

? ? ? ? ? } catch (err) {

? ? ? ? ? ? res.status(401).send("非法訪問"); return;

? ? ? ? ? }

? ? ? ? let exp = decodeToken.exp; if(!exp){

? ? ? ? res.status(401).send("非法訪問");

? ? }

? ? let now = new Date().getTime();

? ? if(exp>(now+time*60*1000)){

? ? ? ? res.send({code:'002',"errorMsg":"授權(quán)超時(shí)"})

? ? ? }

? ? ? next();

? ? }else{

? ? ? res.status(401).send("非法訪問");

? ? }

? },

? /* 生成token*/

? makeToken(){

? ? ? let Token = null;

? ? ? let payload = {

? ? ? ? ? ? ? time:new Date().getTime(),

? ? ? ? ? ? ? exp:this.makeExp(time)

? ? ? ? ? ? ? }

? ? ? Token = jwt.encode(payload,secret,HS256) return Token;

},

/*生成token過期時(shí)間*/

makeExp:function(time){

? ? ? let stam = time601000;

? }

}

server.js

let express = require("express");

let app = express();

let bodyParser = require('body-parser');

let auth = require('./lib/auth.js');

let chalk = require('chalk'); app.use(bodyParser.json()); app.post('/login',function(req,res,next){

? ? ? ? ? ? let Token = auth.makeToken();

? ? ? ? ? ? res.json({result:"success",token:Token},200)

? });

app.use('*',[auth.validate],function(req,res,next){

? ? res.send('success');

? });

app.listen('9999')

??上面只是一個(gè)簡單的token生成和校驗(yàn),如果有需要可以根據(jù)實(shí)際需要進(jìn)行邏輯處理

四.OAuth(開放授權(quán))

OAuth(開放授權(quán))是一個(gè)開放標(biāo)準(zhǔn)垒拢,允許用戶授權(quán)第三方網(wǎng)站訪問他們存儲(chǔ)在另外的服務(wù)提供者上的信息旬迹,而不需要將用戶名和密碼提供給第三方網(wǎng)站或分享他們數(shù)據(jù)的所有內(nèi)容,為了保護(hù)用戶數(shù)據(jù)的安全和隱私求类,第三方網(wǎng)站訪問用戶數(shù)據(jù)前都需要顯式的向用戶征求授權(quán)奔垦。我們常見的提供OAuth認(rèn)證服務(wù)的廠商有支付寶,QQ,微信尸疆。

OAuth協(xié)議又有1.0和2.0兩個(gè)版本椿猎。相比較1.0版,2.0版整個(gè)授權(quán)驗(yàn)證流程更簡單更安全寿弱,也是目前最主要的用戶身份驗(yàn)證和授權(quán)方式犯眠。

下面是一張auth2.0的流程圖:

?

從圖中我們可以看出,auth2.0流程分為六布(我們就以csdn登陸為例):

第一步. 向用戶請(qǐng)求授權(quán)症革,現(xiàn)在很多的網(wǎng)站在登陸的時(shí)候都有第三方登陸的入口筐咧,當(dāng)我們點(diǎn)擊等第三方入口時(shí),第三方授權(quán)服務(wù)會(huì)引導(dǎo)我們進(jìn)入第三方登陸授權(quán)頁面。

?

通過第三方請(qǐng)求授權(quán)頁面的瀏覽器地址欄地址可以看出量蕊,

https://graph.qq.com/oauth2.0/show?which=Login&display=pc&response_type=code&client_id=100270989&redirect_uri=https%3A%2F%2Fpassport.csdn.net%2Faccount%2Flogin%3Foauth_provider%3DQQProvider&state=test

這里的地址里面的%是瀏覽器強(qiáng)制編碼后的顯示我們可以使用decodeURIComponent進(jìn)行解碼铺罢,解碼后是這樣:

https://graph.qq.com/oauth2.0/show?which=Login&display=pc&response_type=code&client_id=100270989&redirect_uri=https://passport.csdn.net/account/login?oauth_provider=QQProvider&state=test

這個(gè)url地址我們可以看見Auth2.0常見的幾個(gè)參數(shù):

response_type,返回類型

client_id危融,第三方應(yīng)用id,由授權(quán)服務(wù)器(qq)在第三方應(yīng)用提交時(shí)頒發(fā)給第三方應(yīng)用畏铆。

redirect_uri,登陸成功重定向頁面

oauth_provider吉殃,第三方授權(quán)提供方

state辞居,由第三方應(yīng)用給出的隨機(jī)碼

第二步. 返回用戶憑證(code),并返回一個(gè)憑證(code)蛋勺,當(dāng)用戶點(diǎn)擊授權(quán)并登陸后瓦灶,授權(quán)服務(wù)器將生成一個(gè)用戶憑證(code)。這個(gè)用戶憑證會(huì)附加在重定向的地址redirect_uri的后面

https://passport.csdn.net/account/login?code=9e3efa6cea739f9aaab2&state=XXX

第3步. 請(qǐng)求授權(quán)服務(wù)器授權(quán):

經(jīng)過第二部獲取code后后面的工作就可以交給后臺(tái)去處理的抱完,和用戶的交互就結(jié)束了贼陶。接下來我的需要獲取Access Token,我們需要用他來向授權(quán)服務(wù)器獲取用戶信息等資源巧娱。

第三方應(yīng)用后臺(tái)通過第二步的憑證(code)向授權(quán)服務(wù)器請(qǐng)求Access Token碉怔,這時(shí)候需要以下幾個(gè)信息:

client_id 標(biāo)識(shí)第三方應(yīng)用的id,由授權(quán)服務(wù)器(Github)在第三方應(yīng)用提交時(shí)頒發(fā)給第三方應(yīng)用

client_secret 第三方應(yīng)用和授權(quán)服務(wù)器之間的安全憑證禁添,由授權(quán)服務(wù)器(Github)在第三方應(yīng)用提交時(shí)頒發(fā)給第三方應(yīng)用

code 第一步中返回的用戶憑證redirect_uri 第一步生成用戶憑證后跳轉(zhuǎn)到第二步時(shí)的地址

state 由第三方應(yīng)用給出的隨機(jī)碼

第四步. 授權(quán)服務(wù)器同意授權(quán)后撮胧,返回一個(gè)資源訪問的憑證(Access Token)。

第五步. 第三方應(yīng)用通過第四步的憑證(Access Token)向資源服務(wù)器請(qǐng)求相關(guān)資源老翘。

第六步. 資源服務(wù)器驗(yàn)證憑證(Access Token)通過后芹啥,將第三方應(yīng)用請(qǐng)求的資源返回。

從用戶角度來說铺峭,第三方授權(quán)可以讓我們快速的登陸應(yīng)用墓怀,無需進(jìn)行繁瑣的注冊(cè),同時(shí)不用記住各種賬號(hào)密碼。只需要記住自己常用的幾個(gè)賬號(hào)就ok了卫键。

從產(chǎn)品經(jīng)理的角度來所傀履,這種授權(quán)方式提高用戶的體驗(yàn)滿意度。另一方面可以獲取更多的用戶莉炉。

總結(jié):

??授權(quán)方式多種多樣钓账,主要還是要取決于我們對(duì)于產(chǎn)品的定位。如果我們的產(chǎn)品只是在企業(yè)內(nèi)部使用呢袱,token和session就可以滿足我們的需求官扣,如果是面向互聯(lián)網(wǎng)的大眾用戶,那么第三方授權(quán)在用戶體驗(yàn)度上會(huì)有一個(gè)很大的提升羞福。

??還是那句話惕蹄,上面可能有很多‘通假字’勿怪,我寫作的目的一方面是希望和大家分享我掌握的點(diǎn)點(diǎn)滴滴,另一方面也是梳理一下掌握的知識(shí)卖陵。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末遭顶,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子泪蔫,更是在濱河造成了極大的恐慌棒旗,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件撩荣,死亡現(xiàn)場離奇詭異铣揉,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)餐曹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門逛拱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人台猴,你說我怎么就攤上這事朽合。” “怎么了饱狂?”我有些...
    開封第一講書人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵曹步,是天一觀的道長。 經(jīng)常有香客問我休讳,道長讲婚,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任衍腥,我火速辦了婚禮磺樱,結(jié)果婚禮上纳猫,老公的妹妹穿的比我還像新娘婆咸。我一直安慰自己,他們只是感情好芜辕,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開白布尚骄。 她就那樣靜靜地躺著,像睡著了一般侵续。 火紅的嫁衣襯著肌膚如雪倔丈。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,036評(píng)論 1 285
  • 那天状蜗,我揣著相機(jī)與錄音需五,去河邊找鬼。 笑死轧坎,一個(gè)胖子當(dāng)著我的面吹牛宏邮,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼蜜氨,長吁一口氣:“原來是場噩夢啊……” “哼械筛!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起飒炎,我...
    開封第一講書人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤埋哟,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后郎汪,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體赤赊,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年煞赢,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了砍鸠。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡耕驰,死狀恐怖爷辱,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情朦肘,我是刑警寧澤饭弓,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站媒抠,受9級(jí)特大地震影響弟断,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜趴生,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一阀趴、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧苍匆,春花似錦刘急、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至检碗,卻和暖如春据块,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背折剃。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國打工另假, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人怕犁。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓边篮,卻偏偏與公主長得像开睡,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子苟耻,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

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