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;
    }/*}}}*/


原文地址:https://www.cnblogs.com/liushannet/p/1933162.html