小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

Flask: SSO原理及實(shí)現(xiàn)

 quasiceo 2014-05-15

現(xiàn)在大多數(shù)軟件公司的業(yè)務(wù)不再是單條線,而是發(fā)展成多元化的產(chǎn)品線。包括多個(gè)網(wǎng)站應(yīng)用、移動(dòng)APP以及桌面軟件,那么當(dāng)然希望能實(shí)現(xiàn)統(tǒng)一用戶和統(tǒng)一登錄。統(tǒng)一用戶基本都已實(shí)現(xiàn),然而統(tǒng)一登錄卻還是有不少公司未予以實(shí)現(xiàn)。這倒不是說(shuō)SSO有多復(fù)雜或多難實(shí)現(xiàn),這其中可能有歷史遺留問(wèn)題也或是其它原因。這是題外話,本文不作深究。

什么是統(tǒng)一用戶

統(tǒng)一用戶指的是多個(gè)應(yīng)用共用一套賬號(hào)體系。比如Z公司旗下有aw和bw兩個(gè)網(wǎng)站,有賬號(hào)goal,那么使用賬號(hào)goal能登錄aw和bw。這個(gè)在技術(shù)上也不難實(shí)現(xiàn),通常來(lái)說(shuō)有2個(gè)方案:

  1. 共享持久層

    這是最常用的方式。aw和bw通過(guò)直接訪問(wèn)同一個(gè)后端數(shù)據(jù)庫(kù)來(lái)達(dá)到數(shù)據(jù)共享。

  2. 通過(guò)代理訪問(wèn)

    這種方式類似于通過(guò)網(wǎng)關(guān)來(lái)訪問(wèn)同一個(gè)后端數(shù)據(jù)庫(kù)。本質(zhì)上跟共享持久層是一樣的,無(wú)外乎多了層網(wǎng)關(guān),這樣是有好處的,本文接下來(lái)會(huì)涉及到。

這看起來(lái)好像夠了,但是請(qǐng)您考慮這樣一個(gè)場(chǎng)景:aw和bw是兩個(gè)不同的網(wǎng)頁(yè)游戲,那么首先aw和bw都有自己的激活流程,然后有自己的游戲角色、裝備等各種屬性。所以aw和bw應(yīng)該有各自的profile。對(duì)此我歸納了幾下幾點(diǎn):

  1. 統(tǒng)一用戶賬號(hào)表僅保存各個(gè)應(yīng)用的公共屬性,其它應(yīng)用可以重寫這些屬性

  2. 應(yīng)該能標(biāo)識(shí)出是否已激活過(guò)

  3. 應(yīng)該能標(biāo)識(shí)出屬于哪個(gè)應(yīng)用

對(duì)于第一點(diǎn),這沒(méi)什么好說(shuō)的。第二點(diǎn)和第三點(diǎn)可以分別用一個(gè)整型字段來(lái)表示,屬性存儲(chǔ)在不同的位上,而且一般都是這么做的。如下代碼所示:

01#!/usr/bin/env python
02#coding: utf8
03 
04#已保存flag,從最低位算起,第一位表示aw,第二位表示bw
05app_flag = 0x3
06ac_flag  = 0x2
07 
08#測(cè)試某個(gè)應(yīng)用是否已激活
09if ac_flag & 0x1:
10    print "aw已激活。"
11elif ac_flag & 0x2:
12    print "bw已激活。"
13 
14#進(jìn)行激活aw應(yīng)用
15ac_flag |= 0x1
16 
17#測(cè)試是哪個(gè)app
18if app_flag & 0x1:
19    print "這是aw應(yīng)用。"
20if app_flag & 0x2:
21    print "這是bw應(yīng)用。"

1$ python test.py
2bw已激活。
3這是aw應(yīng)用。
4這是bw應(yīng)用。

什么是統(tǒng)一登錄

統(tǒng)一登錄又稱SSO(Single Sign On),即單點(diǎn)登錄。實(shí)現(xiàn)統(tǒng)一登錄的前提是已經(jīng)實(shí)現(xiàn)了統(tǒng)一用戶。在實(shí)現(xiàn)SSO之前的登錄流程是這樣的:

  1. aw和bw各自維護(hù)自己的登錄會(huì)話

  2. aw的登錄不會(huì)導(dǎo)致bw登錄,相反也是如此

  3. aw的退出不會(huì)導(dǎo)致bw的退出,相反也是如此

