easyswoole - 基于swoole扩展实现的一款高性能php框架

網(wǎng)頁授權(quán)

關(guān)于 OAuth 2.0

OAuth 是一個關(guān)于授權(quán)(authorization)的開放網(wǎng)絡(luò)標(biāo)準(zhǔn),在全世界得到廣泛應(yīng)用,目前的版本是 2.0 版。

OAuth 授權(quán)流程大致如下:

摘自:RFC 6749

步驟解釋:

(A)用戶打開客戶端以后,客戶端要求用戶給予授權(quán)。

(B)用戶同意給予客戶端授權(quán)。

(C)客戶端使用上一步獲得的授權(quán),向認(rèn)證服務(wù)器申請令牌。

(D)認(rèn)證服務(wù)器對客戶端進(jìn)行認(rèn)證以后,確認(rèn)無誤,同意發(fā)放令牌。

(E)客戶端使用令牌,向資源服務(wù)器申請獲取資源。

(F)資源服務(wù)器確認(rèn)令牌無誤,同意向客戶端開放資源。

關(guān)于 OAuth 協(xié)議我們就簡單了解到這里,如果還有不熟悉的同學(xué),請 Google 相關(guān)資料

微信 OAuth

在微信里的 OAuth 其實(shí)有兩種:公眾平臺網(wǎng)頁授權(quán)獲取用戶信息開放平臺網(wǎng)頁登錄

它們的區(qū)別有兩處,授權(quán)地址 不同,scope 不同。

