基于Android平台的人人网应用程序的开发流程一

64
回复
904701
查看
  [复制链接]

332

主题

739

帖子

32万

安币

码皇(巴士元老)

Rank: 8Rank: 8

突出贡献终身成就奖

QQ
发表于 2011-8-18 22:28:47 | 显示全部楼层 |阅读模式
本帖最后由 songshichao 于 2011-8-19 09:42 编辑

      人人网目前针对不同领域的开发者,提供了相应的教程和文档,目前主要分为“站内应用开发”、“第三方网站接入”、“移动客户端接入”和“桌面客户端接入”四大模块。下面的所有东西,都是关于基于Android的移动客户端接入方向的,如果你是WEB应用、桌面应用或者其它的,或许我这里帮不上你,请你去官方查看文档。


   移动客户端接入

   运行在手机或其它移动设备上的客户端软件也可以注册成为开放平台应用,并提供一些功能让人人网用户使用,如:街旁的iPhone版本。

   本文档介绍移动客户端应用如何接入人人网。

   手机等移动设备的客户端应用(如手机游戏、实用工具等)接入人人网,可以使用人人网帐号登录移动客户端,并利用人人网开放平台提供的社交图谱(Social Graph)和传播渠道,增进用户与好友的交互,提升使用体验,并获得广泛传播。

Android手机客户端应用接入

   Android手机客户端接入人人网,可以有两种实现方式:
   一种是直接使用人人网开放平台提供的各种接口,如用作验证和授权的OAuth 2.0,提供数据的底层Rest API,以及嵌入各种Widget;使用这种方式时你需要了解OAuth 2.0的一些细节,请注意使用display=touch等参数指定适合在Android上显示的授权页面,详见OAuth 2.0在移动领域的应用。 你可能还需要自己选择合适的人人网按钮标识素材,来为用户提示登录功能,参见:
    用人人帐号登录标识
    人人网标识

   另一种是使用人人网开放平台官方封装的开源Android SDK。
   人人网最新版的Android SDK实际上是将OAuth 2.0、Rest API等平台提供的底层接口封装起来了。

   这里我们采用第一种方式, 即直接使用人人网开放平台提供的各种接口,这种方式比较简单,自己可以随心所欲的发挥,因为我自己就是采用这种方式,发现非常简单。至于第二种方式,我也看了人人网提供的SDK,看不懂,它虽然做了封装,但是我认为,这是在增加难度,而不是简化开发的难度。好多朋友说,使用SDK,会简单些,其实则不然。当然,不同人有不同的看法, 这个因人而异。

   好了,我们进入正题。

   既然要使用第一种方式,那么我们就要了解什么是OAuth2.0。这个具体的我就不讲了,在我前几天发的帖子中,专门对它的历史进行了介绍,也有关于OAuth协议的整个发展史,大家可以去安卓巴士搜索下。

   第一步,让我们了解人人OAuth2.0验证授权基本流程。

   阅读下面的东西您需要提前了解:
        了解如何在开发者中心中 创建应用。
        知道API Key 和 Secret Key的作用。
        大致了解OAuth 2.0 参考文档中介绍的几个验证流程,了解上下文中相关术语,如:Access Grant、Authorization Code、Access Token等。

   创建一个应用,这个就不用讲了吧,不会的童鞋,去人人网开放平台,进入我的应用,创建一个新的应用,根据提示创建就可以了,这不是本文的重点,所以不做过多的介绍。

   本文使用一个公共的应用的API Key 和 Secret Key来体验人人OAuth2.0验证授权流程,以便对人人OAuth2.0验证授权流程有一个初步的认识。

   API Key就是人人OAuth2.0中的“client_id”,Secret Key就是“client_secret”。
以下为公共应用的API Key 和 Secret Key:
•        API Key(client_id): fee11992a4ac4caabfca7800d233f814
•        Secret Key(client_secret): a617e78710454b12aab68576382e8e14

     若开发者想使用自己的应用来体验人人OAuth2.0,可以在开发者中心页面 创建应用,注册应用后便可以获得API_KEY 和 Secret Key。


验证授权简介
支持以下几种验证授权方式: 用户授权页面方式、 用户名、密码方式。

•  用户授权页面方式
  服务端流程(Web Server Flow):适用于有Web Server的应用,希望从自己的Web Server发送API调用请求的应用。例如:Web站点、有Web Server支持的客户端应用等。

  客户端流程(Implicit Flow):适用于无Web Server的应用,希望在客户端发送API调用请求的应用。例如:运行在浏览器中的JavaScript程序、手机客户端、桌面客户端等。

