zoukankan      html  css  js  c++  java
  • Oauth

    OAUTH验证流程:(客户端)

    先从OAUTH服务商获得:

    oauth_consumer_key
    oauth_consumer_secret

     签名方法查阅:

    http://wiki.opensns.qq.com/wiki/%E3%80%90QQ%E7%99%BB%E5%BD%95%E3%80%91%E7%AD%BE%E5%90%8D%E5%8F%82%E6%95%B0oauth_signature%E7%9A%84%E8%AF%B4%E6%98%8E

    1.获取授权地址 (程序请求)
    oauth_consumer_key :OAUTH服务提供商处注册一个应用的KEY
    oauth_signature_method :签名方法,HMAC-SHA1、RSA-SHA1与PLAINTEXT等三种
    oauth_signature :上面的签名方法对请求的签名 (加密key用oauth_consumer_secret)
    oauth_timestamp :发起请求的时间戳
    oauth_nonce :随机生成的字符串
    oauth_version :OAUTH的版本号,值必须为1.0
    其他参数

    2.服务商返回(程序请求后返回)

    oauth_token :返回未授权的token
    oauth_token_secret :返回未授权的SECRET
    其他参数

    3.去服务商得到用户授权 (组成地址页面后跳转到该地址)
    oauth_token :服务商返回的token (上一步返回的)
    oauth_callback :回调地址
    其他参数

    4.服务商引导用户登录,返回 (登录后会跳转到回来,一般有GET参数,根据OAUTH服务商而不同)
    oauth_token :服务商返回的token[备注:可能不会返回,如果没返回上上面的那个token,YAHOO就是如此](跟上面的oauth_token同个值)
    其他参数

    5.发送用户授权请求 (程序请求)
    oauth_consumer_key :OAUTH服务提供商处注册一个应用的KEY
    oauth_token :服务商返回的token
    oauth_signature_method :签名方法,HMAC-SHA1、RSA-SHA1与PLAINTEXT等三种
    oauth_signature :上面的签名方法对请求的签名(加密key:oauth_consumer_secret&oauth_token_secret)
    oauth_timestamp :发起请求的时间戳
    oauth_nonce :随机生成的字符串
    oauth_version :OAUTH的版本号,值必须为1.0
    其他参数

    6.服务商返回 (获取到授权后的token,未授权的token没用了)
    oauth_token :服务商返回的得到用户授权的token
    oauth_token_secret :服务商返回的secret
    其他参数

    /**/

    有些服务商需要再次得到用户的一些授权,如FACEBOOK,此部分内容不属于oauth部分,一般无token传递

    /**/

    7.得到用户授权,取用户的资料
    oauth_consumer_key :OAUTH服务提供商处注册一个应用的KEY
    oauth_token :服务商返回的得到用户授权token (授权token)
    oauth_signature_method :签名方法,HMAC-SHA1、RSA-SHA1与PLAINTEXT等三种
    oauth_signature :上面的签名方法对请求的签名 (加密KEY:oauth_consumer_secret&oauth_token_secret)
    oauth_timestamp :发起请求的时间戳
    oauth_nonce :随机生成的字符串
    oauth_version :OAUTH的版本号,值必须为1.0
    其他参数

    涉及到的key跟 secret有:

    应用注册得到的:

    oauth_consumer_key

    oauth_consumer_secret

     请求得到的(2套)1.未授权的,2登录后返回并用未授权的去交换得到已授权的

    oauth_token

    oauth_token_secret

    思路流程如上,可以去豆瓣注册一个帐号来测试这个流程

    豆瓣的OAUTH的地址:
    http://www.douban.com/service/auth/request_token
    http://www.douban.com/service/auth/authorize
    http://www.douban.com/service/auth/access_token

    实际应用的地址:

    http://api.douban.com/people/%40me

    OAuth库可以到

    http://code.google.com/p/oauth

    下载

    备注:

    Oauth文件的 246行错误  '://' . $_SERVER['HTTP_HOST']  请更改为: '://' . $_SERVER['SERVER_NAME']

    [提示]

    在版本r1261已经更正,详细信息请浏览:http://code.google.com/p/oauth/issues/detail?id=192

    OAuth授权流程:(OAuth服务器)

    1.数据存储

    1.注册应用时候的

    oauth_consumer_key

    oauth_consumer_secret

    2.未授权的

    oauth_token

    oauth_token_secret

    3.已授权的 (可以长久存储)

    oauth_token

    oauth_token_secret

    4.防止重复或恶意请求的

    oauth_nonce

    2,4存储后定期清除

    具体实现可以看

    http://code.google.com/p/oauth

    的OAuth_TestServer.php

    以下是对testserver的要重写的方法的详细注释:


    public function lookup_consumer($consumer_key) {/*{{{*/
            //根据$consumer_key查询出key 跟secret记录是否存在
             $sconsumer = new OAuthConsumer("key", "secret", NULL);
            /*是否有注册记录,有返回consumer,看是否有记录*/
            if ($consumer_key == $sconsumer->keyreturn $sconsumer;
            return NULL;
        }/*}}}*/
        /*查找是否存在授权KEY request || access*/
        public function lookup_token($consumer$token_type$token) {/*{{{*/
            /*是否有注册记录,有返回consumer,看是否有记录*/
             $sconsumer = new OAuthConsumer("key", "secret", NULL);
            $token_attrib = $token_type . "_token";
            switch ($token_type) {
                case 'request':
                    /*根据$consumer检查请已授权的key,secret是否存在,过期*/
                    $stoken = new OAuthToken("requestkey", "requestsecret", 1);
                break;
                case 'access':
                    /*根据$consumer检查请已授权的key,secret是否存在,过期*/
                    $stoken = new OAuthToken("accesskey", "accesssecret", 1);
                break;
                default:
                    return NULL;
                break;
            }
            if ($consumer->key == $sconsumer->key
                && $token == $stoken->key) {
                return $stoken;
            }
            return NULL;
        }/*}}}*/

       public  function lookup_nonce($consumer$token$nonce$timestamp) {/*{{{*/
            /*根据$consumer,$token检查 nonce 是否被使用过,首次请求$token为空*/
            $snonce='67bcf7011695556b057932fa8a171bbb';
            //用户返回真
            /*是否有注册记录,有返回consumer,看是否有记录*/
            $sconsumer = new OAuthConsumer("key", "secret", NULL);
            $request_token = new OAuthToken("requestkey", "requestsecret", 1);
            $access_token = new OAuthToken("accesskey", "accesssecret", 1);
            if ($consumer->key == $sconsumer->key
                && (($token && $token->key == $request_token->key)
                    || ($token && $token->key == $access_token->key))
                && $nonce == $snonce) {
                return $snonce;
            }
            return NULL;
        }/*}}}*/

        public function new_request_token($consumer) {/*{{{*/
            /*是否有注册记录,有返回consumer,看是否有记录*/
            $sconsumer = new OAuthConsumer("key", "secret", NULL);
            /*建立之前做必要校验*/
            if ($sconsumer->key == $consumer->key) {
                /*建立一个未授权KEY,并保存*/
                $request_token = new OAuthToken("requestkey", "requestsecret", 1);
                /*
                备注:
                这个token是返回给应用请求的,当应用得到该key在跳到登录页面并登录后
                做好已经登录用户于该requestkey的关联,下一步使用
                 
    */
                return $request_token;
            }
            return NULL;
        }/*}}}*/

        public  function new_access_token($token$consumer) {/*{{{*/
            /*是否有注册记录,有返回consumer,看是否有记录*/
            $sconsumer = new OAuthConsumer("key", "secret", NULL);
            /*
             * 
                  用户登录后返回到应用后的请求,检查$token是否登录(上一步的关联)
              $token 即上一步返回的requestkey,查询出
    requestsecret
            
    */
            /*建立之前做必要校验*/
            $request_token = new OAuthToken("requestkey", "requestsecret", 1);
            if ($consumer->key == $sconsumer->key
                && $token->key == $request_token->key) {
                    /*建立一个已授权KEY,并保存*/
                $access_token = new OAuthToken("accesskey", "accesssecret", 1);
                return $access_token;
            }
            return NULL;
        }/*}}}*/


  • 相关阅读:
    团队项目冲刺第十天
    gradle文件配置
    idea无Android项目
    php第二次实验报告
    最长回文字串(hdu 3068)
    优先队列实现哈弗曼最小权值
    最小生成树 克鲁斯卡尔(Kruskal)算法求最小生成树
    背包问题------ 分类: ACM 2015-08-03 20:57 1人阅读 评论(0
    Cent Savings (DP) 分类: ACM dp 2015-08-0
    Judging Troubles (multiset查找) 分类: ACM STL
  • 原文地址:https://www.cnblogs.com/liushannet/p/1933162.html
Copyright © 2011-2022 走看看