他們的邏輯都一樣:

  • 用戶嘗試訪問一個我們的業(yè)務(wù)頁面,例如: /user/profile
  • 如果用戶已經(jīng)登錄,則正常顯示該頁面
  • 系統(tǒng)檢查當(dāng)前訪問的用戶并未登錄(從 session 或者其它方式檢查),則跳轉(zhuǎn)到 微信授權(quán)服務(wù)器(上面的兩種中一種 授權(quán) URL,并告知微信授權(quán)服務(wù)器我的 回調(diào) URL(redirect_uri=callback.php),此時用戶看到藍(lán)色的授權(quán)確認(rèn)頁面(scopesnsapi_base 時不顯示)
  • 用戶點(diǎn)擊確定完成授權(quán),瀏覽器跳轉(zhuǎn)到 回調(diào)URLcallback.php 并帶上 code?code=CODE&state=STATE
  • callback.php 中得到 code 后,通過 code 再次向微信服務(wù)器請求得到 網(wǎng)頁授權(quán) access_tokenopenid
  • 你可以選擇拿 openid 去請求 API 得到用戶信息(可選)
  • 將用戶信息寫入 SESSION
  • 跳轉(zhuǎn)到第 3 步寫入的 target_url 頁面(/user/profile)。

看懵了?沒事,使用 SDK,你不用管這么多。

注意,上面的第 3 步:redirect_uri=callback.php 實(shí)際上我們在 Swoole 中用 redirect_uri=callback 回調(diào)地址,后面還會帶上授權(quán)目標(biāo)頁面 user/profile,所以完整的 redirect_uri 應(yīng)該是下面的這樣的 PHP 去拼出來:'redirect_uri=' . urlencode('callback?target=user/profile'),拼接結(jié)果為:redirect_uri=callback%3Ftarget%3Duser%2Fprofile

邏輯組成

從上面我們所描述的授權(quán)流程來看,我們至少有 3 個頁面:

  • 業(yè)務(wù)頁面,也就是需要授權(quán)才能訪問的頁面。
  • 發(fā)起授權(quán)頁,此頁面其實(shí)可以省略,可以做成一個中間件,全局檢查未登錄就發(fā)起授權(quán)。
  • 授權(quán)回調(diào)頁,接收用戶授權(quán)后的狀態(tài),并獲取用戶信息,寫入用戶會話狀態(tài)(SESSION)。

開始之前

在開始之前請一定要記住,先登錄公眾號后臺,找到 邊欄 “開發(fā)” 模塊下的 “接口權(quán)限”,點(diǎn)擊 “網(wǎng)頁授權(quán)獲取用戶基本信息” 后面的修改,添加你的網(wǎng)頁授權(quán)域名。

如果你的授權(quán)地址為:http://www.abc.com/xxxxx,那么請?zhí)顚?www.abc.com,也就是說請?zhí)顚懪c網(wǎng)址匹配的域名,前者如果填寫 abc.com 是通過不了的。

SDK 中 OAuth 模塊的 API

SDK 中,我們使用名稱為 oauth 的模塊來完成授權(quán)服務(wù),我們主要用到以下兩個 API

發(fā)起授權(quán)

// $redirectUrl 為跳轉(zhuǎn)目標(biāo),請自行 `302` 跳轉(zhuǎn)到目標(biāo)地址
$redirectUrl = $officialAccount->oauth->scopes(['snsapi_userinfo'])
    ->redirect();

當(dāng)然你也可以在發(fā)起授權(quán)的時候指定回調(diào) URL,比如設(shè)置回調(diào) URL 為當(dāng)前頁面:

<?php

// 在 EasySwoole 中,$this->request() 為 EasySwoole 的請求對象
$redirectUrl = $officialAccount->oauth->scopes(['snsapi_userinfo'])
    ->redirect($this->request()->getUri());

// 在原生 Swoole 中,$request 為 \Swoole\Http\Request 的實(shí)例對象
$redirectUrl = $officialAccount->oauth->scopes(['snsapi_userinfo'])
    ->redirect($request->server['request_uri']);

它的返回值 $redirectUrl 是一個字符串跳轉(zhuǎn)地址,請自行使用框架的跳轉(zhuǎn)方法實(shí)現(xiàn)跳轉(zhuǎn),在 EasySwoole 中寫法為:

$this->response()->redirect($redirectUrl);

在原生 Swoole 中可以這樣寫:

// $response 為 \Swoole\Http\Response 的實(shí)例對象
$response->redirect($redirectUrl);

獲取已授權(quán)用戶

<?php

$code = "微信回調(diào)URL攜帶的 code";

$user = $officialAccount->oauth->userFromCode($code);

返回的 $userEasySwoole\WeChat\OfficialAccount\OAuth\User 對象,你可以從該對象拿到更多的信息。

$user 可以用的方法:

  • $user->getId(); 對應(yīng)微信的 openid
  • $user->getNickname(); 對應(yīng)微信的 nickname
  • $user->getName(); 對應(yīng)微信的 nickname
  • $user->getAvatar(); 頭像地址
  • $user->getRaw(); 原始 API 返回的結(jié)果
  • $user->getAccessToken(); access_token
  • $user->getRefreshToken(); refresh_token
  • $user->getExpiresIn(); expires_inaccess_token 的過期時間
  • $user->getTokenResponse(); 返回 access_token 時的響應(yīng)值

注意:$user 里沒有 openid$user->id 便是 openid。如果你想拿微信返回給你的原樣的全部信息,請使用:$user->getRaw();

當(dāng) scopesnsapi_base$officialAccount->oauth->user(); 對象里只有 id,沒有其它信息。

網(wǎng)頁授權(quán)實(shí)例

我們這里來用 PHP 原生 Swoole 寫法舉個例子,oauth_callback 是我們的授權(quán)回調(diào) URL (未 urlencode 編碼的 URL),user/profile 是我們需要授權(quán)才能訪問的頁面,它的 PHP 代碼如下:


// http://easyswoolewechat.com/user/profile

<?php

// ... 這里省略

$http->on('request', function (\Swoole\Http\Request $request, \Swoole\Http\Response $response) {

    $config = [
        // ...
        'oauth' => [
            'scopes' => ['snsapi_userinfo'],
            'callback' => '/oauth_callback',
        ],
        // ..
    ];

    $officialAccount = \EasySwoole\WeChat\Factory::officialAccount($config);

    $oauth = $officialAccount->oauth;

    // 未登錄
    if (empty($_SESSION['wechat_user'])) {

        $_SESSION['target_url'] = 'user/profile';
        $redirectUrl = $oauth->redirect();
        $request->redirct($redirectUrl);
        exit;
    }

    // 已經(jīng)登錄過
    $user = $_SESSION['wechat_user'];
});

// ... 這里省略

授權(quán)回調(diào)頁:

// http://easyswoolewechat.com/oauth_callback

<?php

// ... 這里省略

$http->on('request', function (\Swoole\Http\Request $request, \Swoole\Http\Response $response) {

    $config = [
        // ...
    ];

    $officialAccount = \EasySwoole\WeChat\Factory::officialAccount($config);

    $oauth = $officialAccount->oauth;

    // 獲取 OAuth 授權(quán)結(jié)果用戶信息
    $code = "微信回調(diào)URL攜帶的 code";

    $user = $oauth->userFromCode($code);

    $_SESSION['wechat_user'] = $user->toArray();

    $targetUrl = empty($_SESSION['target_url']) ? '/' : $_SESSION['target_url'];

    // 跳轉(zhuǎn)到 user/profile
    $response->redirect($targetUrl);
});

// ... 這里省略

上面的例子呢都是基于 $_SESSION 來保持會話的,在微信客戶端中,你可以結(jié)合 Cookies 來存儲,但是有效期平臺不一樣時間也不一樣,好像 Android 的失效會快一些,不過基本也夠用了。

主站蜘蛛池模板: 苏州市相城区望亭镇叶凡工艺服饰绣品厂 | 网站建设-百度SEO关键词优化与企业全网营销推广服务-启源信息 | 宁波允泰仪器有限公司-硬度计、拉力试验机、盐雾试验箱、影像测量仪、气动量仪 | 四川超声波清洗机厂家-旋转喷淋清洗机设备-成都鑫荣诚超声波科技有限公司 | 山东凯达起重机械有限公司-单梁行车,龙门吊,提梁机,门式起重机,悬臂起重机 | 银龙制冷—北京冷库工程建设安装公司!【20年专业制冷】 | 运动控制器_数控系统_廊坊市九盈数控技术公司「官网」 | 辣椒烘干机-百信机械提供大中小型辣椒烘干机房设备视频图片厂家价格多少钱 | 专注全球电机测试-电机测试系统-AIP艾普【官网】 | 威学一百-专注国际学校择校备考-DSE-A-level-雅思-托福-OSSD-港澳台联考-AP-IGCSE-IB-AMC-多邻国-PTE-SAT-SSAT-小语种(如日语,韩语,德语,法语,西班牙语,意大利语,俄语,泰语)等考试培训,为出国留学学生提供个性化定制性学习方案,线下实体面授+线上网络课程, 提供一对一,小班课等多种班型 | 离子交换树脂_阴离子交换树脂_阳离子交换树脂-中国树脂网 | 中华收藏网-中藏网-藏品拍卖|字画拍卖|艺术品拍卖|古玩城|收藏资讯|古玩交易|书画定制 | 铱金供应-上海钌合金-氯铱酸厂家-上海庞势新材料科技有限公司 | 灭菌洗箱机_周转箱清洗机_隧道式洗箱机 - 环速科技有限公司 | 山东凯达起重机械有限公司-单梁行车,龙门吊,提梁机,门式起重机,悬臂起重机 | 网站制作-网站制作公司-专业制作网站【做网站找企术】 | 全自动烫金机-全自动移印机-全自动丝印机-全自动平面机-东莞联昌实业供应各种丝印机和移印机 | 济南德固机械|膨化食品生产线|早餐谷物玉米片生产线|拉丝蛋白生产线|速食米饭生产线 | 葡萄糖酸钠_食用葡萄糖_精萘-安徽鹏腾实业有限公司 | 青州市昌达机械设备有限公司_洗石机-洗砂机-筛沙机-砂石分离机-洗轮机-制砂机 | 阻抗分析仪 阻抗测试仪 介电常数测试仪 充电枪测试仪-苏州腾斯凯电子科技有限公司 | 铝合金锻造|链轮曲柄-同力铝业股份有限公司| 泰安华特玻璃钢有限公司|泰安玻璃钢|泰安华特玻璃钢 | 图表秀——免费在线图表制作工具,数据可视化工具 | 合肥环氧地坪-合肥固化地坪施工-安徽地宽建筑装饰工程有限公司 | 清尼龙滤膜-清洁度检测设备-清洁度分析仪-清洁度萃取机-优昂(百科) | 微机继电保护测试仪,单相继电保护测试仪,三相继电保护测试仪,六相继电保护测试仪,介质损耗测试仪,氧化锌避雷器测试仪,无线核相仪-扬州豪泰电力科技有限公司 | 数海经纬官方网站 - 声学智能领域先行者 - 数海经纬(深圳)信息技术有限公司 | 曙海培训-仿真培训Linux培训html5培单片机培训PCB培训python培训PLC培训C语言培训android培训物联网培训无线电培训欧姆龙培训工业机器人培训5G培训Hadoop培训CFD培训项目外包开发咨询 | 智能试剂柜-疾控|高校实验室|医院药品智能试剂管理柜-北京晶品赛思 | 惠州清洁公司|惠州保洁公司|惠州清洁|惠州保洁|惠州清洁服务|惠州保洁服务|壹壹集团 | 齐东汽车-提供抑尘车|洒水车|压缩垃圾车|餐厨垃圾车|垃圾转运车|清洗吸污车|扫路车价格,图片及视频 | 西安汉信丨条码打印机,条码扫码枪,条码标签,条码仓库管理系统专业供应商 | 武汉防雷检测_防雷工程设计施工_防雷设备材料_湖北普天科技有限公司 | 河卵石制砂机|鹅卵石制砂机-移动制砂机-制砂设备-郑州秦星机械设备有限公司 | 数字多媒体展厅设计,智慧科技互动企业展馆展厅设计公司-深圳炫之风 | 黄山澳盛源新材料科技有限公司 | 全球石油化工网 - 石油化工资讯,石油化工机械,石油化工设备,石油化工贸易,石油化工技术,尽在石油化工网 | 拓展器材_拓展训练器械_心理行为训练器械_沧州华北特训器械有限公司 | 数控钢筋弯箍机_数控钢筋弯曲中心_数控钢筋笼滚焊机厂家_山东佳信 | 南通海拓机械有限公司|剪板机|折弯机|卷板机|开卷校平线 |