OAuth认证

为了安全地访问在线服务,用户需要在服务上进行身份验证,即要提供他们的身份的证明。对于一个要访问第三方服务的程序来说,安全问题甚至更复杂。不仅仅是用户需要在访问服务前要进行身份验证,而且程序也要进行身份验证来授权用户。在分享过程中不可避免的会考虑到用户账户安全性的问题,第三方程序不应该直接接触用户账户信息,但是没有账户信息,又如何取得SNS平台的数据呢?OAuth很好的解决了这个问题,从第三方发起认证过程,在webview或者浏览器中完成认证过程,获得access token来代替账户密码,从而可以获取平台数据。OAUTH协议为用户资源的授权提供了一个安全的、开放而又简易的标准。同时,任何第三方都可以使用OAUTH认证服务,任何服务提供商都可以实现自身的OAUTH认证服务,因而OAUTH是开放的。
使用OAuth2有利于:
从用户手中得到授权访问那些需要他/她的账户的在线服务。
代替用户在一个在线服务上验证身份。
处理验证错误.

OAuth的基本概念,OAUTH协议为用户资源的授权提供了一个安全的、开放而又简易的标准。与以往的授权方式不同之处是OAUTH的授权不会使第三方触及到用户的帐号信息(如用户名与密码),即第三方无需使用用户的用户名与密码就可以申请获得该用户资源的授权,因此OAUTH是安全的。

OAuth 1.0已经在IETF尘埃落定,编号是RFC5894:http://tools.ietf.org/html/rfc5849,这也标志这OAuth已经正式成为互联网标准协议。OAuth 2.0也早已经开始讨论和建立的草案。OAuth在OAuth组织的主页: http://www.oauth.net/2/。
OAuth2.0的草案: http://tools.ietf.org/html/draft-ietf-oauth-v2-05
协议的创始人和推动者说OAuth 2.0的正式版会在今年年底正式发布,现在的草案还很不完善,有很多东西值得继续推敲。如果你订阅了OAuth的mailing list,你会发现每天都有关于OAuth 2.0的议题,每天都有各种有深度的讨论。但作为一个学习者,虽然2.0尚未发布,但是此时跟进学习的好处无疑是巨大的。有关于OAuth2.0的详细介绍,请参考 http://www.eoeandroid.com/thread-166759-1-1.html。在此不再多介绍什么了。

OAuth1认证基本步骤:
1、获取未授权的Request Token(temporary credentials)
2、请求用户授权Request Token
3、使用授权后的Request Token换取Access Token(token credentials)
4、使用 Access Token 访问或修改受保护资源

示意图(来自腾讯微博开发文档)

第一步,请求签名
所有的OAuth请求使用同样的算法来生成(signature base string)签名字符基串和签名。
base string是把http方法名,请求URL以及请求参数用&字符连起来后做URL Encode编码。具体来讲,base string由http方法名,之后是&,接着是过url编码(url-encoded)之后的url和访问路径及&。接下来,把所有的请求参数包括POST方法体中的参数,经过排序(按参数名进行文本排序,如果参数名有重复则再安参数值进行重复项目排序),使用%3D替代=号,并且使用%26作为每个参数之间的分隔符,拼接成一个字符串。

第二步,获取未授权的Request Token;
接口地址:
  支持格式:OAuth HTTP 标准认证返回格式
  HTTP请求方式:GET/POST
  是否需要登录:否
  请求参数:

返回参数:

注:有一些平台不需要输入scope参数,在开发时请参照开发文档。

第三步,请求用户授权Request Token;
接口地址:
  支持格式:OAuth HTTP 标准认证返回格式
  HTTP请求方式:GET/POST
  是否需要登录:否
  请求参数:

返回参数:

第四步,使用已经授权的Request Token换取Access Token,然后使用Access Token访问受限的资源了。
接口地址:
  支持格式:OAuth HTTP 标准认证返回格式
  HTTP请求方式:GET/POST
  是否需要登录:否
  请求参数:

返回参数:

