国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

搭建OAuth2.0

Cheriselalala / 1915人閱讀

摘要:原因使用簡(jiǎn)單,可以很快上手,文檔齊全,功能完善。請(qǐng)求,端對(duì)應(yīng)的模板里是告知用戶,即將授予的權(quán)限列表,以及是否允許授權(quán)的按鈕。請(qǐng)求,端獲取用戶資源各種授權(quán)類型,都可以很方便支持。

前奏

系統(tǒng):Ubuntu
語(yǔ)言:PHP7
框架:YAF
OAuth2.0:bshaffer/oauth2-server-php

OAuth2.0 有很多開源代碼庫(kù)

Github 排名前兩位

thephpleague/oauth2-server
bshaffer/oauth2-server-php

本文使用的是第二個(gè):bshaffer。原因:使用簡(jiǎn)單,可以很快上手,文檔齊全,功能完善。

wiki: https://bshaffer.github.io/oa...
github: https://github.com/bshaffer/o...

引入 OAuth2.0 的 Server 端源代碼

編輯 Composer.json 文件

{
    "require": {
        "bshaffer/oauth2-server-php" : "v1.10.0"
    }
}

yaf框架結(jié)構(gòu)

├── application
│   └── modules
│       └── User
│           ├── controllers
│??         │   └── Oauth.php
│           └── views
│               └── oauth
│                   ├── authorize.php
│                   ├── auth.php
│                   ├── index.php
│                   └── resource.php
├── Bootstrap.php
├── cli
├── composer.json
├── composer.lock
├── composer.phar
├── conf
├── docs
├── public
└── vendor

Yaf 框架中,在 Bootstrap.php 文件中自動(dòng)加載 OAuth2.0

public function _initLoader(Yaf_Dispatcher $dispatcher)
{
    include(APP_PATH . "/vendor/autoload.php");
}

新建一個(gè) Controller 文件:Oauth.php,在里面建立幾個(gè) Action

AuthorizeAction()   服務(wù)端:提供授權(quán)
TokenAction()       服務(wù)端:提供Token
ResourceAction()    服務(wù)端:提供資源
IndexAction()       客戶端:模擬第三方接入
_server()           服務(wù)端:初始化服務(wù)器相關(guān),如:存儲(chǔ),這里采用mysql

命名空間

use OAuth2Server;
use OAuth2StoragePdo;
use OAuth2GrantTypeAuthorizationCode;
use OAuth2GrantTypeClientCredentials;
use OAuth2GrantTypeUserCredentials;
use OAuth2Request;
use OAuth2Response;

_server() 函數(shù)代碼

private function _server()
{
    $dbParams = array(
        "dsn"      => "mysql:host=127.0.0.1;port=3306;dbname=oauth;charset=utf8;",
        "username" => "root",
        "password" => "123456",
    );

    // $dsn is the Data Source Name for your database, for exmaple "mysql:dbname=my_oauth2_db;host=localhost"
    $storage = new Pdo($dbParams);

    // Pass a storage object or array of storage objects to the OAuth2 server class
    $server = new Server($storage);

    // Add the "Client Credentials" grant type (it is the simplest of the grant types)
    $server->addGrantType(new ClientCredentials($storage));

    // Add the "Authorization Code" grant type (this is where the oauth magic happens)
    $server->addGrantType(new AuthorizationCode($storage));

    return $server;
}

IndexAction() 代碼

