成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

PHP下的Oauth2.0嘗試 - OpenID Connect

saucxs / 3535人閱讀

摘要:基礎(chǔ)簡(jiǎn)要而言是一種安全機(jī)制用于應(yīng)用連接到身份認(rèn)證服務(wù)器獲取用戶信息并將這些信息以安全可靠的方法返回給應(yīng)用。這些信息被保存在身份認(rèn)證服務(wù)器以確保特定的客戶端收到的信息只來(lái)自于合法的應(yīng)用平臺(tái)。

OpenID Connect OpenID Connect簡(jiǎn)介

OpenID Connect是基于OAuth 2.0規(guī)范族的可互操作的身份驗(yàn)證協(xié)議。它使用簡(jiǎn)單的REST / JSON消息流來(lái)實(shí)現(xiàn),和之前任何一種身份認(rèn)證協(xié)議相比,開(kāi)發(fā)者可以輕松集成。
OpenID Connect允許開(kāi)發(fā)者驗(yàn)證跨網(wǎng)站和應(yīng)用的用戶,而無(wú)需擁有和管理密碼文件。OpenID Connect允許所有類型的客戶,包括基于瀏覽器的JavaScript和本機(jī)移動(dòng)應(yīng)用程序,啟動(dòng)登錄流動(dòng)和接收可驗(yàn)證斷言對(duì)登錄用戶的身份。

OpenID的歷史是什么?

OpenID Connect是OpenID的第三代技術(shù)。首先是原始的OpenID,它不是商業(yè)應(yīng)用,但讓行業(yè)領(lǐng)導(dǎo)者思考什么是可能的。OpenID 2.0設(shè)計(jì)更為完善,提供良好的安全性保證。然而,其自身存在一些設(shè)計(jì)上的局限性,最致命的是其中依賴方必須是網(wǎng)頁(yè),但不能是本機(jī)應(yīng)用程序;此外它還要依賴XML,這些都會(huì)導(dǎo)致一些應(yīng)用問(wèn)題。
OpenID Connect的目標(biāo)是讓更多的開(kāi)發(fā)者使用,并擴(kuò)大其使用范圍。幸運(yùn)的是,這個(gè)目標(biāo)并不遙遠(yuǎn),現(xiàn)在有很好的商業(yè)和開(kāi)源庫(kù)來(lái)幫助實(shí)現(xiàn)身份驗(yàn)證機(jī)制。

OIDC基礎(chǔ)

簡(jiǎn)要而言,OIDC是一種安全機(jī)制,用于應(yīng)用連接到身份認(rèn)證服務(wù)器(Identity Service)獲取用戶信息,并將這些信息以安全可靠的方法返回給應(yīng)用。
在最初,因?yàn)镺penID1/2經(jīng)常和OAuth協(xié)議(一種授權(quán)協(xié)議)一起提及,所以二者經(jīng)常被搞混。

OpenID是Authentication,即認(rèn)證,對(duì)用戶的身份進(jìn)行認(rèn)證,判斷其身份是否有效,也就是讓網(wǎng)站知道“你是你所聲稱的那個(gè)用戶”;
OAuth是Authorization,即授權(quán),在已知用戶身份合法的情況下,經(jīng)用戶授權(quán)來(lái)允許某些操作,也就是讓網(wǎng)站知道“你能被允許做那些事情”。
由此可知,授權(quán)要在認(rèn)證之后進(jìn)行,只有確定用戶身份只有才能授權(quán)。

(身份驗(yàn)證)+ OAuth 2.0 = OpenID Connect

OpenID Connect是“認(rèn)證”和“授權(quán)”的結(jié)合,因?yàn)槠浠贠Auth協(xié)議,所以O(shè)penID-Connect協(xié)議中也包含了client_id、client_secret還有redirect_uri等字段標(biāo)識(shí)。這些信息被保存在“身份認(rèn)證服務(wù)器”,以確保特定的客戶端收到的信息只來(lái)自于合法的應(yīng)用平臺(tái)。這樣做是目的是為了防止client_id泄露而造成的惡意網(wǎng)站發(fā)起的OIDC流程。

在OAuth中,這些授權(quán)被稱為scope。OpenID-Connect也有自己特殊的scope--openid ,它必須在第一次請(qǐng)求“身份鑒別服務(wù)器”(Identity Provider,簡(jiǎn)稱IDP)時(shí)發(fā)送過(guò)去。

OpenID Connect 實(shí)現(xiàn)

我們的本代碼實(shí)現(xiàn)建立在PHP下的Oauth2.0嘗試 - 授權(quán)碼授權(quán)(Authorization Code Grant) 文章的代碼基礎(chǔ)上調(diào)整

證書(shū)
# 生成私鑰 private key
$ openssl genrsa -out privkey.pem 2048

