适用于Kohana3.x
1. [文件] oauth.zip
2. [文件] oauth.php
class Controller_OAuth extends Controller { public function action_index() { $result = array('status' => '400'); $this->sendQuery($result); } // 获取未授权的Request Token public function action_request() { $result = array('status' => '400'); $provider = new OAuth_Provider(); $provider->setRequestTokenQuery(); try { $provider->checkRequest(); $token = $provider->generateRequestToken(); $result['status'] = 200; $result = Arr::merge($result, $token); } catch (Exception $e) { $result['code'] = $e->getCode(); $result['message'] = $e->getMessage(); } $this->sendQuery($result); } // 获取用户授权的Request Token public function action_authorize() { $result = array('status' => '400'); try { $oauth_token = Arr::get($_REQUEST, 'oauth_token'); if (!$oauth_token) { throw new Exception('缺少 oauth_token'); } $request_token = OAuth_Token::findByToken($oauth_token); if(!is_object($request_token) || !$request_token->isRequest()){ throw new Exception('oauth_token 错误'); } $username = Arr::get($_REQUEST, 'username'); $password = Arr::get($_REQUEST, 'password'); if (Auth::instance()->login($username, $password) !== TRUE) { throw new Exception('用户名或密码错误'); } $request_token->setVerifier(OAuth_Provider::generateVerifier()); $request_token->setUserId(Auth::instance()->instance()->get_user()->id); $result['status'] = 200; $result['message'] = '授权成功'; $result['callback'] = $request_token->getCallback(); $result['oauth_token'] = $oauth_token; $result['oauth_verifier'] = $request_token->getVerifier(); } catch (Exception $e) { $result['message'] = $e->getMessage(); } $this->sendQuery($result); } // 使用授权后的Request Token换取Access Toke public function action_access() { $result = array('status' => '400'); // xauth $x_auth_mode = Arr::get($_REQUEST, 'x_auth_mode'); if ($x_auth_mode == 'client_auth') { $username = Arr::get($_REQUEST, 'x_auth_username'); $password = Arr::get($_REQUEST, 'x_auth_password'); if (Auth::instance()->login($username, $password) !== TRUE) { throw new Exception('用户名或密码错误'); } $userid = Auth::instance()->instance()->get_user()->id; try { // 生成request token $provider = new OAuth_Provider(); $provider->setRequestTokenQuery(); $provider->checkRequest(); $consumer = $provider->getConsumer(); if ($consumer->getType() !== 1) { throw new Exception('请申请XAuth认证'); } $token = sha1(OAuthProvider::generateToken(20, true)); $secret = sha1(OAuthProvider::generateToken(20, true)); $oauth_token = ORM::factory('oauth_token'); $oauth_token->type = 2; $oauth_token->consumer_id = $consumer->getId(); $oauth_token->token = $token; $oauth_token->token_secret = $secret; $oauth_token->callback_url = ''; $oauth_token->user_id = $userid; $oauth_token->verifier = ''; $oauth_token->save(); $result = array('status' => 200, 'oauth_token' => $token, 'oauth_token_secret' => $secret); } catch (Exception $e) { $result['code'] = $e->getCode(); $result['message'] = $e->getMessage(); } $this->sendQuery($result); } else { $provider = new OAuth_Provider(); try { $provider->checkRequest(); $token = $provider->generateAccessToken(); $result['status'] = 200; $result = Arr::merge($result, $token); } catch (Exception $e) { $result['code'] = $e->getCode(); $result['message'] = $e->getMessage(); } $this->sendQuery($result); } } public function action_test() { $result = array('status' => '400'); $provider = new OAuth_Provider(); try { $provider->checkRequest(); $userid = $provider->getUserId(); $result['status'] = 200; $result['message'] = ''; $result['userid'] = $userid; } catch (Exception $e) { $result['message'] = $e->getMessage(); } $this->sendQuery($result); } // 输出JSON public function sendQuery($result, $header = TRUE) { $body = is_array($result) ? http_build_query($result) : $result; $this->sendBody($body); } // 输出 public function sendBody($body) { $this->response->body($body); echo $this->response->send_headers()->body(); exit; } }
3. [文件] provider.php
<?php defined('SYSPATH') or die('No direct script access.'); /** * @author zhuzongxin dreamsxin@qq.com */ class OAuth_Provider { private $oauth; private $consumer; private $user_id; private $authentification_url; public static function createConsumer() { $key = sha1(OAuthProvider::generateToken(20, true)); $secret = sha1(OAuthProvider::generateToken(20, true)); return OAuth_Consumer::create($key, $secret); } public function __construct() { $config = Kohana::$config->load('oauth'); $this->authentification_url = URL::base(TRUE).Arr::get($config, 'authentification_url'); /* create our instance */ $this->oauth = new OAuthProvider(); /* setup check functions */ $this->oauth->consumerHandler(array($this, 'checkConsumer')); $this->oauth->timestampNonceHandler(array($this, 'checkNonce')); $this->oauth->tokenHandler(array($this, 'checkToken')); } public function checkRequest() { $this->oauth->checkOAuthRequest(); } public function setRequestTokenQuery() { $this->oauth->isRequestTokenEndpoint(true); //$this->oauth->addRequiredParameter("oauth_callback"); } public function generateRequestToken() { $token = sha1(OAuthProvider::generateToken(20, true)); $token_secret = sha1(OAuthProvider::generateToken(20, true)); $callback = $this->oauth->callback; OAuth_Token::createRequestToken($this->consumer, $token, $token_secret, $callback); return array('authentification_url' => $this->authentification_url, 'oauth_token' => $token, 'oauth_token_secret' => $token_secret, 'oauth_callback_confirmed' => 'true'); } public function generateAccesstoken() { $access_token = sha1(OAuthProvider::generateToken(20, true)); $secret = sha1(OAuthProvider::generateToken(20, true)); $token = OAuth_Token::findByToken($this->oauth->token); $token->changeToAccessToken($access_token, $secret); return array('oauth_token' => $access_token, 'oauth_token_secret' => $secret); } public static function generateVerifier() { $verifier = sha1(OAuthProvider::generateToken(20, true)); return $verifier; } public function checkConsumer($provider) { $return = OAUTH_CONSUMER_KEY_UNKNOWN; $aConsumer = OAuth_Consumer::findByKey($provider->consumer_key); if (is_object($aConsumer)) { if (!$aConsumer->isActive()) { $return = OAUTH_CONSUMER_KEY_REFUSED; } else { $this->consumer = $aConsumer; $provider->consumer_secret = $this->consumer->getSecretKey(); $return = OAUTH_OK; } } return $return; } public function checkToken($provider) { $token = OAuth_Token::findByToken($provider->token); if (is_null($token)) { return OAUTH_TOKEN_REJECTED; } elseif ($token->getType() == 1) { if ($token->getVerifier() != $provider->verifier) { return OAUTH_VERIFIER_INVALID; } else { $provider->token_secret = $token->getSecret(); return OAUTH_OK; } } elseif ($token->getType() == 2) { if ($token->getExpires() > 0 && time() - strtotime($token->getCreated()) > (int)$token->getExpires()) { return OAUTH_TOKEN_EXPIRED; } $this->user_id = $token->getUserId(); $provider->token_secret = $token->getSecret(); return OAUTH_OK; } } public function checkNonce($provider) { if ($this->oauth->timestamp < time() - 5 * 60) { return OAUTH_BAD_TIMESTAMP; } elseif ($this->consumer->hasNonce($provider->nonce, $this->oauth->timestamp)) { return OAUTH_BAD_NONCE; } else { $this->consumer->addNonce($this->oauth->nonce); return OAUTH_OK; } } public function getUserId() { if ($this->user_id) { return $this->user_id; } else { throw new Exception("User not authentificated"); } } public function getConsumer() { return $this->consumer; } }
声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章
如何修复KB5055612无法在Windows 10中安装?
4 周前ByDDD
<🎜>:泡泡胶模拟器无穷大 - 如何获取和使用皇家钥匙
4 周前By尊渡假赌尊渡假赌尊渡假赌
<🎜>:种植花园 - 完整的突变指南
3 周前ByDDD
北端:融合系统,解释
4 周前By尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆树的耳语 - 如何解锁抓钩
3 周前By尊渡假赌尊渡假赌尊渡假赌

热工具

MinGW - 适用于 Windows 的极简 GNU
这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver Mac版
视觉化网页开发工具

DVWA
Damn Vulnerable Web App (DVWA) 是一个PHP/MySQL的Web应用程序,非常容易受到攻击。它的主要目标是成为安全专业人员在合法环境中测试自己的技能和工具的辅助工具,帮助Web开发人员更好地理解保护Web应用程序的过程,并帮助教师/学生在课堂环境中教授/学习Web应用程序安全。DVWA的目标是通过简单直接的界面练习一些最常见的Web漏洞,难度各不相同。请注意,该软件中

Dreamweaver CS6
视觉化网页开发工具