OAuth 2.0
   OAuth2.0和OAuth1.0的区别还是在于简化了认证过程,不需要从未授权的Request Token转化到授权Request Token,而是利用app key通过用户授权生成access token但是,与1.0的不同之处是access token有自身的有效期,且不同平台、不同级别的程序有着不同的有效期,在程序开发中一定记得判断access token是否过期,对于过期之后的处理方法主要是利用access token和refresh token重新生成access token或者重新利用app key向服务器发送请求生成access token。由于这个问题,与OAuth1.0基本一致不一样,各个平台OAuth2.0做了不一样的选择。
  OAuth2.0服务支持以下获取Access Token的方式:
  a. Authorization Code:Web Server Flow,适用于所有有Server端配合的应用。
  b. Implicit Grant:User-Agent Flow,适用于所有无Server端配合的应用。
  因为demo是无服务器的程式,所以我们采用Implicit Grant:User-Agent Flow的获取方式。

示意图(来自腾讯微博开发文档)

  • 获取Access Token

为了获取Access Token,应用需要将用户浏览器(或手机/桌面应用中的浏览器组件)到OAuth2.0授权服务的“http://xxxxxxxxx/authorize”地址上,并带上以下参数:

若用户登录并接受授权,授权服务将重定向用户浏览器到“redirect_uri”,并在Fragment中追加如下参数:

下面以新浪微博的OAuth认证过程来详细解说:当用户第一次使用本客户端软件时,客户端程序用第一组作为参数向新浪微博发起请求,然后新浪微博经过验证后返回第二组参数给客户端软件同时表示新浪微博信任本客户端软件,当客户端软件获取第二组参数时作为参数引导用户浏览器跳至新浪微博的授权页面,然后用户在新浪的这个授权页面里输入自己的微博账号和密码进行授权,完成授权后根据客户端设定的回调地址把第三组参数返回给客户端软件并表示用户也信任本客户端软件,接下客户端软件把第二组参数和第三组参数作为参数再次向新浪微博发起请求,然后新浪微博返回第四组参数给客户端软件,第四组参数需要好好的保存起来这个就是用来代替用户的新浪账号和密码用的,在后面调用api时都需要。从这个过程来看用户只是在新浪微博的认证网页输入过账户和密码并没有在客户端软件里输入过账户和密码,客户端软件只保存了第四组数据并没有保存用户的账户和密码,这样有效的避免了账户和密码透露给新浪微博之外的第三方应用程序,保证了安全性。

新浪微博的OAuth认证 效果图如下:

总结一下,OAuth认证其实很简单,调用api也是根据各个平台进行些许的调整而已,在进行开发的过程更细心的一点应该没什么问题,如果你有问题,欢迎大家来交流。关于代码的问题,大家把平台上相关的SDK下载下来稍微研究一下就可以了。

开发文档地址:
  新浪:http://open.weibo.com/wiki/%E9%A6%96%E9%A1%B5
  空间:http://wiki.opensns.qq.com/wiki/%E3%80%90QQ%E7%99%BB%E5%BD%95%E3%80%91%E6%96%87%E6%A1%A3%E8%B5%84%E6%BA%90
  腾讯:http://wiki.open.t.qq.com/index.php/%E9%A6%96%E9%A1%B5
  人人:http://wiki.dev.renren.com/wiki/%E9%A6%96%E9%A1%B5
  开心:http://open.kaixin001.com/document.php
  豆瓣:http://www.douban.com/service/apidoc/
  搜狐:http://open.t.sohu.com/en/%E9%A6%96%E9%A1%B5
  网易:http://open.t.163.com/wiki/index.php?title=%E9%A6%96%E9%A1%B5

参考链接:http://www.cnblogs.com/lingyun1120/archive/2012/07/11/2585767.html

novoda / oauth_for_android----这是一个为 Android 程序开发的 OAuth 库/应用, GitHub链接:https://github.com/novoda/oauth_for_android,可以自己下载来研究研究噶。