這種體驗(yàn)對(duì)用戶來(lái)說(shuō)是極不友好的,明明是同樣的帳戶,卻不得不逐個(gè)去輸入用戶名和密碼來(lái)登錄。SSO正好可以解決這些問(wèn)題。SSO一般被用于web和web之間,但有時(shí)也被用于和桌面軟件、移動(dòng)APP之間的統(tǒng)一登錄。不過(guò)只有web和web之間才能算是標(biāo)準(zhǔn)的SSO,其它的卻不是。接下來(lái)分別談?wù)勥@幾種方式的原理:

  1. web和web之間單點(diǎn)登錄

  2. web和桌面軟件、移動(dòng)APP之間單點(diǎn)登錄

web和web之間的單點(diǎn)登錄

原理

對(duì)于使用session來(lái)保存登錄態(tài)想必各位都沒(méi)有什么疑問(wèn),不明白的可以去自行 Google 。比如有站點(diǎn)aw和bw需要統(tǒng)一登錄,那么會(huì)出現(xiàn)2種情況:

  1. aw和bw是二級(jí)子域名

    例如aw和bw站點(diǎn)域名分別是aw.test.com和bw.test.com,那么其實(shí)可以設(shè)置session的cookie domain為.test.com來(lái)使aw和bw共享會(huì)話信息。這種方式不具備通用性并且簡(jiǎn)單,因此不作深究。

  2. aw和bw都是獨(dú)立的域名

    因?yàn)槭?個(gè)獨(dú)立的域名,所以就不能通過(guò)設(shè)置session的cookie domain來(lái)實(shí)現(xiàn)了。SSO的做法就是將登錄態(tài)保存在SSO域(一般也稱passort或通行證)上,aw和bw的登錄、退出以及授權(quán)檢查都通過(guò)SSO來(lái)進(jìn)行。本文將通篇使用aw, bw和SSO這三個(gè)站點(diǎn)來(lái)描述,并且使用Python的Flask框架來(lái)進(jìn)行演示,如果沒(méi)有安裝Flask,請(qǐng)先安裝。

1$ pip install flask

aw和bw是2個(gè)不同的web應(yīng)用,都需要登錄才能訪問(wèn),而SSO就是為aw和bw來(lái)提供服務(wù)的。為此我配置了3個(gè)host,如下圖:

調(diào)用SSO的方式又可以分為以下2種:

  1. 跳轉(zhuǎn)方式

  2. ajax或jsonp方式

嚴(yán)格意義上來(lái)說(shuō),ajax和jsonp是屬于不同方式。因?yàn)閍jax沒(méi)法跨域去調(diào)用SSO,它需要通過(guò)服務(wù)器端代理的方式去調(diào)用SSO。而jsonp是可以直接去調(diào)用SSO的,當(dāng)然前提是SSO提供了jsonp方式的訪問(wèn)。這樣劃分的依據(jù)只是為了區(qū)分跳轉(zhuǎn)與非跳轉(zhuǎn)。

跳轉(zhuǎn)方式

當(dāng)用戶在aw和bw未登錄時(shí),則攜帶相應(yīng)參數(shù)(如來(lái)源網(wǎng)址等)跳轉(zhuǎn)到SSO進(jìn)行登錄,如登錄失敗則停留在SSO的登錄頁(yè),登錄成功則SSO會(huì)生成ticket并附加給來(lái)源網(wǎng)址跳轉(zhuǎn)回去。當(dāng)然SSO在跳轉(zhuǎn)回來(lái)源網(wǎng)址時(shí)會(huì)在SSO域上設(shè)置好登錄態(tài)。既然在SSO上設(shè)置登錄態(tài),那么在aw和bw上是否需要設(shè)置登錄態(tài)呢?答案是應(yīng)該設(shè)置。舉例來(lái)說(shuō),如果aw跳轉(zhuǎn)到SSO進(jìn)行登錄成功并在SSO上設(shè)置好登錄態(tài)后攜帶ticket跳轉(zhuǎn)回來(lái),aw需要授權(quán)的頁(yè)面其實(shí)都是需要檢查用戶在aw上是否授權(quán)成功,如果不在aw上設(shè)置登錄態(tài),則始終會(huì)跳轉(zhuǎn)到SSO去檢測(cè)授權(quán),這樣的結(jié)果就是導(dǎo)致無(wú)限循環(huán)的跳轉(zhuǎn),最終導(dǎo)致不可訪問(wèn)。當(dāng)然還有其它解決方案,那就是通過(guò)<script>或<iframe />來(lái)實(shí)現(xiàn)調(diào)用SSO檢測(cè),但這是后話,將會(huì)在使用ajax或jsonp方式時(shí)進(jìn)行講解。