# 私鑰生成公鑰 public key
$ openssl rsa -in privkey.pem -pubout -out pubkey.pem
調(diào)整server
private function server()
{
    $pdo = new PDO("mysql:host=ip;dbname=oauth_test", "user", "123456");
    $storage = new OAuth2StoragePdo($pdo);

    $config = [
        "use_openid_connect" => true, //openid 必須設(shè)置
        "issuer" => "sxx.qkl.local"
    ];

    $server = new OAuth2Server($storage, $config);

    // 第二個(gè)參數(shù),必須設(shè)置值為public_key
    $server->addStorage($this->getKeyStorage(), "public_key");

    // 添加 Authorization Code 授予類型
    $server->addGrantType(new OAuth2GrantTypeAuthorizationCode($storage));

    // 添加 Client Credentials 授予類型  一般三方應(yīng)用都是直接通過(guò)client_id & client_secret直接請(qǐng)求獲取access_token
    $server->addGrantType(new OAuth2GrantTypeClientCredentials($storage));

    return $server;
}

private function getKeyStorage()
{
    $rootCache = dirname(APP_PATH) . "/cert/oauth/";
    $publicKey  = file_get_contents($rootCache."pubkey.pem");
    $privateKey = file_get_contents($rootCache."privkey.pem");

    // create storage
    $keyStorage = new OAuth2StorageMemory(array("keys" => array(
        "public_key"  => $publicKey,
        "private_key" => $privateKey,
    )));

    return $keyStorage;
}
授權(quán)
public function authorize()
{
    // scope增加openid
    // 該頁(yè)面請(qǐng)求地址類似:
    // http://sxx.qkl.local/v2/oauth/authorize?response_type=code&client_id=testclient&state=xyz&redirect_uri=http://sxx.qkl.local/v2/oauth/cb&scope=basic%20get_user_info%20upload_pic%20openid
    //獲取server對(duì)象
    $server = $this->server();
    $request = OAuth2Request::createFromGlobals();
    $response = new OAuth2Response();

    // 驗(yàn)證 authorize request
    // 這里會(huì)驗(yàn)證client_id,redirect_uri等參數(shù)和client是否有scope
    if (!$server->validateAuthorizeRequest($request, $response)) {
        $response->send();
        die;
    }

    // 顯示授權(quán)登錄頁(yè)面
    if (empty($_POST)) {
        //獲取client類型的storage
        //不過(guò)這里我們?cè)趕erver里設(shè)置了storage,其實(shí)都是一樣的storage->pdo.mysql
        $pdo = $server->getStorage("client");
        //獲取oauth_clients表的對(duì)應(yīng)的client應(yīng)用的數(shù)據(jù)
        $clientInfo = $pdo->getClientDetails($request->query("client_id"));
        $this->assign("clientInfo", $clientInfo);
        $this->display("authorize");
        die();
    }

    $is_authorized = true;
    // 當(dāng)然這部分常規(guī)是基于自己現(xiàn)有的帳號(hào)系統(tǒng)驗(yàn)證
    if (!$uid = $this->checkLogin($request)) {
        $is_authorized = false;
    }

    // 這里是授權(quán)獲取code,并拼接Location地址返回相應(yīng)
    // Location的地址類似:http://sxx.qkl.local/v2/oauth/cb?code=69d78ea06b5ee41acbb9dfb90500823c8ac0241d&state=xyz
    $server->handleAuthorizeRequest($request, $response, $is_authorized, $uid);
    if ($is_authorized) {
        // 這里會(huì)創(chuàng)建Location跳轉(zhuǎn),你可以直接獲取相關(guān)的跳轉(zhuǎn)url,用于debug
        $parts = parse_url($response->getHttpHeader("Location"));
        var_dump($parts);
        parse_str($parts["query"], $query);

        // 拉取oauth_authorization_codes記錄的信息,包含id_token
        $code = $server->getStorage("authorization_code")
            ->getAuthorizationCode($query["code"]);
        var_dump($code);
    }
//        $response->send();
}

curl獲取
# 使用 HTTP Basic Authentication
$ curl -u testclient:123456 http://sxx.qkl.local/v2/oauth/token -d "grant_type=client_credentials"

# 使用 POST Body 請(qǐng)求
$ curl http://sxx.qkl.local/v2/oauth/token -d "grant_type=client_credentials&client_id=testclient&client_secret=123456"
postman獲取access_token

總結(jié)
access_token 用于授權(quán)
id_token(通常為JWT) 用于認(rèn)證

通常我們
首先,需要使用id_token登錄
然后,你會(huì)得到一個(gè)access_token
最后,使用access_token來(lái)訪問(wèn)授權(quán)相關(guān)接口。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/29447.html

