Java 开发者  - 讨论区

标题:通过 OAuth 访问社会网络 Web 站点,第 3 部分: 将 Web Twitter 客户机部署到 Google App Engine

2010年11月01日 星期一 13:57

OAuth 提供了一种更好的方式供消费者站点访问用户保存在服务提供商处的受保护资源。通过使用 OAuth,用户凭证绝不会暴露给除最初保存用户数据的位置以外的站点。通过使用  第 1 部分  中开发的桌面 Twitter 客户机,您可以在授权  MyTtDesktopClient  访问您的 Twitter 数据后更新您的 Twitter 状态。对于返回的用户,这是一种良好的用户体验,因为访问令牌可以被重用。 第 2 部分  展示了如何使用 OAuth 开发一个 Web Twitter 客户机,它使用户能够通过 OAuth 完成对 Twitter 的身份验证并更新他们的状态。它还显示了朋友们的时间表。

在本文中,您将了解如何使您的 Web 应用程序在一个生产环境中工作。您将把  第 2 部分  中开发的 Twitter 客户机迁移到 Google App Engine (GAE)。您不能简单地部署 WAR 文件;需要进行一些修改来让它在 GAE 下工作。处理 GAE 的最简单的方法是使用  Google Plugin for Eclipse ,它支持 GAE 和 Google Web Toolkit (GWT) 开发。

您可以  下载  本文使用的样例代码。

Google App Engine

GAE 由 Google 提供,使 Web 应用程序能够运行在 Google 的基础设施上。GAE 的一大优势就是您的应用程序可以轻松地随着通信量和数据存储需求的增长而扩展。您可以侧重于软件开发而不需要担心 Web 和数据库服务器维护。当您部署到 GAE 上的应用程序的流量适度时,您可以免费使用它。当越来越多的用户被吸引到您的网站,那么可以从 Google 购买更多 CPU 时间和数据存储。在撰写本文之际,GAE 可以同时支持 Python 和 Java™ 代码。

在 Google 上注册您的 Web 应用程序

所有 GAE 应用程序都需要在 Google 上注册。

  1. 如果没有 Google 帐户的话,那么就请注册一个。
  2. 访问  Google App Engine  并登录。
  3. 单击  Create an Application 。会提示您输入国家和手机号。

    Google 将向您的手机发送一个验证码。

  4. 一旦经过验证后,就可以登录到 GAE 并单击  Create an Application  以创建 Web 应用程序。

例如,我在注册我的应用程序时提供了以下信息:

  • Application Identifier:dr-yang-tt.appspot.com

    选择您自己的惟一标识符。

  • Application Title:DR YANG's Twitter Client
  • Authentication Options:单击  Edit  链接,选择  Restricted to the following Google Apps domain ,然后将对话框留空。

    默认情况下,站点将公开给所有 Google 帐户用户,但是以上这些设置使每个人都能访问您的站点(拥有 Google 帐户的用户和非 Google 用户)。

在 Twitter 上注册您的 Web 应用程序

如果您已经阅读了本系列的前两篇文章,那么您可以注册一个新的应用程序或是修改 Twitter 中的已注册应用程序。如下所示,示例应用程序被注册为一个新的应用程序,位于 http://twitter.com/oauth_clients。

  • Application Name:Dr Yang's Tt Web Client
  • Description:运行在 Google 应用程序引擎内部的 Twitter Web 客户机
  • Application Web site:http://dr-yang-tt.appspot.com/twitterwebclient
  • Application Type:Browser
  • Callback URL:http://dr-yang-tt.appspot.com/twitterwebclient

    确保设置正确的回调 URL;您不需要使用  第 2 部分  中描述的回调 URL 定制功能。

  • Default Access type:Read & Write

    您需要赋予用户写访问权。

  • Use Twitter for login:No

一旦成功注册应用程序后,您将获得一个  consumer key 、一个  consumer secret  和三个 URL(请求令牌 URL、访问令牌 URL 和授权 URL)。Consumer key 和 consumer secret 将在 WEB-INF/web.xml 中设置。

在 GAE 中开发和测试 Twitter 客户机

如上所述,示例使用  Google Plugin for Eclipse  进行开发。在撰写本文之际,有三个版本的 Eclipse 受到支持:3.5 (Galileo)、3.4 (Ganymede) 和 3.3 (Europa)。示例是使用安装有 Eclipse 3.5 的机器开发的,因此  Google Plugin for Eclipse 3.5  被用于安装该插件。建议您安装此插件提供的所有内容,这样就可以同时支持 GAE 和 GWT 开发。完成插件安装后,遵循 "Quick Start" 指南,了解如何开发您的 hello world Web 应用程序并将其部署到 GAE。(提供详细的指导超出了本文的范围)。

在 Eclipse 内创建了 Web Application Project 后,Google Plugin 将为您创建一些模板。可以在这个基础项目之上添加示例代码。 图 1  展示了  TwitterWebClient1  项目下的文件。 图 1  下面对这一文件进行了解释。

在创建项目时,并没有选中 GWT 支持。如果熟悉 GWT 的话,您可能需要启用它。GWT 使您能够使用 Java Swing 风格的编程开发 Ajax 应用程序。