public function indexAction()
{
    $uri   = $_SERVER["QUERY_STRING"];
    $code  = substr($uri, strpos($uri, "code=")+5, 40);
    $state = substr($uri, strpos($uri, "state=")+6);

    if ($code) {
        $params = array(
            "code"          => $code,
            "state"         => $state,
            "client_id"     => "client_id",
            "client_secret" => "client_secret",
            "grant_type"    => "authorization_code",
            "scope"         => "basic",
            "redirect_uri"  => "http://yourhost/user/oauth/index",
        );
        
        $url = "http://yourhost/user/oauth/token";

        $result = $this->httpPost($url, $params);
        $result = json_decode($result, true);

        //寫入Session,便于測(cè)試
        Yaf_Session::getInstance()->set("access_token",$result["access_token"]);
        return false;
    } else {
        //客戶端請(qǐng)求授權(quán)之前,頁(yè)面中展示一個(gè)鏈接,用戶點(diǎn)后,可以跳轉(zhuǎn)至服務(wù)端的授權(quán)頁(yè)面。
        $this->getView()->assign("data", array())->render("oauth/index.php");
    }
}

對(duì)應(yīng)的模板代碼:oauth/index.php


AuthorizeAction() 代碼

/**
 * 展示授權(quán)頁(yè)面,用戶可以點(diǎn)擊同意進(jìn)行授權(quán)
 */
public function AuthorizeAction()
{
    $request = Request::createFromGlobals();
    $is_authorized = $request->request("is_authorized") ? true : false;

    //判斷用戶是否同意授權(quán)
    if ($is_authorized) {

        $response = new Response();
        $server = $this->_server();

        // validate the authorize request
        if (!$server->validateAuthorizeRequest($request, $response)) {
            $response->send();
            die;
        }

        $server->handleAuthorizeRequest($request, $response, $is_authorized)->send();

        return false;
    }

    //將請(qǐng)求授權(quán)中帶來(lái)的各個(gè)參數(shù),寫入授權(quán)頁(yè)中的變量,用以授權(quán)表單POST提交。
    $renderData = $_GET;
    $this->getView()->assign("data", $renderData)->render("oauth/authorize.php");
}

用戶授權(quán)頁(yè)面:oauth/authorize.php

  1. 直達(dá)天庭 - 南天門
  2. 天庭

  3. |我的應(yīng)用
  4. 有 1 個(gè)你關(guān)注的人連接
  5. 將允許人間進(jìn)行以下操作:
    • 獲得你的個(gè)人信息,好友關(guān)系
    • 分享內(nèi)容到你的微博
    • 獲得你的評(píng)論
  6. "/>
  7. "/>
  8. "/>
  9. "/>
  10. "/>
  11. "/>

TokenAction()

</>code

  1. /**
  2. * 返回JSON結(jié)構(gòu)數(shù)據(jù)
  3. * {
  4. access_token: "977b1077556e9b23ff07ef7606a5eaf947f27d41",
  5. expires_in: 3600,
  6. token_type: "Bearer",
  7. scope: "basic",
  8. refresh_token: "d2367887bdd743121adfe5fda5083064439f1cb1"
  9. }
  10. */
  11. public function TokenAction()
  12. {
  13. $server = $this->_server();
  14. $server->handleTokenRequest(Request::createFromGlobals())->send();
  15. return false;
  16. }

ResourceAction() 代碼

</>code

  1. public function ResourceAction()
  2. {
  3. $server = $this->_server();
  4. //獲取授權(quán)用戶Session中保存的access_token,用access_token可以請(qǐng)求權(quán)限范圍內(nèi)的所有接口
  5. $_POST["access_token"] = Yaf_Session::getInstance()->get("access_token");
  6. // Handle a request to a resource and authenticate the access token
  7. if (!$server->verifyResourceRequest(Request::createFromGlobals())) {
  8. $server->getResponse()->send();
  9. die;
  10. }
  11. echo json_encode(array("success" => true, "message" => "You accessed my APIs!"));
  12. return false;
  13. }

請(qǐng)求用戶資源:/user/oauth/resource

</>code

  1. {
  2. success: true,
  3. message: "You accessed my APIs!"
  4. }

實(shí)現(xiàn)思路:

URL請(qǐng)求:/user/oauth/index,Client端