•  用户名、密码方式:适用于深度合作伙伴使用。

    作为独立开发者的我们,只能使用用户授权页面方式了。那么基于Android的手机开发,到底是服务端流程还是客户端流程呢?我们做一个分析。我们只是拥有一部独立的手机,并没有服务器作为支撑,根据服务端流程的描述,我们似乎不符合这个。再看客户端流程,适用于没有服务器的程序,它也提到了手机客户端,那是不是说我们做基于Android手机开发,就是使用这种客户端流程呢?我在开发之初,有很多疑问,我去询问人人开放平台的开发人员,他们也没给我很好的提示,回答的东西似乎不是我要问的东西。因此,只能靠自己摸索了。首先我在EOE上发现了一个朋友写的一段关于人人网OAuth2.0的授权的示例代码,我运行后,经过一步一步的看代码,我发现,他使用的是第一种方式:服务端流程。此时,我有了一个疑问:我们手机客户端也没有服务器啊,为什么使用这种授权方式呢?但是当时没有想到答案,此疑问一直保留至今。我估计是这样的,打个比方,我个人拥有一个独立的购物网站,我想利用人人网,开发一个手机客户端,提交应用程序到人人网开放平台上,提供用户下载,用户下载后,就可以在手机客户端上去买我的网站购物,那么这个时候,我就要用到我自己网站服务器上的数据,因此,从这个角度讲,我是有服务器的。不知我的理解是否正确,请大家多多发言,说说自己的想法,如果不正确,我再修改本文。

    好,那我现在就假设我自己拥有一个购物网站,我要利用人人网来销售我的东西。那么下面的东西都是基于服务端流程开发的。

    回调参数“redirect_uri”验证方式及相关的应用配置
    每一种人人OAuth2.0验证授权流程中都会涉及到“回调”,“回调”的目的是传递相应信息给第三方应用。“回调”的方式是通过跳转到开发者提供的“redirect_uri”,并附带参数来实现的。但为确保回调的安全,回调URI“redirect_uri”需要在开发者中心提前进行配置。不同类型的应用,配置方式略有不同,关于redirect_uri的验证方式的详细信息请参考 “redirect_uri”验证方式及相关的应用配置。 这个我们暂且不用配置。

为本例简单起见,本例使用人人网提供的回调URI:http://graph.renren.com/oauth/login_success.html


     体验验证授权

   用户授权页面方式

   流程一:服务端流程(Web Server Flow)
     (这个流程适用于有Web Server支持的应用,例如:Web站点、有Web Server支持的客户端应用等)

     第一步:获取Authorization Code
为了获取Authorization Code,应用需要将用户浏览器重定向到授权服务器“https://graph.renren.com/oauth/authorize”,并带上3个必须参数,参数具体的用法请参考获取Authorization Code。

   本例中,需要将用户浏览器重定向到以下URL:https://graph.renren.com/oauth/a ... /login_success.html

     小提示
   本例只使用了几个必须的参数,代表要求用户授予默认权限。授予更高权限、维持用户状态等需求,请参考获取Authorization Code; 【使用高级API时,我会详细介绍】
登录界面:
1.PNG

授权界面:
2.PNG

用户输入人人网账号/密码提交后,授权服务器会验证用户,并询问用户是否授权,
若用户通过验证并同意授权,授权服务器将重定向用户浏览器到“redirect_uri”,并在“redirect_uri” 的Query Parameter中追加“code”参数,
该参数的值即为Authorization Code。Authorization Code可以在“redirect_uri”对应的服务端程序中获取。
在这个例子中,上述链接将被重定向到“http://graph.renren.com/oauth/lo ... 21XEB3bU5cKWvdnFhND”。如下图所示:
3.PNG

注意:每一个Authorization Code的有效期为一个小时,并且只能使用一次,再次使用将无效。

    第二步:使用Authorization Code换取Access Token
       通过上面第一步获得Authorization Code后,便可以用其换取一个Access Token。
  • 做法:应用需要在接收Authorization Code 的服务端程序中发送请求到授权服务器“https://graph.renren.com/oauth/token”,并带上5个必须参数,参数的用法请参考使用Authorization Code获取Access Token。

  • 举例:https://graph.renren.com/oauth/t ... tion_code&code={Authorization_Code}

   • 返回值:授权服务器将返回一段JSON文本,这两个即为Access Token和Access Token的有效期,有关Access Token详细文档,请参考 使用Authorization Code获取Access Token,返回值如下所示:
{
    access_token: "127089|6.51997d8c6e2f72f6c3e6c22dfb221bb4.2592000.1312686000-318782080"
    expires_in: 2593539
    refresh_token: "127089|7.ea9021f74399c9c522fdabc4d1669507.5184000.1315278000-318782080"
    scope: "read_user_blog"
}

       第三步:使用Access Token换取Session key
       目前人人API使用独有的Session Key机制来认证应用和用户,所以调用人人API前,需要获取Session Key。
    Session Key资源服务URI为“https://graph.renren.com/renren_api/session_key”。
