OAuth那些事儿

2024-02-21 23:59
文章标签 oauth 事儿

本文主要是介绍OAuth那些事儿,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

英国诗人蒲柏在牛顿的墓志铭中写道:『自然和自然的法则在黑暗中隐藏,上帝说,让牛顿去吧,于是一切都被照亮!』,而在保护账号安全方面,OAuth起着如同牛顿般中流砥柱的作用,为什么这么说呢?

人人网提供了导入MSN联系人的功能,但前提是用户必须提供账号密码,如下图所示:

查找你的MSN联系人中有谁在人人网上

查找你的MSN联系人中有谁在人人网上

人人网信誓旦旦的宣称不会记录你的密码,它甚至提供了一个所谓保证账号安全的方法:先改密码再导入,成功后再改为原密码。不过这样做就安全了么?

什么是OAuth

如今很多网站的功能都强调彼此间的交互,因此我们需要一种简单,标准的解决方案来安全的完成应用的授权,于是,OAuth应运而生,看看官网对其的定义:

An open protocol to allow secure API authorization  in a simple and standard method from desktop and web applications.

一个典型的OAuth应用通常包括三种角色,分别是:

  • Consumer:消费方
  • Service Provider:服务提供者
  • User:用户

用户好理解,不必多言,消费方和服务提供者则需要解释一下,举例来说:假设我们做了一个SNS,它有一个功能,可以让会员把他们在Google上的联系人导入到SNS上,那么此时的消费方就是SNS,而服务提供者则是Google。

注:Google APIs支持OAuth。

消费方如果想使用服务提供者的OAuth功能,通常需要先申请两样东西:

  • Consumer Key
  • Consumer Secret

当消费方生成签名的时候,会用到它们。

一个典型的OAuth流程通常如下图所示:

OAuth流程图

OAuth流程图

  • A:消费方请求Request Token
  • B:服务提供者授权Request Token
  • C:消费方定向用户到服务提供者
  • D:获得用户授权后,服务提供者定向用户到消费方
  • E:消费方请求Access Token
  • F:服务提供者授权Access Token
  • G:消费方访问受保护的资源

基本就是用Request Token换取Access Token的过程。这里需要注意的是,对服务提供者而言,Request Token和Access Token的生命周期不一样,通常,Request Token的生命周期很短,一般在一个小时以内,这样相对安全一些;而Access Token的生命周期很长,往往是无限,如此一来,消费方就可以把它保存起来,以后的操作就无需用户再授权了,即便用户修改账号密码,也不会受影响,当然,用户可以废除消费方的授权。

有腿的OAuth

我们前面描述的OAuth,被称为三条腿的OAuth(3-Legged OAuth),这也是OAuth的标准版本。这里所谓的“三条腿”,指的是授权过程中涉及三步流程。不过有些情况下,不需要用户的参与,此时就产生了一个变体,被称作两条腿的OAuth(2-Legged OAuth),两条腿的OAuth和三条腿的OAuth相比,因为没有用户的参与,所以在流程中就不会涉及用户授权的环节,而主要是通过Consumer Key和Consumer Secret来完成签名的,此时的Consumer Key和Consumer Secret基本等价于账号和密码的作用。

补充:关于腿的解释详见The OAuth Bible

OAuth简史

2007年12月4日发布了OAuth Core 1.0:

此版本的协议存在严重的安全漏洞:OAuth Security Advisory: 2009.1,更详细的介绍可以参考:Explaining the OAuth Session Fixation Attack。

2009年6月24日发布了OAuth Core 1.0 Revision A:

此版本的协议修复了前一版本的安全漏洞,并成为RFC5849,我们现在使用的OAuth版本多半都是以此版本为基础。

OAuth的未来:OAuth 2.0 Working Draft,…

OAuth和OpenID的区别

OAuth关注的是authorization;而OpenID侧重的是authentication。从表面上看,这两个英文单词很容易混淆,但实际上,它们的含义有本质的区别:

  • authorization: n. 授权,认可;批准,委任
  • authentication: n. 证明;鉴定;证实