如上所述,還是應(yīng)該在aw和bw上設(shè)置各自的登錄態(tài),這樣在訪問(wèn)aw時(shí)首先會(huì)在aw域上檢測(cè)授權(quán),如果沒(méi)有授權(quán),則跳轉(zhuǎn)到SSO進(jìn)行登錄授權(quán),登錄成功之后攜帶ticket跳轉(zhuǎn)回來(lái)。ticket是SSO為此次登錄所生成的用戶基本信息加密串,來(lái)源域可通過(guò)解密ticket來(lái)獲取用戶基本信息,從而在來(lái)源域中設(shè)置登錄態(tài)。

但是aw和bw應(yīng)該為登錄態(tài)設(shè)置多長(zhǎng)存活期呢?一般設(shè)為瀏覽器進(jìn)程存活期,也就是說(shuō)aw和bw的登錄態(tài)的存活期直到瀏覽器關(guān)閉。SSO域上登錄態(tài)的存活期取決于具體的業(yè)務(wù),本文中設(shè)為30天。代碼如下:

aw代碼:

www/aw

----app.py

01#coding: utf8
02import os
03from datetime import timedelta
04from flask import Flask, session, redirect, url_for, request
05import urllib
06 
07app = Flask(__name__)
08 
09app.secret_key = os.urandom(24)
10app.permanent_session_lifetime = timedelta(seconds=24 * 60 * 60)
11 
12@app.route('/')
13def index():
14    #表示存活期為瀏覽器進(jìn)程的存活期
15    session.permanent = False
16    ticket = request.args.get('ticket'None)
17    if ticket is not None:
18        session['name'= ticket.strip()
19    #檢測(cè)登錄態(tài)
20    if 'name' in session:
21        return '登錄成功'
22    else:
23        referer = urllib.quote('http://www.:6666/')
24        return redirect('http://www.:6668/login?referer=' + referer)
25 
26if __name__ == '__main__':
27    app.run(
28        host="0.0.0.0",
29        port=int("6666"),
30        debug=True
31    )

bw代碼:

www/bw

----app.py

01#coding: utf8
02import os
03from datetime import timedelta
04from flask import Flask, session, redirect, url_for, request
05import urllib
06 
07app = Flask(__name__)
08 
09app.secret_key = os.urandom(24)
10app.permanent_session_lifetime = timedelta(seconds=24 * 60 * 60)
11 
12@app.route('/')
13def index():
14    #表示存活期為瀏覽器進(jìn)程的存活期
15    session.permanent = False
16    ticket = request.args.get('ticket'None)
17    if ticket is not None:
18        session['name'= ticket.strip()
19    #檢測(cè)登錄態(tài)
20    if 'name' in session:
21        return '登錄成功'
22    else:
23        referer = urllib.quote('http://www.:6667/')
24        return redirect('http://www.:6668/login?referer=' + referer)
25 
26if __name__ == '__main__':
27    app.run(
28        host="0.0.0.0",
29        port=int("6667"),
30        debug=True
31    )

sso代碼:

www/sso

----app.py

----templates

--------login.html

app.py源碼:

01#coding: utf8
02import os
03from datetime import timedelta
04from flask import Flask, session, render_template, request, redirect
05import urllib
06 
07app = Flask(__name__)
08 
09app.secret_key = os.urandom(24)
10app.permanent_session_lifetime = timedelta(seconds=30 * 24 * 60 * 60)
11 
12@app.route('/login')
13def login():
14    session.permanent = True
15    referer = request.args.get('referer'None)
16    if referer is not None:
17        referer = referer.strip()
18    if 'name' in session:
19        if referer is not None:
20            return redirect(referer + '?ticket=' + _makeTicket())
21    return render_template('login.html'**dict(referer=referer))
22 
23@app.route('/dologin')
24def doLogin():
25    '''這里其實(shí)忽略了判斷是否登錄的流程'''
26    session.permanent = True
27    referer = request.args.get('referer'None)
28    if referer is not None:
29        referer = urllib.unquote(referer.strip())
30    #不實(shí)現(xiàn)登錄功能,直接設(shè)置登錄態(tài)
31    _setLoginState()
32    if referer:
33        return redirect(referer + '?ticket=' + _makeTicket())
34    else:
35        return 'error'
36 
37def _setLoginState():
38    session['name'= 'goal'
39 
40def _makeTicket():
41    '''生成ticket,這里只是簡(jiǎn)單返回用戶名,真實(shí)場(chǎng)景中可以使用des之類的加密算法'''
42    return 'goal'
43 
44if __name__ == '__main__':
45    app.run(
46        host="0.0.0.0",
47        port=int("6668"),
48        debug=True
49    )

login.html源碼:

01<!DOCTYPE html>
02<html>
03<head>
04    <meta charset="utf-8">
05    <title>SSO</title>
06    <meta name="author" content="" />
07    <meta http-equiv="X-UA-Compatible" content="IE=7" />
08    <meta name="keywords" content="SSO" />
09    <meta name="description" content="SSO" />
10</head>
11<body>
12<a href="{{ url_for('doLogin') }}{% if referer %}?referer={{ referer }}{% endif %}">請(qǐng)登錄</a>
13</body>
14</html>

1$ python aw/app.py
2 * Running on http://0.0.0.0:6666/
3 * Restarting with reloader
4$ python bw/app.py
5 * Running on http://0.0.0.0:6667/
6 * Restarting with reloader
7$ python sso/app.py
8 * Running on http://0.0.0.0:6668/
9 * Restarting with reloader

打開(kāi)aw站點(diǎn),發(fā)現(xiàn)未登錄,則跳轉(zhuǎn)到SSO,點(diǎn)擊登錄成功后SSO設(shè)置登錄態(tài)并跳轉(zhuǎn)回aw并攜帶上ticket,aw根據(jù)ticket設(shè)置登錄態(tài)。流程對(duì)于bw也同樣適用。如果關(guān)閉瀏覽器,則aw和bw所設(shè)置的登錄態(tài)失效,但SSO上設(shè)置的并未過(guò)期,因此重啟瀏覽器打開(kāi)aw站點(diǎn)將導(dǎo)至跳轉(zhuǎn)到SSO,并且在SSO上授權(quán)檢測(cè)成功,之后再同樣設(shè)置aw的登錄態(tài)。

以上是基于跳轉(zhuǎn)的方式實(shí)現(xiàn)的SSO,對(duì)于退出登錄也可以通過(guò)同樣的方式來(lái)實(shí)現(xiàn)。

ajax或jsonp方式

對(duì)于ajax和jsonp方式來(lái)說(shuō),這只是請(qǐng)求登錄接口的不同方案。因?yàn)閍jax不能跨域請(qǐng)求,所以需要服務(wù)器端代為請(qǐng)求并將結(jié)果返回,而jsonp方式是通過(guò)<script>標(biāo)記調(diào)用遠(yuǎn)程腳本來(lái)實(shí)現(xiàn)的,如果SSO支持jsonp方式,則應(yīng)優(yōu)先選用。登錄請(qǐng)求過(guò)程比較簡(jiǎn)單,ajax就沒(méi)什么好說(shuō)的,因?yàn)樘S昧?。?duì)于jsonp來(lái)說(shuō),遠(yuǎn)程執(zhí)行完畢會(huì)返回一段JS代碼,通常是返回一個(gè)變量的定義,那么我們就可以利用這個(gè)變量來(lái)拿到ticket并為應(yīng)用設(shè)置登錄態(tài)。