Android OAuth认证的更多相关文章

  1. 新浪微博客户端开发之OAuth认证篇

    新浪微博客户端开发之OAuth认证篇 2013年7月29日新浪微博客户端开发 OAuth2.0授权机制我在这里就不浪费口舌了,有很多大牛都发表过相关的文章解释OAuth2.0认证的流程,我就随便找了一 ...

  2. 服务端API的OAuth认证实现

    http://stackoverflow.com/questions/12499602/body-joints-angle-using-kinect?rq=1 新浪微博跟update相关的api已经挂 ...

  3. 在Phonegap下实现oAuth认证

    原文:http://www.kuqin.com/mobile/20120719/322873.html 前段时间做过两次关于Phonegap的现场交流会议分享.基本上把Phonegap的一些特性和大家 ...

  4. Android 指纹认证

    安卓指纹认证使用智能手机触摸传感器对用户进行身份验证.Android Marshmallow(棉花糖)提供了一套API,使用户很容易使用触摸传感器.在Android Marshmallow之前访问触摸 ...

  5. OAuth认证原理及HTTP下的密码安全传输

    很多人都会问这样一个问题,我们在登录的时候,密码会不会泄露?随便进一个网站,登录时抓包分析,可以看到自己的密码都是明文传输的,在如此复杂的web环境下,我们没有百分的把握保证信息在传输过程中不被截获, ...

  6. HTTP下密码的安全传输、OAuth认证

    在复杂的web环境下,我们没有百分的把握保证信息在传输的过程中不被接货,那不是用明文如何告诉服务器自己的身份呢? 在一些高度通信安全的网络中,数据传输会使用HTTPS作为传输协议,但是通常情况下我们没 ...

  7. 拿nodejs快速搭建简单Oauth认证和restful API server攻略

    拿nodejs快速搭建简单Oauth认证和restful API server攻略:http://blog.csdn.net/zhaoweitco/article/details/21708955 最 ...

  8. 一步一步搭建 OAuth 认证服务器

    http://www.fising.cn/2011/03/%E4%B8%80%E6%AD%A5%E4%B8%80%E6%AD%A5%E6%90%AD%E5%BB%BA-oauth-%E8%AE%A4% ...

  9. JAVA Oauth 认证服务器的搭建

    http://blog.csdn.net/binyao02123202/article/details/12204411 1.软件下载 Oauth服务端: http://code.google.com ...

随机推荐

  1. HDU 3081 Marriage Match II (网络流,最大流,二分,并查集)

    HDU 3081 Marriage Match II (网络流,最大流,二分,并查集) Description Presumably, you all have known the question ...

  2. 【POJ3662】Telephone Lines dij + 二分答案

    题目大意:给定一个 N 个顶点,M 条边的无向图,求一条从 1 号节点到 N 号节点之间的路径,使得第 K+1 大的边权最小,若 1 与 N 不连通,输出 -1. 最小化最大值一类的问题,采用二分答案 ...

  3. SQL Server 关于CROSS APPLY 和 OUTER APPLY应用

    先看看语法: <left_table_expression>  {cross|outer} apply<right_table_expression> 再让我们了解一下appl ...

  4. Elasticsearch5.5 多机集群配置和x-pack安装配置

    x-pack安装配置 https://www.elastic.co/guide/en/elasticsearch/reference/current/installing-xpack-es.html ...

  5. P1282 多米诺骨牌

    P1282 多米诺骨牌 题目描述 多米诺骨牌有上下2个方块组成,每个方块中有1~6个点.现有排成行的 上方块中点数之和记为S1,下方块中点数之和记为S2,它们的差为|S1-S2|.例如在图8-1中,S ...

  6. MVC中常用的跳转方法

    MVC中常用的跳转方法 这里总结了几种MVC中的跳转方式,主要汇总了前端页面跳转,后台的跳转,和过滤器中的跳转方式. 1.在前端页面的跳转方式 <!--属性形式---> <a hre ...

  7. vs2017_enterprise正式版离线安装包bt下载

    vs2017_enterprise正式版离线安装包bt下载 点击这里下载种子 磁力链接 安装前请先打开certificates目录,安装里面的三个证书 离线下载教程 : https://docs.mi ...

  8. html接收参数

    代码 <!DOCTYPE html> <html> <head> <title>html接收参数</title> </head> ...

  9. datetimepicker bootstrap的时间插件显示位置问题及其他配置

    位置问题: 在bootstrap中用 datetimepicker 时默认是在输入框下面弹出的, 但是遇到输入框在屏幕最下面时,日期选择框会有一部分在屏幕下面,显示不了,因此需要能够从上面弹出. 可以 ...

  10. android 短信拦截

    android 4+版本需要用户主动添加broadReceiver 1.清单文件 <manifest xmlns:android="http://schemas.android.com ...