OAuth关注的是授权,即:“用户能做什么”;而OpenID关注的是证明,即:“用户是谁”。

如果混淆了OAuth和OpenID的含义,后果很严重。以国内某网站开发的应用为例:它的功能是通过OAuth授权让新浪微博和豆瓣的用户使用各自的身份发表评论,如下图所示:

错误的把OAuth当做OpenID使用

错误的把OAuth当做OpenID使用

此类应用属于身份证明问题,本应该通过OpenID来实现,但因为错误的使用了OAuth,从而带来安全隐患:设想一下用户只是在网站上发表了评论而已,但却赋予了网站随意操作自己私有数据的权利!这就好比:快递员送包裹,为了证明收件人的身份,原本你只要给他看一下身份证即可,可你却把防盗门钥匙都给他了!Oh,My God!

收工!作为首尾呼应的结束语,请允许我套用蒲柏的话:『账号和账号的安全在黑暗中隐藏,上帝说:让OAuth去吧,于是一切都被照亮!』,不过这可不是墓志铭 :-)

补充:关于OAuth详细的介绍可以参考Beginner’s Guide to OAuth。

This entry was posted in Technical and tagged OAuth by 老王. Bookmark the permalink.

53 thoughts on “OAuth那些事儿”

Comment navigation

  1. Pingback: 火丁:OAuth那些事儿;冉云飞:教育父母 | 海尋資訊

  2. McDang on 2010-10-17 at 01:18:18 said:

    OAuth和OpenID的区别讲的好,我大概搞明白了,谢谢

    Reply ↓
    • 老王 on 2010-10-17 at 19:32:28 said:

      记住文中所举快递员例子中“防盗门钥匙”和“身份证”的意义,可以很容易的区分OAuth和OpenID。

  3. Pingback: Tweets that mention OAuth那些事儿 | 火丁笔记 -- Topsy.com

  4. menzhi007 on 2010-10-17 at 19:24:40 said:

    王哥,举点实际例子

    Reply ↓
  5. captain on 2010-10-18 at 13:27:13 said:

    近期要搭建一个Oauth的Server端,oauth的校验流程已经搞明白了。
    可是不是很明白oauth中签名(signature)的意义是什么。我为什么不简单的使用key和secret(有需要的話就加上timestamp和nonce)。

    对于oauth,我简单的理解就是:把user和consumer关联起来。不知道这样理解是否过于肤浅?

    Reply ↓
    • 老王 on 2010-10-18 at 14:10:06 said:

      签名的意义在于防止请求被篡改。如果没有签名,只是简单的使用Consumer Key和Consumer Secret,那和HTTP Basic还有什么区别?!实际使用OAuth的时候,请求中是不包含Consumer Secret的,它只是参与签名的计算,所以,就算请求被别有用心的人截获也是没用的,因为他不知道Consumer Secret,所以算不出正确的签名,也就无法构造出合法的请求。

      3-Legged OAuth就是通过User的授权,Consumer可以访问User在Service Provider的数据;至于2-Legged OAuth,没有User的参与,只是Consumer和Service Provider的交互。

  6. Pingback: OAuth那些事儿 | 网摘

  7. captain on 2010-10-18 at 17:17:48 said:

    一语道破,刚刚认真整理了一下思路,终于从死胡同里转出来了=.=
    通过Oauth访问需要认证的API的时候,一般需要如下参数。
    oauth_consumer_key
    oauth_token Access Token
    oauth_signature_method
    oauth_signature
    oauth_timestamp
    oauth_nonce
    所以就算有人把以上所有信息截获了,但没有consumer_secret,是無法計算出正確的signature。

    终于理解签名的意义,多谢耐心解惑:)
    终于不用登录也能在你blog留言了,呵呵

    Reply ↓
    • 123 on 2011-12-08 at 10:48:21 said:

      但是不是已经直接获取到signature了吗,因为signature就在参数中

  8. 王炜 on 2010-10-20 at 00:05:26 said:

    完全正确!

    Reply ↓
  9. captain on 2010-10-22 at 17:19:12 said:

    搭建oauth server的时候,遇到一个问题:

    “consumer请求request token”“用户授权request token”这个过程,并不是一个持续的过程(需要用户介入操作)。请求到授权的这段时间,作为oauth server(假设用php实现),应该如何存储这个“未授权”的request token比较合适呢?

    因为consumer可以通过socket等方式向server发出模拟请求,所以在server端无法使用session存储。

    我之前是使用数据库存储,当consumer请求request token的时候,server将生成request token相关信息存入数据库。数据库中的表有一个字段标识此request token是否被授权。等到用户确认授权给request token之后,更新该标识字段。

    问题在于,如果用户迟迟不授权,那么这条数据就一直存在于数据库中。

    我有想过写一个定时任务,定时删除表中过期的request token。又或者使用memcache来存储这个“未授权”的request token,但这样好像又有点大材小用。

    存储这个“临时的”未授权的request token,应该怎么设计才合适?

    Reply ↓
    • 老王 on 2010-10-22 at 18:44:48 said:

      本文主要是从用户的角度来讲解OAuth,服务端不是本文主题,建议你参考oauth-php,它包括了服务端的实现方式。

  10. ahu on 2010-10-29 at 10:24:44 said:

    关于你举的水煮鱼那个例子,我觉得有失偏颇。单纯从技术角度的确如你所说是用错了,但现实是服务提供方并未提供OpenID服务,而是用OAuth来包揽了——所以这个错不在使用者而在于提供方

    Reply ↓
    • 老王 on 2010-10-29 at 13:27:29 said:

      讲个笑话:快递员送包裹,因为我找不到身份证证明自己的身份,快递员就想把我的防盗门钥匙拿走,还说这个错不在他而在我。

    • jekhy on 2011-08-22 at 16:31:47 said:

      其实我觉得这个还用送快递来比喻:快递员公司规定,必须用防盗门钥匙验证你的身份,而根本不会看你的身份证是否合法,所以,作为用户,为了得到这个包裹,要么冒着家里被盗的危险,用钥匙签收,要么只能拒收。(突然看到下边还有“注册为本站会员”,那么再加一条,如果非要签收的话,要么给钥匙,要么用身份证注册为快递公司的VIP)

    • songjinghe on 2012-10-10 at 14:57:40 said:

      我觉得Oauth还有一个好处是实现部分权限,比如这个用豆瓣帐号登录的例子,之后肯定会跳到豆瓣的网站要求登录,然后问你开放那些权限给这个应用,如果有一个选项是“仅开放必要信息证明我是豆瓣用户”那么也可以实现openid的效果。。。用快递来比喻似乎有失偏颇,因为有数据的网站server,这里是豆瓣,只要能向这个应用证明这个用户确实是豆瓣用户就可以了,其他的权限可以不开放给它。。。。等下,要实现如上用豆瓣帐号登录的功能好像必须在豆瓣那边注册一个应用才行,嗯,就是这样。

    参考:http://huoding.com/2010/10/10/8