https://graph.renren.com/renren_ ... _token=access_token

如果“oauth_token”通过认证,Session Key资源服务会返回一段JSON文本:
{
    "renren_token": {
        "expires_in": 81645,
        "session_secret": "4671832de71c2032384bc2762fbd7c25",
        "session_key": "5.a6b7dbd428f731035f771b8d15063f61.86400.1292922000-222209506"
    },
    "oauth_token": "10000|5.a6b7dbd428f731035f771b8d15063f61.86400.1292922000-222209506",
    "user": {
        "id": 222209506
    }
}

注:建议对oauth_token进行url编码后再调用。在有的客户端,不进行url编码可能会出现问题。传递到Session Key 资源服务的“oauth_token”将会被原样返回,便于客户端进行一一对应。人人用户的ID也会被返回,用于区分Session Key 是哪个用户的。

    OK,成功了,我们已经获取了所有后续要用到的东西了。使用OAuth2.0验证授权后,会得到access_token。之前,必须再调用一次,将access_token换成session_key,然后再用session_key调用API。现在,可以省掉换session_key这一步了,可以直接用access_token调用API。参考网址:http://wiki.dev.renren.com/wiki/Access_token_using_in_API

       那么我建议大家先使用第一种方式,虽然麻烦了一点,但是很通用,使用任何一个API都不会出问题,等我们熟悉了这种用法,再使用第二种来简化开发比较好。

    人人网将API分成基础API和高级API,使用高级API要申请或者添加测试用户才能用。这些后面会讲到,大家心里先有个谱。
说了这么多,有的人可能已经蒙了。不过没关系,下面结合代码来进行讲解,你会有“柳暗花明又一村”的感觉。我们先不去请求人人的服务器获取数据,先完成上面说的,获取access_token和session_key。

35

主题

365

帖子

1212

安币

Android大神

Rank: 6Rank: 6

发表于 2011-8-18 22:45:31 | 显示全部楼层
我果然还是常识方面太过欠缺了

关于授权方面的东西有没有实例参考之类?

最基础的东西就好,希望能给个传送……

332

主题

739

帖子

32万

安币

码皇(巴士元老)

Rank: 8Rank: 8

突出贡献终身成就奖

QQ
 楼主| 发表于 2011-8-19 09:43:34 | 显示全部楼层
我发现我写的东西太理论了。我想变成我自己的话,但是我感觉变成我自己的话就失去了那种意义,愿意被改变了就不是那个味了。

332

主题

739

帖子

32万

安币

码皇(巴士元老)

Rank: 8Rank: 8

突出贡献终身成就奖

QQ
 楼主| 发表于 2011-8-19 09:44:02 | 显示全部楼层
下一篇还是贴代码吧。画个流程图,这样看起来爽多了。

35

主题

365

帖子

1212

安币

Android大神

Rank: 6Rank: 6

发表于 2011-8-19 10:39:41 | 显示全部楼层
学习的人有很多种,每个人胃口不一样,
直接写自己的感悟心得,并且加入自己的看法可能会更好一点

代码方面需要大家去练习才能完全领悟啊,随性就好

14

主题

361

帖子

204

安币

攻城狮

Rank: 3Rank: 3

发表于 2011-9-12 19:02:36 | 显示全部楼层
下一篇还是贴代码吧。画个流程图,这样看起来爽多了

主题

帖子

安币

游客

发表于 2011-9-12 19:31:54 | 显示全部楼层
很好很好。LZ辛苦

0

主题

15

帖子

30

安币

初级码农

Rank: 1

发表于 2011-9-29 15:18:47 | 显示全部楼层
学习+膜拜
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

领先的中文移动开发者社区
18620764416
7*24全天服务
意见反馈:1294855032@qq.com

扫一扫关注我们

Powered by Discuz! X3.2© 2001-2019 Comsenz Inc.( 粤ICP备15117877号 )