Android常用OAuth登陆与分享

本文分两部分,第一部分介绍OAuth基础知识,第二部分展示一个Demo,使用百度OAuth SDK获取令牌信息与用户信息。

详细代码:github.com/Baolvlv/LearnAndroid/tree/master/OAuthDemo

一、OAuth基础知识

1.OAuth概述与运行流程

OAuth是关于授权(authorization)的开放的网络标准,用户允许第三方应用访问用户在某一网站上的私密资源,而不需将用户名与密码提供给第三方应用,通过OAuth访问可以限制第三方应用的范围和有效期。

2006年11月,OpenID不能满足twitter的委托授权

2007年4月,成立OAuth讨论小组

2007年11月,OAuth核心1.0最后的草案发布

2010年4月,OAuth1.0协议发布  RFC-5849

2012年12月,OAuth2.0协议发布 RFC-6749

OAuth 2.0不向下兼容OAuth 1.0

+--------+                               +---------------+

|        |--(A)- Authorization Request ->|   Resource    |

|        |                               |     Owner     |

|        |<-(B)-- Authorization Grant ---|               |

|        |                               +---------------+

|        |

|        |                               +---------------+

|        |--(C)-- Authorization Grant -->| Authorization |

| Client |                               |     Server    |

|第三方应用 |<-(D)----- Access Token ———|  授权服务器       |

|        |            (令牌)            +---------------+

|        |

|        |                               +---------------+

|        |--(E)----- Access Token ------>|    Resource   |

|        |                               |     Server    |

|        |<-(F)--- Protected Resource ---|               |

+--------+                               +———————+

2.OAuth授权模式

1.授权码模式(Authorization Code)

2.简化模式(implicit grant)

3.密码模式(resource owner password credentials)

4.客户端模式(client credentials)

授权码模式最完整严密,下图为授权码模式流程

+----------+

| Resource |

|   Owner  |

|          |

+----------+

^

|

(B)

+----|-----+          Client Identifier      +---------------+

|         -+----(A)-- & Redirection URI ---->|               |

|  User-   |                                 | Authorization |

|  Agent  -+----(B)-- User authenticates --->|     Server    |

|          |                                 |               |

用户代理   -+----(C)-- Authorization Code ---<|               |

+-|----|---+                                 +---------------+

|    |                                         ^      v

(A)  (C)                                        |      |

|    |                                         |      |

^    v                                         |      |

+---------+                                      |      |

|         |>---(D)-- Authorization Code ---------'      |

|  Client |          & Redirection URI                  |

|         |                                             |

|         |<---(E)----- Access Token -------------------'

+---------+       (w/ Optional Refresh Token)

Note: The lines illustrating steps (A), (B), and (C) are broken into

two parts as they pass through the user-agent.

Figure 3: Authorization Code Flow

Redirection URI———重定向URIOptional Refresh Token———刷新令牌

客户端发起两次请求,第一次以获得临时授权码作为结束,第二次以获得令牌作为结束

用户代理一般为浏览器

第一次请求参数:

第一次请求返回参数:


第二次请求参数:


请求方式:


第二次请求需要客户端的ID与密钥

现在普遍使用Https,当使用Https时,get和post请求安全性相同,get方式更加便捷。

使用http+Basic时,使用post方式更为安全,请求信息不可以在url中直接读取,post会将请求内容隐藏到请求实体中。

Content-Type:申请的表单类型

grant_type:请求实体

Http Basic Authentication:

访问一个特定的域名或url时,需要通过用户名和密码进行授权查看

发起请求时携带用户名和密码信息:

post方式和get方式:


代码实现:post方式:


第二次请求返回参数:


access_token:令牌,expires_in:令牌的有效时间段

refresh_token:刷新令牌,令牌实效后获取新的授权码

3.OAuth授权模式:简化模式,密码模式,客户端模式

简化模式流程:


没有后台服务器,或不能妥善保管第三方密钥情况下:

web-Hosted Client Resource:内嵌到浏览器中的客户端模块

User-Agent:用户代理,一般为浏览器

