说明:本来想多分几篇来写的,但似乎谈太具体的话,不适合放在这样一个标题下,所以这里先简单介绍一下,之后再视情况挑一些内容重点扯一扯

OpenID

OpenID是一个开放的Authentication解决方案,关 于OpenID,我在06年的文章里已经谈过,不过那时谈的是最早版本的OpenID,也不知道是哪个版本,现在用的主要是OpenID Authentication 2.0及其周边的一些扩展功能。OpenID Auth 2.0基本原理与以前的版本没有本质的变化,只是在安全性和一些细节功能上有所增强。

基本的OpenID Authentication登录流程如下图:

1、首先用户在依赖方(即第三方网站)输入其OpenID URL进行登录(也可以直接使用提供方ID登录,这种方式则没有第2、3步);
2、(可选)依赖方从用户OpenID URL的页面中执行自动发现;
3、取得OpenID提供方的End Point URL;
4、(可选)依赖方与提供方建立关联;
5、取得关联的约定加密信息;
6、重定向用户浏览器到提供方;
7、用户登录到提供方并授权第三方的认证请求;
8、返回认证结果(是否通过用户身份验证);
9、重定向用户浏览器到依赖方,并提交认证结果;
10、依赖方向提供方验证用户提交的认证结果;
11、通过用户认证。

之 后,依赖方可以保存第9步的用户提交信息,在每次需要验证用户身份的时候,重复第10和11步向提供方验证用户身份。通常这项工作由session实现。 因为这两步需要多次进行,为了安全需要每次都必须进行签名验证,所以通常还是建议使用第4和5步的建立加密关联,以方便后续的验证操作。

过 程中的第2和3步就是OpenID分布式的关键,也是我在旧文中认为的OpenID的缺点(或者说是特性)之一。这一步可以让用户不受具体的提供方所限, 使认证成为分布式,但同时也使用用户的认证可靠性受这个OpenID URL对应的网站所限。所以现在很多OpenID认证应用都直接跳过这一步,使用固定(或有限可选的几个)提供方进行登录,使之从分布式身份验证成为第三 方集中式身份验证。其实我个人认为这样更好一些。而且这样还可以减少一对网络round trip,有助于改善登录速度。

在这一基础Authentication之上还有一些额外的约定,基 本的OpenID Authentication在验证通过以后,除了返回验证通过信息以外,还可以同时返回用户的Profile。当然,一般的Provider可以由用户 选择验证返回的Profile内容,比如myopenid.com可以选择返回一个完整Profile或是一个空白Profile(但仍然返回验证通过信 息)。那么关于个Profile就需要有一定的协议来约定。

在OpenID 2.0中主要是两个:简单注册扩展(Simple Registration Extension)和属性交换(Attribute Exchange)。

简单注册扩展约定了Profile的8个字段,实现起来较为简单。属性交换则更强大一些,可以双方约定任意数量和内容的字段,实现起来略复杂一些。

这也是Google提供给第三方的OpenID登录方式就是采用了属性交换约定。

属性交换的功能就是在依赖方提交验证请求 的 同时告诉Provider它需要哪些用户Profile信息字段(称为属性),然后用户在通过验证时,Provider将依赖方请求的属性告诉用户,由用 户决定是否允许(只能允许或拒绝,如果拒绝则验证不通过,不提供空白响应的选项)。

属性交换除了可以用于读取所选属性,还可以用于存储属性,当然这需要Provider方支持。

Google提供给第三方的OpenID登录流程如下图:

以上就是关于OpenID的基本介绍,具体的实现可以到官网下载各种语言实现的源码研究。

OAuth

OAuth是一个开放的Authorization方案,可以说是基于OpenID发展起来的。因为OpenID不能提供Authorization功能:

比如某网站A提供了允许用户用TA的OpenID登录,但是如果某网站B需要用到网站A中该用户的数据,就无法通过OpenID来实现将网站A中的用户数据安全地授权给网站B——虽然可以让用户把自己的OpenID信息提供给网站B,让它以用户的身份登录网站A去取得,但这样的话如果网站B是一个恶意网站,它就可以以用户的身份登录任何其它支持该用户以OpenID访问的网站,带来严重的安全隐患。

于是人们需要一个开放的Authorization协议,于是OAuth诞生了。

目前OAuth有两个几乎完全不同的版本:OAuth 1.0和OAuth 2.0。

OAuth 1.0是一个被设计得非常安全的协议:除了Provider与Consumer之前的验证过程是相当安全的以外,它甚至要求对每一次的数据请求(API调用)都要进行请求内容的数字签名,以确保万无一失。

而OAuth 2.0则相当于对OAuth 1.0作了很大的简化:Provider与Consumer之间只是简单地交换一下密钥Key进行验证,之后Consumer只需要凭借验证后取得的一个Token就可以进行数据请求(API调用),没有太多的签名校验工作。

从技术上说,两个版本都可以实现Authorization功能,二者的差异在于:1.0更安全,但代价也更大(验证过程复杂,请求过程复杂);2.0更方便,但是安全性不如1.0(比如请求可能在传输过程中被修改)。

