系统API访问受保护资源的机制(原创)

系统API访问受保护资源的机制(原创)
余超 yuchao86@gmail.com
如下是我参加新浪OpenAPI小组对于一个接口安全交互的流程,供大家参考,
系统API访问机制包括接口注册、安全校验、访问有效性检验的流程
如果接口没有以上措施,此类接口均存在严重安全漏洞,一旦暴露在公网上,匿名用户只要扫描到接口API链接,即可调用该接口获取数据,
即使在内部也容易造成无意的数据泄露。为了保证接口调用的安全,确保系统不会被恶意使用,
当第三方应用需要通过API访问受保护的资源时,需要通过OAuth认证机制来获得授权。
Open API 通过以下四个步骤来完成认证授权并访问受保护的资源:
1. 获取未授权的Request Token;
2. 请求平台或用户授权的Request Token;
3. 使用授权后的Request Token 换取Access Token;
4. 使用Access Token 访问受保护的资源;
require_once 'examples-config.php';
require_once 'HTTP/OAuth/Consumer.php';

$consumer = new HTTP_OAuth_Consumer($config->consumer_key, $config->consumer_secret);
$consumer->accept($request);

$args = array();
if ($config->method == 'POST' && !empty($_GET['args'])) {
    $args = $config->args;
}

try {
    $consumer->getRequestToken($config->request_token_url, $config->callback_url,
        $args, $config->method);
    echo json_encode(
        array(
            'token'        => $consumer->getToken(),
            'token_secret' => $consumer->getTokenSecret()
        )
    );
} catch (HTTP_OAuth_Consumer_Exception_InvalidResponse $e) {
    echo get_class($e) . "<br>\n" .
        "<br>\n" . $e->getBody() . "<br>\n";
} catch (Exception $e) {
    echo get_class($e) . ': ' . $e->getMessage() . "\n";
}

$consumer = new HTTP_OAuth_Consumer('key', 'secret');
$consumer->getRequestToken('http://example.com/oauth/request_token', $callback);

// Store tokens
$_SESSION['token']        = $consumer->getToken();
$_SESSION['token_secret'] = $consumer->getTokenSecret();

$url = $consumer->getAuthorizeUrl('http://example.com/oauth/authorize');
http_redirect($url); // function from pecl_http

// When they come back via the $callback url
$consumer = new HTTP_OAuth_Consumer('key', 'secret', $_SESSION['token'],
    $_SESSION['token_secret']);
$consumer->getAccessToken('http://example.com/oauth/access_token');

// Store tokens
$_SESSION['token']        = $consumer->getToken();
$_SESSION['token_secret'] = $consumer->getTokenSecret();

// $response is an instance of HTTP_OAuth_Consumer_Response
$response = $consumer->sendRequest('http://example.com/oauth/protected_resource');

另外,通过密码保护管理接口的安全性,设置管理会话超时,调用整个过程是否有加密?等等

参考如下:

Google的OAuth认证系统:
http://code.google.com/intl/zh-CN/apis/accounts/docs/OAuth_ref.html
认证代码接口:
http://oauth.net/code/  参考PHP部分
PEAR 包 HTTP_OAuth:
http://pear.php.net/package/HTTP_OAuth_Provider
一个网站使用的实例:

https://atutor.ca/acontent/demo/documentation/oauth_server_api.php




为了方便日后的维护,此认证流程相对比较麻烦些,所以在此整理一下
参考: http://developer.yahoo.com/oauth/guide/oauth-auth-flow.html

大体介绍:
总流程分为五步,分别是:

  1. 登录Yahoo申请应用,得到consumer key 与 consumer secret
  2. 利用consumer key 与 consumer secret换取oauth_ token,即获取请求令牌
  3. 引导用户在Yahoo进行授权,并返回授权的认证签名参数oauth_verifier,同时之前的oauth_ token也会一并返回
  4. 利用返回的oauth_verifier, oauth_token加上第一步的consumer key 与 consumer secret,加上第二步返回的oauth_token_secret,组合起来向Yahoo换取一个访问令牌oauth_token(此时已经是可以访问用户数据的访问令牌,跟之前的请求令牌不一样)
  5. 当访问令牌失效时,可以提交第四步返回的数据,交换一个新的有效令牌.


具体细节:

  1.   进入http://developer.yahoo.com/ 申请应用,注意App Domain一定要写上自己的域名,不然之后的认证是无法通过的
  2.   在此做了一个引导脚本,此脚本主要通过curl获取一个请求令牌,这里请求地址上务必带上oauth_callback 参数,这样Yahoo返回的参数中就会有一个xoauth_request_auth_url 参数,此参数会引导用户去Yahoo授权,这样可以简化我们去构造它的麻烦,此外,为了在主脚本中能用到参数oauth_token_secret,在此我将它写入cookie中
  3.   当授权成功后,Yahoo会引导用户进入第2步中oauth_callback参数传递过来的地址,并带有两个参数oauth_verifier, oauth_token,接受这两个参数,构造兑换访问令牌的请求地址,在此注意的是oauth_signature 这里根据Yahoo的要求,需要consumer secret与oauth_token_secret,并按consumer secret%26oauth_token_secret的要求赋值,这里我们用的oauth_signature_method方法是PLAINTEXT,不然这oauth_signature的构造方法得遵从Oauth1.0的定义哦
  4.   兑换访问令牌成功后会返回访问令牌oauth_token,用户唯一标识符xoauth_yahoo_guid,还有一个用于刷新过期访问令牌的oauth_session_handle,当然访问令牌的过期时间,这里也一并返回了,让咱们有个过期的心里准备
  5.   到这里了,也就没啥好说的,我很少用到这个功能,要如果真的用的话,也跟第4步一样的请求方式去跟Yahoo打个招呼,他就会返回给你,你想要的了认证做完了,到此处还好,基本一切正常,只是Yahoo的帮助文档内容太少,没有一些代码例子,没有一定的基础还真的不容易懂啊

最让人蛋疼的就是Yahoo的API了,帮助文档上更一笔带过,这叫Yahoo的Oauth1.0怎么能被人广泛使用呢?!
这里,我也是找了一些资料取了一些自己要用的函数,来实现了,因为Yahoo对于API中oauth_signature的要求,非得是HMAC-SHA1,不能是PLAINTEXT,所以这样问题就来了,Yahoo把问题交给了Oauth官网,想必很多开发者都在这里停住了吧,老是返回signature_invalid,看这些字母看得郁闷至极,也找不到帮助资料,怎么办?继续找,终于找到一个半成品,里面正好有关于signature的生成函数,my God看了一下,这里面的生成真是规矩啊,先给它参数排个序,再来hash_hmac加密,就这样,这层纸被捅破了.另外开发者还得了解一下如何用curl发送请求头信息,因为oauth1.0的请求数据都是放在请求头中的(可能这样更有效率,不过怎么更高级版本2.0的怎么就没有这样处理)

眼见为实,点击看demo

比Yahoo提供的SDK简单明了,下载地址

小结一下:
做Yahoo的Oauth1.0认证的朋友,要承受一定的心里压力,要在骂Yahoo的时候,也要相信他,同时基本的技能要扎实
PS:要想用Oauth来得到Yahoo的用户自身的邮箱的朋友,请你获取到后,告诉我一声


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值