oauth 认证心得

标签: oauth 认证 | 发表时间:2011-08-09 10:15 | 作者:(author unknown) 非狐外传
出处:http://simple-is-better.com/

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
目前正在“下厨房”实习。

# 来源:愚钝


在微博上关注: 新浪, 腾讯   投稿

最新招聘

更多>>

相关 [oauth 认证] 推荐:

oauth 认证心得

- 非狐外传 - python.cn(jobs, news)
OAUTH协议为用户资源的授权提供了一个安全的、开放而又简易的标准. 简易来说,就是我们可以在某一个第三方服务器,如:新浪,豆瓣,在用户授权,并且不透漏密码等信息给我们的条件下,访问和修改用户的资源. oauth的项目主页为:http://oauth.net/ ,现在国内很多网站的开放平台都采用了Oauth方式来进行授权.

纯 JavaScript 实现的 OAuth 认证

- - 博客 - 伯乐在线
英文原文: JavaScript oAuth 编译: oschina. 现在,很多的应用程序都在使用HTML和JavaScript, 这是一个非常明智的选择,让你跟上目前的趋势. 一些主要实体工具因为客户端验证和授权等原因提供了API. 当前网站对于验证的一个广受欢迎的功能是”单点登录”. 这让用户可以通过其它一些社交媒体网站上的身份认证直接登录你的网站.

OAuth的改变

- lyxint - 火丁笔记
去年我写过一篇《OAuth那些事儿》,对OAuth做了一些简单扼要的介绍,今天我打算写一些细节,以阐明OAuth如何从1.0改变成1.0a,继而改变成2.0的. 在OAuth诞生前,Web安全方面的标准协议只有OpenID,不过它关注的是验证,即WHO的问题,而不是授权,即WHAT的问题. 好在FlickrAuth和GoogleAuthSub等私有协议在授权方面做了不少有益的尝试,从而为OAuth的诞生奠定了基础.

理解OAuth 2.0

- - 阮一峰的网络日志
OAuth是一个关于授权(authorization)的开放网络标准,在全世界得到广泛应用,目前的版本是2.0版. 本文对OAuth 2.0的设计思路和运行流程,做一个简明通俗的解释,主要参考材料为 RFC 6749. 为了理解OAuth的适用场合,让我举一个假设的例子. 有一个"云冲印"的网站,可以将用户储存在Google的照片,冲印出来.

OAuth学习笔记

- 宋大妈 - FeedzShare
来自: 标点符 - FeedzShare  . 发布时间:2011年08月29日,  已有 2 人推荐. OAuth(开放授权)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用. OAuth允许用户提供一个令牌,而不是用户名和密码来访问他们存放在特定服务提供者的数据.

OAuth 2.0 工作流程

- - 企业架构 - ITeye博客
原文链接:http://www-01.ibm.com/support/knowledgecenter/SSELE6_8.0.0.3/com.ibm.ammob.doc_8.0.0.3/config/concept/con_oauth20_workflow.html%23con_oauth20_workflow?lang=zh.

GitHub - casinthecloud/cas-pac4j-oauth-demo: Demo webapps to test CAS/OAuth/OpenID/SAML client support and OAuth server support in CAS version >= 4.0.0

- -

基于PECL OAuth打造微博应用

- lostsnow - 火丁笔记
最近,国内主要门户网站相继开放了微博平台,对开发者而言这无疑是个利好消息,不过在实际使用中却发现平台质量良莠不齐,有很多不完善的地方,就拿PHP版SDK来说吧,多半都是用TwitterOAuth改的,一旦多平台集成,很容易出现命名冲突之类的问题. 既然官方SDK不给力,那我们只能发扬自力更生的革命精神了.

PHP实现Google Oauth的登录系统

- - 极客521 | 极客521
本文讲述的是如何为你的PHP项目实现Google的Oauth系统. 这个示例PHP脚本非常快,对增加你的PHP项目注册当然是很有帮助的. 在这之前,我们已经覆盖了包含Facebook、Twitter、Google plus以及Instagram的Oauth登录系统示例. 很遗憾之前我遗漏掉了Google的Oauth登录系统.