oauth 认证心得

OAUTH协议为用户资源的授权提供了一个安全的、开放而又简易的标准。简易来说,就是我们可以在某一个第三方服务器,如:新浪,豆瓣,在用户授权,并且不透漏密码等信息给我们的条件下,访问和修改用户的资源。

oauth的项目主页为:http://oauth.net/ ,现在国内很多网站的开放平台都采用了Oauth方式来进行授权。如新浪微博,豆瓣,腾讯微博。由于其存在庞大的用户群,在一些网站上添加这些大网站的oauth功能是比较有必要的。

oauth目前有两个版本,新浪豆瓣腾讯目前都是用的1.0版本,2.0版本的oauth应用较少,如人人,42区 而我这段时间主要是做oauth1.0,,在各大社交平台进行认证,帮助用户同步在我们网站留下的信息。

oauth1.0认证过程比较繁琐,虽然网上关于oauth有很多文档,但是初学者看来,有时候也会有些迷惑(所以我迷惑很久..)。所以我以一个菜鸟的角度来将oauth的需要注意的地方叙述一下,希望对大家有所帮助。

建议新手首先看这篇文章 http://open.weibo.com/wiki/OAuth  ,对Oauth的大致流程有所了解(PS,新浪,豆瓣其实都有自己的sdk,了解流程之后,调用其api即可)

我们看到,其实我们主要就是要让我们的网站做以下事情:1.向sina发送一个请求,表明你想要用他的服务,这个时候,你需要将你申请的app的key 和secret给sina,通过sina申请一个request_token2.虽然你获得了一个request_token,但是这个token其实是 没有经过授权的,你需要拿着这个token,再返回给sina,然后通过sina引导向用户,让用户同意你的获得信息请求.3.当用户同意你的信息请求之 后。你就可以再用这个token,换取一个access_token相当于一个永久的钥匙,以后直接用这个access_token来发表信息,获得用户 信息了。

大致就是这样一个过程。但是由于每一步的操作,都要对发送的信息进行处理。所以会导致像我这样的小菜鸟晕晕乎乎。我提的建议就是,大致看一下过程之后,迈出第一步,顺利获得一些信息之后,其他的其实都类似了。\

所以我这里也只是讲一下获得request_token的方法。

说是request_token,其实也就是两个字符串,一个key一个secret。为了获得key和secret,我们需要传入以下参数(参数不是硬性要求,看sina官方文档,不同oauth的server可能会有细微差别): 

consumer secret - 此secret即为开始申请时获得的新浪apisecret
oauth_callback - 回调url,等用户在sina授权之后,sina将会引导用户到这个地址,让你知道你的requesttoken授权成功
oauth_consumer_key - 开始申请时你的sina api key
oauth_nonce - 一个随机字符串,在官方提供的oauth库中通过以下方式获得

def generate_nonce(length=8):
    """Generate pseudorandom number."""
    return ''.join([str(random.randint(0, 9)) for i in range(length)])

oauth_signature_method - HMAC-SHA1 参数值日即为字符串'HMAC-SHA1'
oauth_timestamp - 1272323042 标示时间的一个字符串
def generate_timestamp():
    """Get seconds since epoch (UTC)."""
    return int(time.time())
oauth_version - 1.0     oauth版本
这些所有的都准备好之后,生成一个字符串,叫BaseString
在oauth库中有如下代码

def build_signature_base_string(self, oauth_request, consumer, token):
    sig = (
        escape(oauth_request.get_normalized_http_method()),
        escape(oauth_request.get_normalized_http_url()),
        escape(oauth_request.get_normalized_parameters()),
    )
    key = '%s&' % escape(consumer.secret)
    if token:
        key += escape(token.secret)
    raw = '&'.join(sig)
    return key, raw

其中的raw即为baseString,就是将你将要请求某个页面的方法(这个方法在不同网站和不同步骤中有所不同,注意甄别),你请求的requesturl,还有刚刚说过的那几个参数,变成一个大的string,方便之后进行签名操作。
上面的key就是签名的时候传入的另外一个参数。经过上面的计算之后,就会生成key ,raw两个参数

然后我们利用这个key,raw,通过hmac.new(key, raw, sha)计算出一个signature,这个时候我们所有参数就已经准备完毕了。然后就是看sina那里是需要get还是post,我们给sina发一个请求,传入刚刚所有的参数包括:
consumer secret,oauth_callback ,oauth_consumer_key,oauth_nonce,,oauth_signature_method,oauth_timestamp ,oauth_version还有我们刚刚算出来的oauth_signature传入,就可以获得request_token了

其实其余所有步骤都大同小异,都是先计算basestring,然后发送请求,读取sina的回应。代码不多,只要将几个计算的util写好,就比较方便

需要注意的几点:
1.看清官方的参数,比如腾讯微博,可能会要求clientip,一类的。那么我们也要加在参数中,进行signature计算
2.注意方法,不同站点,有的是get,有的是post,要保证在signature中的http方法与官方要求一致
3.sina在callback回来之后,会有一个verifier值日,那么我们在下一步,就要拿着这个verifier进行请求

其余没什么了,其实只要迈出第一步,其余都大同小异,时间可能主要花在实验上面,所以,goodluck.

附一些资料: oauth, douban-api,  新浪oauth详解(blocked)

作者微博:http://weibo.com/webpy
作者 Gtalk: yudun1989(#)gmail.com
目前正在“下厨房”实习。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。