个人倾向于建议使用OAuth 2.0+HTTPS的方案,这样可以降低编程的复杂度,减少出错的概率,同时通过HTTPS保障安全性。

实现

关于以上相关技术的实现,有空再来做吧。暂时计划包含:Google OpenID, Twitter OAuth 1.0, Foursquare OAuth 2.0

Authentication和Authrization(下)相关推荐

  1. Authentication和Authrization(上)

    两个案例 第一个案例是几个月前,我收到一位朋友的邮件,邀请我加入一个叫ShoppyBag的网站.我去看了,没想到注册后就让我登录GMail帐号,并且GMail提示我该网站需要访问我的通讯录,于是我当即 ...

  2. Spinrg Security Authentication(一)

    目录 1 认证流程 2 loginPage方法 3 usernameParameter.passwordParameter方法 4 successForwardUrl.failureForwardUr ...

  3. OAuth2.0实践之foursquare客户端登录

    之前谈的两篇<Authentication和Authrization(上).(下)>以空谈为主,算是一个开头,原文最后有说要一一整些实现出来的.那么现在就开始吧,不过介绍的顺序则先从相对简 ...

  4. 一次gitlab无法使用ssh登录的问题解决

    故障现象: [root@web-m data]# git clone ssh://git@gitlab.lixinkuan.com:22022/lxk/core.git Cloning into 'c ...

  5. spring安全_Spring安全–幕后

    spring安全 安全任务(例如,用户身份验证和用户查看应用程序资源的授权)通常由应用程序服务器处理. 可以将这些任务委托给Spring安全性流程,以减轻应用程序服务器处理这些任务的负担. Sprin ...

  6. 中兴5250交换机配置手册_TSN工业交换机中文说明

    全面了解CC-Link协议家族 宣布CLPA会员公司赫斯曼推出最新研发支持TSN的工业交换机RSPE35,同时这款TSN交换机与三菱CC-Link IE TSN产品连接配置手册也已发布,并在文中附了下 ...

  7. 全新的membership框架Asp.net Identity(1)——.Net membership的历史

    在Asp.net上,微软的membershop框架经历了Asp.net membership到Asp.net simple membership,再到现在的Asp.net Identity. 每一次改 ...

  8. [Lab 2] OSPF专题

    [Lab 2] OSPF专题 OSPF(Open Shortest Path First,开放最短链路优先)路由协议是典型的链路状态路 由协议.OSPF 由IETF 在20 世纪80 年代末期开发,O ...

  9. 性能测试之实现接口关联的两种方式:正则表达式提取器和json提取器

    关联通俗来讲就是把上一次请求的返回内容中的部分截取出来保存为参数,用来传递给下一个请求使用. 示例: 1.用户密码进行登录,登录后生成authentication 2.需要将登录接口响应结果中auth ...

最新文章

  1. 编程中检查IIS7组件的安装情况
  2. ubuntu apt-get指令和apt指令的区别?
  3. 获取网络时间并刷新本地时间(源码2)
  4. 关于java获取当前时间前一周、前一月、前一年的时间
  5. unity 如何获取到屏幕中间_Unity通用渲染管线Shader日志输出工具
  6. Flex通过Blazeds利用Remoteservice与后台java消息推送
  7. java jstat 命令_java高分局之jstat命令使用(转)
  8. 一维序列卷积之Python实现
  9. ubuntu下nginx安装
  10. 服务器内存条显示性能下降,特么的终于找到CPU超频,反而跑分降低的原因了,申请加精!...
  11. copy的过去式_动词过去式变化规则
  12. 标点符号的英语名称翻译
  13. 2022骨传导蓝牙耳机推荐,最好用的几款骨传导耳机
  14. uni-app 快手小程序如何设置跟元素样式
  15. android根文件系统目录结构
  16. Java学习笔记(二):Java程序基础
  17. 微信小程序onPullDownRefresh onReachBottom实现下拉刷新上拉分页加载
  18. 量化交易之指数增强策略
  19. Java阿凯_Java-7 面向对象(上)
  20. 3D游戏编程与设计——粒子系统

热门文章

  1. 海思入门笔记二:HiBurn工具实现镜像烧写
  2. IDEA+Java+SSM+Mysql+JSP实现Web宠物商城系统
  3. 奔跑吧恐龙----基于JavaSwing的一个跑酷游戏
  4. 【程序设计训练】3-15 公交系统
  5. 现代控制理论——状态空间表达式的能控性标准型和能观性标准型
  6. 一步一步实现中后台管理平台模板-08-登录页和用户信息保存
  7. Python编程-让繁琐的工作自动化(十一)从Web爬取信息
  8. 魅族android不兼容Android,魅族17系列彻底跟上时代,搭载基于Android 10的Flyme 8.1系统...
  9. SiteSucker
  10. iOS-如何开发一款类 Runkeeper 的跑步应用 (上)