但是試想下,這種非跳轉(zhuǎn)方式需要跨域設(shè)置SSO的登錄態(tài),那么這其實(shí)是可以通過(guò)<script>和<iframe>來(lái)實(shí)現(xiàn)的。對(duì)于IE來(lái)說(shuō),還需要設(shè)置p3p頭部,而其它瀏覽器則不需要設(shè)置。在這點(diǎn)上其實(shí)是IE遵循了隱私規(guī)范,我們不防為IE點(diǎn)個(gè)贊。本文不打算實(shí)現(xiàn)ajax和jsonp方式的登錄,如果各位有問(wèn)題,可以一起討論。

本文將通過(guò)<script>的方式對(duì)SSO進(jìn)行跨域設(shè)置登錄態(tài)。很顯然,SSO需要提供一個(gè)URL調(diào)用給應(yīng)用,并且SSO可以提供一個(gè)JS腳本供應(yīng)用使用,這樣就不須各個(gè)應(yīng)用再去實(shí)現(xiàn)一遍了。OK,讓我們先清除SSO上的會(huì)話信息,再重啟瀏覽器。代碼如下:

www/aw

----app.py

----templates

--------index.html

app.py源碼:

01#coding: utf8
02import os
03from datetime import timedelta
04from flask import Flask, session, request, render_template
05import urllib
06 
07app = Flask(__name__)
08 
09app.secret_key = os.urandom(24)
10app.permanent_session_lifetime = timedelta(seconds=24 * 60 * 60)
11 
12@app.route('/')
13def index():
14    session.permanent = False
15    return render_template('index.html')
16 
17if __name__ == '__main__':
18    app.run(
19        host="0.0.0.0",
20        port=int("6666"),
21        debug=True
22    )