开始请求部分与授权码模式相同,返回值为重定向url和令牌,认证服务器将令牌放置在url的哈希值部分(#后面的部分)一般认为是未知信息,转发到服务端哈希值会被忽略掉。

web资源模块处理重定向url,返回给用户代理一个脚本用于解析,用户代理完成解析后,返回给客户端令牌信息。

通常会将web-Hosted Client Resource部分内嵌到Client,直接截取收到的信息,提取令牌信息简化流程

简化模式请求参数:


简化模式请求与返回值:


没有刷新令牌的原因:不能妥善保管第三方密钥,有刷新令牌降低安全性

密码模式请求流程:


用户需要将用户名与密码告诉客户端,但客户端不得存储密码

用户对客户端足够的信任,认证服务器没有其他的认证方式可以选择时采用。

密码模式请求参数:


密码模式请求具体内容:


密码模式请求返回值:


密码模式请求返回值与授权码模式返回值类似

客户端模式请求流程:

用户在客户端注册,客户端提出请求,授权不明显


客户端模式请求参数:


客户端模式请求具体内容:


客户端模式请求返回值:

客户端模式的返回值与其他几种认证类型类似:


4.OAuth更新令牌与相关问题:

更新令牌的方法:

1.重复一遍认证流程,用户手动输入用户名密码,发起请求认证

2.使用refreshtoken获取一个新的令牌,即刷新令牌操作

更新令牌参数:


更新令牌具体请求过程:


4.1授权码模式中请求参数state的作用:


当多个用户发起请求时,如果没有state参数,认证服务器只会返回临时授权码这一个参数,容易混淆。添加state参数可以将发起请求的的用户与获得的临时授权码一一对应。对应方式不可预期以提高安全性。

4.2为什么需要临时授权这一过程:

(1)redirect_url的安全性

redirect_url由第三方提供,是一个可访问的server表单地址。如果被截获,令牌会被截获

(2)redirect_url不如access token敏感,被截获不会泄漏用户的资源信息。

(3)如果没有临时授权码这一步,需要增加整个认证过程中的安全性

4.3 申请百度开发者账号以及百度OAuth

http://developer.baidu.com/wiki/index.php?title=docs/oauth

4.4获取百度令牌

http://developer.baidu.com/wiki/index.php?title=docs/oauth/authorization

4.5获取百度用户信息


二、android工程中获取百度令牌信息

http://developer.baidu.com/wiki/index.php?title=docs/oauth/showcase

下载安卓相关的sdk,解压后将其中的 jar包导入工程。

Project Structure->添加app的dependencies,添加百度相关的jar包

创建Baidu对象,调用authorize方法,第四个参数新建百度对话框监听器对象,实现其完成,异常,错误,取消四个方法.

//第一个参数为clientId,即API Key

finalBaidu baidu =newBaidu("PRheS6ajilCjg1muyFDGeCYz",this);

baidu.authorize(this, true, true, newBaiduDialog.BaiduDialogListener() {

@Override

public voidonComplete(Bundle bundle) {

//获取baidu对象中的AccessToken

refreshUI(baidu.getAccessToken());

}

@Override

public voidonBaiduException(BaiduException e) {

refreshUI("exception");

}

@Override

public voidonError(BaiduDialogError baiduDialogError) {

refreshUI("error");

}

@Override

public voidonCancel() {

refreshUI("cancel");

}

});

在主线程中,创建私有方法,用以刷新ui

private voidrefreshUI(finalString msg){

runOnUiThread(newRunnable() {

@Override

public voidrun() {

tvAccessToken.setText(msg);

}

内部类中只能调用外部类的final对象

三、android工程中获取百度个人信息

由于网络请求不能放在主线程中,所以通过以下两种方式实现:

1.在主线程中新建线程,使用百度提供的api,调用Baidu的对象的request方法返回json文本

启动线程

newThread(){

@Override

public voidrun() {

String url="https://openapi.baidu.com/rest/2.0/passport/users/getInfo";

try{

//使用baidu对象request时,第二个参数会自动将包含在对象中的access Token传入

finalString jsonText =mBaidu.request(url,null,"GET");

//返回对象为简单类(实体时)时,使用class型

finalUserEntity user =mGson.fromJson(jsonText,UserEntity.class);

//返回对象为泛型时,使用Type方式

finalUserEntity user =mGson.fromJson(jsonText,newTypeToken(){}.getType());

//在主线程中实现runnable接口,完成ui的更新

runOnUiThread(newRunnable() {

@Override

public voidrun() {

tvResult.setText(jsonText);

tvUser.setText(mGson.toJson(user));

}

});

}catch(IOException e) {

e.printStackTrace();

}catch(BaiduException e) {

e.printStackTrace();

}

super.run();

}

}.start();

其中通过使用Gson库,完成json文本到json实体的转换或json实体到json文本的转换

首先实体化Gson对象

mGson=newGson();

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,596评论 18 139
  • OAuth是一个关于授权(authorization)的开放网络标准,在全世界得到广泛应用,目前的版本是2.0版。...
    常晓晓阅读 776评论 0 0
  • 本文以一种简化的格式描述OAuth 2.0 ,以帮助开发人员和服务提供者实现该协议。 The OAuth 2 sp...
    KennethChen93阅读 4,139评论 1 11
  • OAuth 2.0 是目前比较流行的做法,它率先被Google, Yahoo, Microsoft, Facebo...
    半夜菊花茶阅读 14,600评论 0 12
  • Java IO 如何实现文件上传或者下载?通过FileInputStream和FileOutputStream两个...
    迷人的酋长阅读 159评论 0 0