對(duì)應(yīng)的模板里放置一個(gè)鏈接,用以跳轉(zhuǎn)至服務(wù)端的授權(quán)認(rèn)證頁(yè)面/user/oauth/authorize。授權(quán)成功后,服務(wù)端會(huì)將對(duì)應(yīng)的code和state參數(shù),附在回調(diào)的redirect_uri里,即:/user/oauth/index?code=fcd6a9589e7ab43398e4e5349b23846babc79fab&state=xxx,在indexAction中解析出回調(diào)的code,用以請(qǐng)求接口/user/oauth/token,來(lái)交換access_token。

URL請(qǐng)求:/user/oauth/authorize,Server端
對(duì)應(yīng)的模板里是告知用戶,即將授予的權(quán)限列表,以及是否允許授權(quán)的按鈕。

URL請(qǐng)求:/user/oauth/token,Server端
獲取access_token。

URL請(qǐng)求:/user/oauth/resource,Server端
獲取用戶資源

LAST:

各種授權(quán)類型,都可以很方便支持。

數(shù)據(jù)存儲(chǔ)層,也可以隨意切換,比如切換為 Redis

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/28165.html

相關(guān)文章

  • 從零開始用 Flask 搭建一個(gè)網(wǎng)站(四)

    摘要:前言從零開始用搭建一個(gè)網(wǎng)站三介紹了網(wǎng)頁(yè)前端與后端前端與前端之間數(shù)據(jù)的交流。作者極光為極光團(tuán)隊(duì)賬號(hào),歡迎關(guān)注原文從零開始用搭建一個(gè)網(wǎng)站四知乎專欄極光日?qǐng)?bào) 前言 從零開始用 Flask 搭建一個(gè)網(wǎng)站(三) 介紹了網(wǎng)頁(yè)前端與后端、前端與前端之間數(shù)據(jù)的交流。本節(jié)主要介紹一下如何應(yīng)用 Flask-OAuthlib, 使用 Flask-OAuthlib 就可以輕松地請(qǐng)求第三方應(yīng)用提供的 API 。...

    CarterLi 評(píng)論0 收藏0
  • Spring Cloud 上手實(shí)戰(zhàn)-架構(gòu)解析及實(shí)作

    摘要:服務(wù)器將要監(jiān)聽的端口不要使用服務(wù)進(jìn)行注冊(cè)不要在本地緩存注冊(cè)表信息使用一個(gè)新的注解,就可以讓我們的服務(wù)成為一個(gè)服務(wù)服務(wù)發(fā)現(xiàn)客戶端配置以為例需要做件事情成為服務(wù)發(fā)現(xiàn)的客戶端配置對(duì)應(yīng)來(lái)說(shuō)我們只需要配置如下啟動(dòng)運(yùn)行查看。 Spring簡(jiǎn)介 為什么要使用微服務(wù) 單體應(yīng)用: 目前為止絕大部分的web應(yīng)用軟件采用單體應(yīng)用,所有的應(yīng)用的用戶UI、業(yè)務(wù)邏輯、數(shù)據(jù)庫(kù)訪問(wèn)都打包在一個(gè)應(yīng)用程序上。 showI...

    Godtoy 評(píng)論0 收藏0
  • OAuth2基本概念和運(yùn)作流程

    摘要:目前的版本是版,本文將對(duì)的一些基本概念和運(yùn)行流程做一個(gè)簡(jiǎn)要介紹。只要有一個(gè)第三方應(yīng)用程序被破解,就會(huì)導(dǎo)致用戶密碼泄漏,以及所有被密碼保護(hù)的數(shù)據(jù)泄漏。運(yùn)行流程客戶端向資源所有者請(qǐng)求授權(quán)。 OAuth(開放授權(quán))是一個(gè)關(guān)于授權(quán)的開放標(biāo)準(zhǔn),允許用戶讓第三方應(yīng)用訪問(wèn)該用戶在某一網(wǎng)站上存儲(chǔ)的私密的資源(如照片,視頻,聯(lián)系人列表),而無(wú)需將用戶名和密碼提供給第三方應(yīng)用。目前的版本是2.0版,本文將...

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

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

0條評(píng)論

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