index.html源碼:

01<!DOCTYPE html>
02<html>
03<head>
04    <meta charset="utf-8">
05    <title>aw</title>
06    <meta name="author" content="" />
07    <meta http-equiv="X-UA-Compatible" content="IE=7" />
08    <meta name="keywords" content="aw" />
09    <meta name="description" content="aw" />
10    <script type="text/javascript" src="http://cdn./jquery/2.1.0/jquery.min.js"></script>
11    <script type="text/javascript" src="http://www.:6668/static/sso.js"></script>
12</head>
13<body>
14</body>
15</html>

www/sso

----app.py

----static

--------sso.js

app.py源碼:

01#coding: utf8
02import os
03from datetime import timedelta
04from flask import Flask, session, request, make_response
05import urllib
06 
07app = Flask(__name__)
08 
09app.secret_key = os.urandom(24)
10app.permanent_session_lifetime = timedelta(seconds=30 * 24 * 60 * 60)
11 
12@app.route('/setLoginState')
13def setLoginState():
14    session.permanent = True
15    session['name'= 'goal'
16    session['nick'= '陳一回'
17    resp = make_response('')
18    resp.headers['P3P'= 'CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"'
19    return resp
20 
21@app.route('/test')
22def test():
23    session.permanent = True
24    _str = ''
25    if 'name' in session:
26        _str = session['name']
27    if 'nick' in session:
28        _str += '---' + session['nick']
29    return _str
30 
31if __name__ == '__main__':
32    app.run(
33        host="0.0.0.0",
34        port=int("6668"),
35        debug=True
36    )

sso.js源碼:

1$(function() {
2    $.getScript("http://www.:6668/setLoginState"function() {
3        console.log('success.');
4    });
5});

1$ python aw/app.py
2 * Running on http://0.0.0.0:6666/
3 * Restarting with reloader
4$ python sso/app.py
5 * Running on http://0.0.0.0:6668/
6 * Restarting with reloader

通過(guò)訪問(wèn) http://www.:6666  來(lái)設(shè)置SSO的登錄態(tài),之后可以通過(guò) http://www.:6668/test  來(lái)查看輸出,結(jié)果很明顯是設(shè)置成功的。關(guān)于非跳轉(zhuǎn)方式的授權(quán)檢測(cè)以及退出登錄也是大同小異的,明白了原理,實(shí)現(xiàn)起來(lái)就很簡(jiǎn)單了。

統(tǒng)一退出

統(tǒng)一退出的概念即是任何一方應(yīng)用退出登錄,在清除應(yīng)用自身的登錄態(tài)時(shí)也清除SSO的登錄態(tài)。這看起來(lái)沒(méi)有什么問(wèn)題,舉個(gè)例來(lái)說(shuō),aw和bw都登錄過(guò),也就說(shuō)aw、bw和SSO都設(shè)置過(guò)登錄態(tài)。aw的退出將會(huì)清除aw和SSO的登錄態(tài),但bw還在會(huì)話期內(nèi),除非瀏覽器被關(guān)閉,否則bw還是會(huì)處于登錄狀態(tài)的。解決方案也是有的,在aw退出時(shí),順便也清除bw的登錄態(tài)(可通過(guò)遠(yuǎn)程URL調(diào)用和P3P結(jié)合的方式來(lái)實(shí)現(xiàn))。但如果SSO關(guān)聯(lián)的應(yīng)用非常多,那么退出的過(guò)程也變得漫長(zhǎng)。有些公司的網(wǎng)站甚至是通過(guò)跳轉(zhuǎn)方式來(lái)進(jìn)行逐一清除登錄態(tài),這個(gè)沒(méi)有完美的解決方案,關(guān)鍵在于取舍。

統(tǒng)一授權(quán)檢測(cè)

之前所述的aw和bw本身也會(huì)設(shè)置登錄態(tài)。如果不想設(shè)置登錄態(tài),則可以通過(guò)SSO實(shí)現(xiàn)JS API供aw和bw來(lái)調(diào)用,在每個(gè)頁(yè)面中通過(guò)遠(yuǎn)程URL調(diào)用SSO的授權(quán)檢測(cè)。但這樣很明顯是弊大于利,不僅會(huì)令SSO的請(qǐng)求數(shù)呈指數(shù)級(jí)增長(zhǎng),并且增加了aw和bw的編碼難度。

強(qiáng)迫退出

考慮這么一種場(chǎng)景。基于同一個(gè)用戶,在A電腦上登錄了aw,之后沒(méi)有關(guān)閉瀏覽器,然后在B電腦上也登錄了aw。那么能否強(qiáng)制A電腦上的用戶退出呢?這個(gè)退出分為SSO的退出和aw的退出。令SSO的退出是可以實(shí)現(xiàn)的,只要在登錄態(tài)中保存登錄時(shí)間戳,服務(wù)器端持有用戶標(biāo)識(shí)到登錄態(tài)的映射,那么B電腦上的登錄會(huì)令登錄態(tài)和服務(wù)器端的映射同步,而A電腦上的登錄態(tài)將會(huì)過(guò)期。這個(gè)時(shí)候如果在A電腦上開(kāi)啟bw(之前未登錄),則會(huì)跳轉(zhuǎn)到SSO,很明顯,這個(gè)時(shí)候A電腦上的SSO將是未授權(quán)狀態(tài)。對(duì)于A電腦上的aw,并沒(méi)有辦法去清除它的登錄態(tài)。

UserAgent

之前一直忽略了一個(gè)事實(shí),所謂共享SSO登錄態(tài),其實(shí)是基于同一個(gè)UserAgent的。對(duì)于web應(yīng)用來(lái)說(shuō),UserAgent就是瀏覽器。這是因?yàn)闉g覽器之間無(wú)法共享cookie,而session是基于cookie的。

web和桌面軟件、移動(dòng)APP之間單點(diǎn)登錄

這個(gè)其實(shí)不能算嚴(yán)格意義上的SSO,只能算是代簽。可以登錄2個(gè)QQ號(hào)來(lái)進(jìn)行觀察,登錄后在2個(gè)QQ上點(diǎn)擊郵箱圖標(biāo)進(jìn)入郵箱,您可以發(fā)現(xiàn)鏈接上被附加了一串sid。sid是session id的縮寫,可以用來(lái)標(biāo)識(shí)一個(gè)會(huì)話。您可以清楚的看到郵箱上的每個(gè)鏈接都被附加上了一串sid參數(shù),這是因?yàn)樵试S同時(shí)使用多個(gè)郵箱,如果設(shè)置登錄態(tài)的話則會(huì)覆蓋前一個(gè)。這種方式看起就像早期PHP不支持session的做法,每次通過(guò)傳遞sid到服務(wù)器端來(lái)解密進(jìn)行標(biāo)識(shí)用戶。

對(duì)于移動(dòng)APP的授權(quán),有使用OAuth方式,也有使用傳遞sid方式,對(duì)此不作深究。

SSO可以同時(shí)支持傳遞sid、OAuth方式和登錄態(tài)方式的授權(quán)校驗(yàn),并只能被授權(quán)后的應(yīng)用使用SSO。

來(lái)自:http://my.oschina.net/goal/blog/199978


    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多