- 浏览: 225936 次
- 性别:
- 来自: 北京
-
文章分类
- 全部博客 (144)
- Python (6)
- Java (15)
- Project management (2)
- DB (11)
- Spring (1)
- Mobile (3)
- 互联网 (10)
- Maven (2)
- SCM (5)
- linux (24)
- Mac (14)
- UCD / UED (6)
- Tools (1)
- Test (1)
- iPhone (1)
- 新产品&新工具 (8)
- OAuth (4)
- Java Script (5)
- HTML5 (2)
- Lucene / Solr (7)
- nginx (1)
- Product Manager (1)
- Design (1)
- Office (1)
- RegExp (0)
- 性能调优 (2)
- 读书笔记 (2)
- NodeJs (2)
最新评论
-
410163269:
看不清楚 蛋疼
基于 OAuth 安全协议的 Java 应用编程 -
xufun:
路过,拜读学习了。谢谢!
未来的授权标准 -- OAuth 2.0 -
xufun:
好文!路过拜读了,谢谢!
NoSQL - CouchDB入门 -
mimicom:
牛b......
最牛B的 Linux Shell 命令(三) -
as3291363:
你有一些 中文資料嗎????
Java Script 代码生成器: CoffeeScript
简介: OAuth 协议致力于使网站和应用程序(统称为消费方 Consumer)能够在无须用户透露其认证信息的情况下,通过 API 访问该用户在服务提供方(Service Provider)那里的受保护资源。更一般地说,OAuth 为 API 认证提供了一个可自由实现且通用的方法。目前互联网很多服务如 Open API 等都提供了 OAuth 认证服务,OAuth 标准也逐渐成为开放资源授权的标准。本文讨论如何使用 Google Code 上提供的 OAuth Java 库来实现基于 OAuth 认证的 Java 应用,并结合 Google 的 Data Service,给出使用 OAuth 方式访问 Google Data 的例子。
OAuth 是由 Blaine Cook、Chris Messina、Larry Halff 及 David Recordon 共同发起的,目的在于为 API 访问授权提供一个安全、开放的标准。 基于 OAuth 认证授权具有以下特点: OAuth 的解决方案如下图所示。 如图 1 所示 OAuth 解决方案中用户、消费方及其服务提供方之间的三角关系:当用户需要 Consumer 为其提供某种服务时,该服务涉及到需要从服务提供方那里获取该用户的保护资源。OAuth 保证:只有在用户显式授权的情况下(步骤 4),消费方才可以获取该用户的资源,并用来服务于该用户。 从宏观层次来看,OAuth 按以下方式工作: 在了解 OAuth 认证流程之前,我们先来了解一下 OAuth 协议的一些基本术语定义: 对于图 2 具体每一执行步骤,解释如下: 总的来讲,在 OAuth 的技术体系里,服务提供方需要提供如下基本的功能: 而对于消费方而言,需要如下的基本功能: 我们具体来看一个使用 OAuth 认证的例子。 在传统的网站应用中,如果您想在网站 A 导入网站 B 的联系人列表,需要在网站 A 输入您网站 B 的用户名、密码信息。例如,您登陆 Plaxo (https://www.plaxo.com ),一个联系人管理网站,当您想把 GMail 的联系人列表导入到 Plaxo,您需要输入您的 GMail 用户名 / 密码,如图 3 所示: 在这里,Plaxo 承诺不会保存您在 Gmail 的密码。 如果使用 OAuth 认证,情况是不同的,您不需要向网站 A(扮演 Consumer 角色)暴露您网站 B(扮演 Service Provider 角色)的用户名、密码信息。例如,您登录 http://lab.madgex.com/oauth-net/googlecontacts/default.aspx 网站, 如图 4 所示: 点击“Get my Google Contacts”,浏览器将会重定向到 Google,引导您登录 Google,如图 5 所示: 登录成功后,将会看到图 6 的信息: 在您登录 Google,点击“Grant access”,授权 lab.madgex.com 后,lab.madgex.com 就能获得您在 Google 的联系人列表。 在上面的的例子中,网站 lab.madgex.com 扮演着 Consumer 的角色,而 Google 是 Service Provider,lab.madgex.com 使用基于 OAuth 的认证方式从 Google 获得联系人列表。 下一节,本文会给出一个消费方实现的例子,通过 OAuth 机制请求 Google Service Provider 的 OAuth Access Token,并使用该 Access Token 访问用户的在 Google 上的日历信息 (Calendar)。 作为消费方,首先需要访问 https://www.google.com/accounts/ManageDomains,从 Google 那里获得标志我们身份的 Customer Key 及其 Customer Secret。另外,您可以生成自己的自签名 X509 数字证书,并且把证书上传给 Google,Google 将会使用证书的公钥来验证任何来自您的请求。 具体的操作步骤,请读者参考 Google 的说明文档:http://code.google.com/apis/gdata/articles/oauth.html。 在您完成这些工作,您将会得到 OAuth Consumer Key 及其 OAuth Consumer Secret,用于我们下面的开发工作。 以下的代码是基于 Google Code 上提供的 OAuth Java 库进行开发的,读者可以从 http://oauth.googlecode.com/svn/code/java/core/ 下载获得。 使用 Request Token, 将用户重定向到授权页面,如图 7 所示: 在上述步骤成功完成后,Access Token 将保存在 accessor 对象的 accessToken 成员变量里。查看您的 Google Account 安全管理页面,可以看到您授权的所有消费方,如图 8 所示。 使用 OAuth Access Token 访问 Google 服务 接下来,我们使用上一节获得的 Access Token 设置 Google Service 的 OAuth 认证参数,然后从 Google Service 获取该用户的 Calendar 信息: 清单 1 是完整的示例代码,供读者参考。 OAuth 协议作为一种开放的,基于用户登录的授权认证方式,目前互联网很多 Open API 都对 OAuth 提供了支持,这包括 Google, Yahoo,Twitter 等。本文以 Google 为例子,介绍了 Java 桌面程序如何开发 OAuth 认证应用。在开发桌面应用访问 Web 资源这样一类程序时,一般通行的步骤是:使用 OAuth 做认证,然后使用获得的 OAuth Access Token,通过 REST API 访问用户在服务提供方的资源。 事实上,目前 OAuth 正通过许多实现(包括针对 Java、C#、Objective-C、Perl、PHP 及 Ruby 语言的实现)获得巨大的动力。大部分实现都由 OAuth 项目维护并放在 Google 代码库 (http://oauth.googlecode.com/svn/) 上。开发者可以利用这些 OAuth 类库编写自己需要的 OAuth 应用。 学习
图 1. OAuth Solution
图 2. OAuth 授权流程(摘自 OAuth 规范)
图 3. 在 Plaxo 获得 GMail 联系人
图 4. 在 lab.madgex.com 获得 GMail 联系人
图 5. 登录 Google
图 6. Google 对 lab.madgex.com 网站授权
OAuthServiceProvider serviceProvider = new OAuthServiceProvider(
"https://www.google.com/accounts/OAuthGetRequestToken",
"https://www.google.com/accounts/OAuthAuthorizeToken",
"https://www.google.com/accounts/OAuthGetAccessToken");
OAuthConsumer oauthConsumer = new OAuthConsumer(null
, "www.example.com"
, "hIsGkM+T4+90fKNesTtJq8Gs"
, serviceProvider);
oauthConsumer.setProperty(OAuth.OAUTH_SIGNATURE_METHOD, OAuth.RSA_SHA1);
oauthConsumer.setProperty(RSA_SHA1.PRIVATE_KEY, privateKey);
accessor = new OAuthAccessor(consumer);
Collection<? extends Map.Entry> parameters
= OAuth.newList("scope","http://www.google.com/calendar/feeds/");
OAuthMessage response = getOAuthClient().getRequestTokenResponse(
accessor, null, parameters);
图 7. OAuth User Authorization
oauthClient.getAccessToken(accessor, null, null);
图 8. Authorized OAuth Access to your Google Account
OAuthParameters para = new OAuthParameters();
para.setOAuthConsumerKey("www.example.com");
para.setOAuthToken(accessToken);
googleService.setOAuthCredentials(para, signer);
清单 1. 基于 OAuth 认证的 Google Service 消费方实现
import java.util.Collection;
import java.util.Map;
import net.oauth.OAuth;
import net.oauth.OAuthAccessor;
import net.oauth.OAuthConsumer;
import net.oauth.client.OAuthClient;
public class DesktopClient {
private final OAuthAccessor accessor;
private OAuthClient oauthClient = null;
public DesktopClient(OAuthConsumer consumer) {
accessor = new OAuthAccessor(consumer);
}
public OAuthClient getOAuthClient() {
return oauthClient;
}
public void setOAuthClient(OAuthClient client) {
this.oauthClient = client;
}
//get the OAuth access token.
public String getAccessToken(String httpMethod,
Collection<? extends Map.Entry> parameters) throws Exception {
getOAuthClient().getRequestTokenResponse(accessor, null,parameters);
String authorizationURL = OAuth.addParameters(
accessor.consumer.serviceProvider.userAuthorizationURL,
OAuth.OAUTH_TOKEN, accessor.requestToken);
//Launch the browser and redirects user to authorization URL
Runtime.getRuntime().exec("rundll32 url.dll,FileProtocolHandler "
+ authorizationURL);
//wait for user's authorization
System.out.println("Please authorize your OAuth request token. "
+ "Once that is complete, press any key to continue...");
System.in.read();
oauthClient.getAccessToken(accessor, null, null);
return accessor.accessToken;
}
}
import java.net.URL;
import java.security.KeyFactory;
import java.security.PrivateKey;
import java.security.spec.EncodedKeySpec;
import java.security.spec.PKCS8EncodedKeySpec;
import java.util.Collection;
import java.util.Map;
import com.google.gdata.client.GoogleService;
import com.google.gdata.client.authn.oauth.OAuthParameters;
import com.google.gdata.client.authn.oauth.OAuthRsaSha1Signer;
import com.google.gdata.client.authn.oauth.OAuthSigner;
import com.google.gdata.data.BaseEntry;
import com.google.gdata.data.BaseFeed;
import com.google.gdata.data.Feed;
import net.oauth.OAuth;
import net.oauth.OAuthConsumer;
import net.oauth.OAuthMessage;
import net.oauth.OAuthServiceProvider;
import net.oauth.client.OAuthClient;
import net.oauth.client.httpclient4.HttpClient4;
import net.oauth.example.desktop.MyGoogleService;
import net.oauth.signature.OAuthSignatureMethod;
import net.oauth.signature.RSA_SHA1;
public class GoogleOAuthExample {
//Note, use the private key of your self-signed X509 certificate.
private static final String PRIVATE_KEY = "XXXXXXXX";
public static void main(String[] args) throws Exception {
KeyFactory fac = KeyFactory.getInstance("RSA");
//PRIVATE_KEY is the private key of your self-signed X509 certificate.
EncodedKeySpec privKeySpec = new PKCS8EncodedKeySpec(
OAuthSignatureMethod.decodeBase64(PRIVATE_KEY));
fac = KeyFactory.getInstance("RSA");
PrivateKey privateKey = fac.generatePrivate(privKeySpec);
OAuthServiceProvider serviceProvider = new OAuthServiceProvider(
//used for obtaining a request token
//"https://www.google.com/accounts/OAuthGetRequestToken",
//used for authorizing the request token
"https://www.google.com/accounts/OAuthAuthorizeToken",
//used for upgrading to an access token
"https://www.google.com/accounts/OAuthGetAccessToken");
OAuthConsumer oauthConsumer = new OAuthConsumer(null
, "lszhy.weebly.com" //consumer key
, "hIsGnM+T4+86fKNesUtJq7Gs" //consumer secret
, serviceProvider);
oauthConsumer.setProperty(OAuth.OAUTH_SIGNATURE_METHOD, OAuth.RSA_SHA1);
oauthConsumer.setProperty(RSA_SHA1.PRIVATE_KEY, privateKey);
DesktopClient client = new DesktopClient(oauthConsumer);
client.setOAuthClient(new OAuthClient(new HttpClient4()));
Collection<? extends Map.Entry> parameters =
OAuth.newList("scope","http://www.google.com/calendar/feeds/");
String accessToken = client.getAccessToken(OAuthMessage.GET,parameters);
//Make an OAuth authorized request to Google
// Initialize the variables needed to make the request
URL feedUrl = new URL(
"http://www.google.com/calendar/feeds/default/allcalendars/full");
System.out.println("Sending request to " + feedUrl.toString());
System.out.println();
GoogleService googleService = new GoogleService("cl", "oauth-sample-app");
OAuthSigner signer = new OAuthRsaSha1Signer(MyGoogleService.PRIVATE_KEY);
// Set the OAuth credentials which were obtained from the step above.
OAuthParameters para = new OAuthParameters();
para.setOAuthConsumerKey("lszhy.weebly.com");
para.setOAuthToken(accessToken);
googleService.setOAuthCredentials(para, signer);
// Make the request to Google
BaseFeed resultFeed = googleService.getFeed(feedUrl, Feed.class);
System.out.println("Response Data:");
System.out.println("==========================================");
System.out.println("|TITLE: " + resultFeed.getTitle().getPlainText());
if (resultFeed.getEntries().size() == 0) {
System.out.println("|\tNo entries found.");
} else {
for (int i = 0; i < resultFeed.getEntries().size(); i++) {
BaseEntry entry = (BaseEntry) resultFeed.getEntries().get(i);
System.out.println("|\t" + (i + 1) + ": "
+ entry.getTitle().getPlainText());
}
}
System.out.println("==========================================");
}
}
发表评论
-
成品正则表达式查询网站
2011-04-27 16:10 866http://regexlib.com/Search.aspx ... -
手机web开发框架
2011-04-27 13:02 1265mobl是一种新的开源编程语言, 主要用于加速手机应用的开发, ... -
Firebug控制台详解
2011-03-28 13:01 796Firebug控制台详解 作者:阮一峰 控制台(C ... -
Firebug入门指南
2011-03-28 13:00 675据说,对于网页开发人员来说,Firebug是Fir ... -
CodePad 能让你在线贴代码,并且支持编译和运行
2011-03-22 10:32 2002<http://codepad.org/>code ... -
Web开发人员应当知道的15个开源项目
2011-03-19 17:19 897如今,构建网站和开发Web应用程序已经不仅要求开发人员 ... -
Javascript文档利器: JsDoc Toolkit
2011-02-24 14:55 1024Javascript文档利器: JsDoc T ...
相关推荐
基于OAuth2.0协议和SSM框架的单点登录系统不仅是一个技术实践,也是对计算机科学领域知识的深入理解与综合应用。通过这样的毕业设计,学生可以将所学的理论知识与实际需求相结合,锻炼系统设计和软件开发的能力,为...
Java网络编程是Java开发中的重要领域,它涵盖了网络通信的所有基本概念和技术...通过阅读《Java网络编程》第三版,开发者可以系统地学习这些知识点,并通过实例加深理解,为构建高效、安全的网络应用程序打下坚实基础。
Spring框架是一个开源的Java平台,它解决了企业应用开发的复杂性问题,为Java应用提供了全面的编程和配置模型。在众多Spring框架的模块中,Spring Security是一个提供安全性解决方案的模块,而Spring OAuth是Spring ...
Dante Cloud (但丁,原 Eurynome Cloud) 是一款企业级微服务架构和服务能力开发平台,是采用领域驱动模型(DDD)设计思想的、全面拥抱 Spring Authorization Server 的、基于 OAuth2.1 协议的、支持智能电视、IoT等...
Dante Cloud 是一款企业级微服务架构和服务能力开发平台,是采用领域驱动模型(DDD)设计思想的、全面拥抱 Spring Authorization Server 的、基于 OAuth2.1 协议的、支持智能电视、IoT等物联网设备认证的多租户微服务...
通过以上介绍,我们可以看出Java WebSocket编程、开发、部署和保护动态Web应用涉及的方方面面,从基础概念到实际操作,再到安全性和性能优化,都是开发者需要掌握的关键点。在实践中,理解并运用这些知识可以创建出...
- **TCP/IP协议**:传输控制协议/因特网互联协议是Internet最基本的协议、Internet国际互联网络的基础,Java网络编程中经常会用到TCP/IP协议。 - **UDP协议**:用户数据报协议,是一种无连接的协议,发送数据之前不...
对于使用Java进行开发的开发者来说,能够理解和掌握OAuth协议以及对应的实现框架是非常重要的,它能帮助开发者更好地保护用户数据,并使得用户在使用多个服务时能够有更加流畅和安全的体验。 标签 "java" 表明本文...
Spring Security OAuth是一个强大的、基于Spring Security框架的认证授权解决方案,用于保护应用程序资源并支持OAuth2协议。本项目通过源码的形式,深入展现了如何设计和实现一个完整的Spring Security OAuth认证...
首先,`sinaWeibo javaSDK`是基于`weibo4j`框架的一个扩展,主要针对OAuth2.0授权协议进行了优化。OAuth2.0是一种广泛采用的安全授权标准,允许第三方应用在用户授权的情况下,访问其在微博上的数据,而无需获取用户...
Java服务器高级编程主要涵盖了许多关键领域,包括但不限于网络编程、多线程、并发处理、数据库交互、框架应用、性能优化以及分布式系统等。在Java的世界里,服务器端开发是核心部分,因为它支持着互联网应用程序的...
8. **安全性**:Agorava对OAuth协议的安全性进行了封装,确保了敏感数据的加密和安全传输,降低了第三方应用滥用用户数据的风险。 9. **可扩展性**:Agorava的设计使其易于扩展以支持新的社交网络。开发者只需要...
8. **文件名称列表**:“IoT_OceanConnect_North_GUI_APPDemo-master”可能是一个包含GUI应用示例的项目,可能包括源代码、配置文件、测试数据等,开发者可以参考这个示例来理解如何构建一个完整的Java应用,与Ocean...
在OAuth 2.0 在实际应用中,经常会涉及到与OpenID Connect(OIDC)的整合,这是一个基于OAuth 2.0 协议的身份层,它允许应用获取用户的详细信息,并验证用户的身份。这在需要用户身份验证的场景下非常有用。 总的来...
随着网络安全问题日益严峻,开源社区涌现出大量专注于安全的Java应用。这些应用提供了从基本的认证与授权到复杂的加密技术,再到漏洞扫描与攻击防御的全方位解决方案。源码作为学习安全技术的宝贵资料,对于开发者...
与此同时,SAS OAuth2作为安全授权技术,确保了系统的安全性,使得RBAC(基于角色的访问控制)权限管理更加精细化和定制化。 Spring Boot 3.4通过提供自动配置、起步依赖和命令行界面,极大地简化了基于Spring的...
OAuth协议用于第三方应用授权,保证用户在不同服务之间共享信息时的安全性。 9. **异常处理与日志记录** 强大的异常处理机制和日志记录功能是Java的重要特点,它们在电子商务系统中帮助开发者及时发现和处理安全...
标题中的“基于Java的两个通用安全模块的设计与实现”表明这是一个关于使用Java编程语言来构建安全功能的项目。在Java中,安全性是至关重要的,尤其是对于网络应用、服务器端编程或者处理敏感用户数据的情况。本设计...
【标题】"java毕业设计——基于Java的两个通用安全模块的设计与实现.zip"涉及的核心知识点主要围绕Java编程语言,以及在安全领域的应用。这是一份毕业设计项目,旨在通过Java来构建两个通用的安全模块,以增强软件...
总的来说,《基于JAVA的安全电子商务》这篇毕业设计论文涵盖了JAVA语言的核心特性、电子商务系统的架构设计以及网络安全策略等多个方面,对于学习JAVA编程和理解电子商务系统的运作具有很高的参考价值。通过这样的...