图 1. Eclipse 中的 GAE 项目  TwitterWebClient1  
屏幕快照:Eclipse 中的 GAE 项目 TwitterWebClient1  
src/logging.properties
Java 日志配置文件。与 GAE 中的 Log4J 相比,该文件更易于使用。
src/dryang/twitterwebclient/IdAndAccessToken.java
Java Persistence API (JPA) 的实体数据类
src/dryang/twitterwebclient/JpaUtil.java
JPA 实用类
src/dryang/twitterwebclient/TwitterStatus.java
表示 Twitter 时间表的类
src/dryang/twitterwebclient/TwitterWebClientServlet.java
应用程序的核心控制器,表示 OAuth 身份验证和用户交互
src/META-INF/jdoconfig.xml
Java Data Object (JDO) 配置文件。本文示例没有使用该文件。
war/error.jsp
处理异常的 JSP 页面
war/Gnome-Edit-Delete-32.png
删除图标
war/index.html
欢迎页面,它自动将用户的浏览器重定向到我们的 Twitter 客户机
war/login_twitter.html
登录页面
war/twitter_button_5_hi.gif
登录按钮图像
war/update_twitter_status.jsp
显示用户的 Twitter 信息的 JSP 页面
war/WEB-INF/appengine-web.xml
GAE Web 配置文件
war/WEB-INF/web.xml
标准 Web 配置文件

在编译并将  源代码  部署到 GAE 之前:

  1. 不要忘记设置自己的 consumer key 并选择内部 web.xml。
  2. 您还需要将 twitter4j-2.0.9.jar 放到 war/WEB-INF/lib 下。

    Twitter4J 是一个开源的 Java 库,面向 TwitterAPI(参见  参考资料 )。

  3. 将 JAR 文件手动添加到项目的编译路径。

核心代码  TwitterWebClient  servlet 非常类似于  第 2 部分  中的  MyTwitterServlet 。但是,有一些不同之处,如下所示:

  • 采用了 Java 日志系统,因为 GAE 的 Log4J 不易于使用。
    GAE 默认情况下不支持 HTTP 会话。您需要在 war/WEB-INF/appengine-web.xml 中启用它,方法是添加:

    <sessions-enabled>true</sessions-enabled>

  • 由于序列化问题, Twitter  对象不再存储在 HTTP 会话中。您可能已经知道,GAE 是一个动态的集群环境。您存储在 HTTP 会话中的所有内容都必须实现  java.io.Serializable  接口,如示例对  TwitterStatus  类所作的操作一样。为了解决这个问题,将访问令牌存储到会话中,在该会话中将创建一个  Twitter  对象并进行身份验证。
  • 用户的访问令牌不再以明文形式的文件保存,而是保存在 GAE 的数据存储中,这有别于传统的数据库。幸运的是,它同时支持 JDO 和 JPA。示例使用了 JPA。Google 文档 “ Using JPA with App Engine ” 提供了介绍。

    总的来说,需要在 persistence.xml 内部配置 JPA。创建数据类和一个实用类来获取  EntityManager  实例。在这个 Web 应用程序中,数据类为  dryang.twitterwebclient.IdAndAccessToken ,它有三个字段: id token  和  tokenSecret 。参见  清单 1 。您可能会注意到  TwitterWebClient  servlet 的  storeAccessToken(...)  和  loadAccessToken(...)  方法内的用户 Twitter ID 的 “ $ ” 前缀。这是因为  id  被设置为一个  java.lang.String ,而 Twitter ID 是一个整数。GAE 数据存储不会接受字符串形式的 ID。


清单 1. JPA 数据类  dryang.twitterwebclient.IdAndAccessToken
     @Entity
public class IdAndAccessToken {
	@Id
	private String id;
	private String token;
	private String tokenSecret;

	public IdAndAccessToken() {
	}

	public IdAndAccessToken(String id, String token, String tokenSecret) {
		this.id = id;
		this.token = token;
		this.tokenSecret = tokenSecret;
	}

	// Getters and setters
	......
}
    

完成所有开发工作后:

  1. 右键单击 Eclipse 中的项目,然后选择  Google --> App Engine Settings...

    您应当会看到类似于  图 2  所示的弹出窗口。

  2. 填入正确的应用程序 ID(本例中为  dr-yang-tt )。
  3. 再次右键单击 Eclipse 中的项目,然后选择  Google --> Deploy to App Engine

您的应用程序稍后就会被成功部署到 GAE。


图 2. Eclipse 中的 GAE 设置
 'Properties for TwitterWebClient1' 屏幕的快照。'Use Google App Engine' 被选中,以及 'Use default SDK (App Engine - 1.2.2)'。Application ID 为 'dr-yang-tt',而 Version 为 '1'。  

GAE 提供了一个  管理界面 。使用您的 Google 帐户登录到该界面;应当会看到您的应用程序列表。 图 3  显示了  dr-yang-tt  应用程序的示例。您会发现 Logs 链接对于调试应用程序非常有用。

注意 Twitter 对 API 调用的限制。一旦应用程序激活后,您可能需要更多地访问 Twitter。并且,当越来越多地用户被您的站点所吸引,您可能需要向 Google 购买更多的 CPU 时间和数据存储空间。


图 3. GAE 的  dr-yang-tt  的管理界面
屏幕快照显示 DR               Yang 的 Twitter Client 指示板。页面的顶部有一个图形。  

图 4  展示了运行在 GAE 之上的应用程序。


图 4. GAE 上启用 OAuth 的 Twitter 客户机
DR Yang 的 Twitter 客户机的屏幕快照,展示了 twitter 更新和用于输入状态的文本框。  

2010年11月01日 星期一 15:25

之前为了翻墙看twitter这么干过,用GWT+Spring, 现在我那个应用好像不好用了, 反正用着别人的VPN, 就懒得更新了,呵呵

如下红色区域有误,请重新填写。

    你的回复:

    请 登录 后回复。还没有在Zeuux哲思注册吗?现在 注册 !

    Zeuux © 2024

    京ICP备05028076号