这篇关于OAuth那些事儿的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/733511

相关文章

Node.js和vue3实现GitHub OAuth第三方登录

Node.js和vue3实现GitHub OAuth第三方登录 前言 第三方登入太常见了,微信,微博,QQ…总有一个你用过。 在开发中,我们希望用户可以通过GitHub账号登录我们的网站,这样用户就不需要注册账号,直接通过GitHub账号登录即可。 效果演示 注册配置 GitHub 应用 1.首先登录你的GitHub然后点击右上角的头像->点击进入Settings页面 2.在

解决OAuth Token,点击退出登录报404问题

首先,认证服务器发送请求 http://auth.test.com:8085/logout?redirect_uri=http://admin.test.com:8080’ 退出后报404无法跳转到网站首页,这个时候增加一个参数redirect_uri指定退出成功后跳转的路径,因为是自定义的,所以需在认证服务器做一些处理 找到源码默认实现接口DefaultLogoutPageGeneratingF

Objective-C总Runtime的那点事儿(一)消息机制

最近在找工作,Objective-C中的Runtime是经常被问到的一个问题,几乎是面试大公司必问的一个问题。当然还有一些其他问题也几乎必问,例 如:RunLoop,Block,内存管理等。其他的问题如果有机会我会在其他文章中介绍。本篇文章主要介绍RunTime。 RunTime简称运行时。就是系统在运行的时候的一些机制,其中最主要的是消息机制。对于C语言,函数的调用在编译的时候会决定调用哪