相關(guān)文章

  • 微信公眾平臺(tái)OAuth2.0 認(rèn)證

    摘要:若用戶禁止授權(quán),則重定向后不會(huì)帶上參數(shù),僅會(huì)帶上參數(shù)點(diǎn)擊修改第二步封裝拉取用戶信息類公共賬號(hào)公眾賬號(hào)接收參數(shù)第一步根據(jù)獲取第二步根據(jù)獲取的和存放認(rèn)證的第三步拉取信息返回?cái)?shù)據(jù)格式鄭州河南中國(guó)帶有用戶信息數(shù)組微信認(rèn)證類下載認(rèn)證下載 第一步:引導(dǎo)用戶打開(kāi)如下鏈接 (詳細(xì)介紹見(jiàn)OAuth2.0) $url = urlencode(http://xxx.com/xxx); $newurl = ...

    iflove 評(píng)論0 收藏0
  • Django增加QQ第三方登錄

    摘要:在授權(quán)頁(yè)面里面,登錄并確認(rèn)授權(quán)。從騰訊提供的按鈕下載放到你的登錄頁(yè)面即可。騰訊不給得到真實(shí)號(hào)可能是出于保護(hù)隱私的考慮。再回頭編輯,添加回調(diào)地址的處理方法逆向解析第三方登錄,回調(diào)函數(shù)登錄之后,會(huì)跳轉(zhuǎn)到這里。 準(zhǔn)備工作_OAuth2.0 接入QQ登錄前,網(wǎng)站需首先進(jìn)行申請(qǐng),獲得對(duì)應(yīng)的appid與appkey,以保證后續(xù)流程中可正確對(duì)網(wǎng)站與用戶進(jìn)行驗(yàn)證與授權(quán)。showImg(https://...

    Heier 評(píng)論0 收藏0
  • 微信授權(quán)和sdk加密算法

    摘要:準(zhǔn)備工作申請(qǐng)服務(wù)器公眾號(hào)基本配置這些微信公眾平臺(tái)上都有,就不介紹了,接下來(lái)進(jìn)入正題。隨著微信管控越發(fā)嚴(yán)厲,像一些最基本的網(wǎng)頁(yè)轉(zhuǎn)發(fā)都需要授權(quán)處理才能獲取到圖片和描述,描述審查也是相當(dāng)嚴(yán)格。 準(zhǔn)備工作: 申請(qǐng)服務(wù)器 公眾號(hào) 基本配置 這些微信公眾平臺(tái)上都有,就不介紹了,接下來(lái)進(jìn)入正題。 ? 微信網(wǎng)頁(yè)授權(quán) node js-sdk 授權(quán)公眾平臺(tái)的技術(shù)文檔目的為了簡(jiǎn)明扼要的交代接口的使用,語(yǔ)句難...

    gaara 評(píng)論0 收藏0
  • PHP下的Oauth2.0嘗試 - 授權(quán)碼授權(quán)(Authorization Code Grant)

    摘要:不太熟悉什么是的同學(xué)可以參考阮大神的文章,理解阮一峰授權(quán)碼模式授權(quán)代碼授予類型用于獲得訪問(wèn)權(quán)限令牌和刷新令牌,并為機(jī)密客戶進(jìn)行了優(yōu)化。 OAuth 2.0 不太熟悉什么是OAuth2.0的同學(xué)可以參考阮大神的文章, 理解OAuth 2.0 - 阮一峰 授權(quán)碼模式(Authorization Code) # 授權(quán)代碼授予類型用于獲得訪問(wèn)權(quán)限令牌和刷新令牌,并為機(jī)密客戶進(jìn)行了優(yōu)化。 # 由...

    zilu 評(píng)論0 收藏0
  • 關(guān)于網(wǎng)站微博和QQ第三方的登陸

    摘要:近幾日由于公司業(yè)務(wù)需要,要做一個(gè)網(wǎng)站的第三方登陸,并且登陸之后并進(jìn)行驗(yàn)證,只有登陸過(guò)我們手機(jī)的第三方賬號(hào)才可以登陸網(wǎng)站。只能百度,發(fā)現(xiàn)騰訊對(duì)于網(wǎng)站登陸和手機(jī)登陸拿到的是不一樣的,如果要想一樣得寫(xiě)申請(qǐng)信給,簡(jiǎn)直就是蛋疼。 近幾日由于公司業(yè)務(wù)需要,要做一個(gè)網(wǎng)站的第三方登陸,并且登陸之后并進(jìn)行驗(yàn)證,只有登陸過(guò)我們手機(jī)app的第三方賬號(hào)才可以登陸網(wǎng)站。 這邊先說(shuō)下oauth2.0大概的流程吧...

    mist14 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<