JAVA操作Excel那些事儿

前段时间接了一个Excel的数据处理单子后,小生百度千寻,终于先后使用JXL,POI两个包的后,最终在老师的见一下,使用ODBC访问EXCEL的形式,对处理,对于几种处理EXCEKL的数据方法有了大致的了解和感受,现总结如下: 目标数据:固定格式的EXCEL数据从10W条到100W条不等,根据不同的要求,添加新的记录。即原来一条ABCD数据,变成ABCDE,对于EXCEL的使用

在 Next.js 项目中使用 Clerk 实现 OAuth 登录与回调处理

1. 什么是 Clerk 和 OAuth 登录? Clerk 是一个身份验证管理工具,可以轻松集成到 Web 应用中,提供安全的用户登录、注册等功能。OAuth 是一种常见的授权协议,允许用户通过第三方服务(如 Google、Microsoft)登录到应用程序。 使用 Clerk 和 OAuth,可以在应用中集成如 Google 和 Microsoft 的第三方登录选项,大大简化用户的登录流程

python http 认证 auth oauth 认证

# -*- coding: utf-8 -*-import requestsBASE_URL = 'https://api.github.com'def construct_url(end_point):return '/'.join([BASE_URL, end_point])def basic_auth():"""http基本认证"""response = requests.get(cons

关于Scrapy的那些事儿(四)Scrapy Shell

Scrapy Shell launch Scrapy shell 使用如下命令: scrapy shell <url> 当运行scrapy shell的时候,它为我们提供了一些功能函数: shelp() :打印可用对象和快捷命令的帮助列表fetch(request or url):根据给清的请求request或URL获取一个新的Response对象,并更新原有的对象。views(resp

Spring Boot整合Spring Security+JWT+OAuth 2.0 实现认证鉴权登录(框架介绍)

简介 Spring Security框架 描述 Spring Security是一个基于Spring框架的安全性框架,可以为Web应用程序提供身份验证(Authentication)、授权(Authorization)、攻击防御等安全功能。Spring Security框架提供了一整套的身份验证、授权、ACL(访问控制列表)等模块和类库,还提供了一系列的安全过滤器、安全标签等,可以方便地实现

春招来了,阿里学长和你聊聊必须要关注的几件事儿

前言 每年阳春三月,各大互联网公司都会陆续启动春季校园招聘,简称春招。 春招主要面向第二年毕业的同学,企业招来做实习生,同时也作为正式员工的储备资源。 当然也会覆盖少量当年毕业的同学,这种情况一般是,上一年的秋招企业没招够,春招作为补招的形式,来招收正式员工。 三月到六月是春招的黄金时期,姑且把这个时间段叫春招季吧。 如果你是明年要毕业的同学,那么春招季你所有想法和行为,都会影响你毕业去往哪里,

【工具类】Excel导出那些事儿(三)

导出Excel又有了新的需求,之前都是直接导出list<T>,现需要导出List<map>,并且需要动态创建表头。如下: 【工具类】 引用jxl包   public class ListMapExportExcelUtil {/*** 写excel.** @param fileName 文件名* @param sheetName sheet名* @