`
xhfei
  • 浏览: 115866 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

OAuth授权的Java实现详解 (转载)

阅读更多
转自(http://www.360doc.com/content/11/0128/11/1542811_89529987.shtml
由于最近在开发一个关于微博整合的小应用,于是开始接触各大微博平台的开放平台(新浪、搜狐、网易、QQ):目前这三大微博的应用开发都采用OAuth授权,要访问大部分API都需要OAuth方式的身份鉴权。

OAuth是什么?

先 来简单介绍一下OAuth授权协议:OAUTH协议为用户资源的授权提供了一个安全的、开放而又简易的标准。同时,任何第三方都可以使用OAuth认证服 务,任何服务提供商都可以实现自身的OAuth认证服务,因而OAUTH是开放的。业界提供了OAuth的多种实现如 PHP,JavaScript,Java,Ruby等各种语言开发包,大大节约了程序员的时间,因而OAuth是简易的。目前互联网很多服务如Open API,很多大头公司如Google,Yahoo,Microsoft等都提供了OAuth认证服务,这些都足以说明OAUTH标准逐渐成为开放资源授权 的标准。
OAuth的授权流程

你所开发的应用需要流程如下:

   1. 向应用服务商(新浪、搜狐等微博)请求request_token。
   2. 得到request_token后重定向用户到服务商的授权页面。
   3. 如果用户选择授权你得应用,用request_token向服务商请求换取access_token。
   4. 得到access_token等信息访问受限资源。

而服务商相应的响应如下:

   1. 创建request_token返回给应用。
   2. 询问用户是否授权此应用。如果用户授权重定向用户至应用页面。
   3. 创建access_token并返回给应用。
   4. 响应受限资源请求并返回相关信息。

通俗点的说法就是“你拿着你得身份证明(request_token)向服务商申请进入用户家的门钥匙(access_token),服务商询问用户同不同意,如果用户同意服务商就给你进入用户家门的钥匙(access_token),拿到钥匙后你就可以进到用户家里”。
OAuth授权的Java实现

作为一个开放协议目前有很多现成的Oauth库可供开发者使用,可以点击这里下载。不过有精力有时间的话还是自己去实现一下OAuth授权的流程,可以很好的体会OAuth认证协议的原理。

下面就是我使用Java实现Oauth的具体步骤:
一、获取Request_token

首先得准备一下参数及其来源:

   1. oauth_consumer_key —— 注册应用后由应用服务商提供
   2. consumer_secret —— 注册应用后由应用服务商提供
   3. oauth_callback —— 用户授权后的返回地址
   4. oauth_nonce —— 随机字符串,须保证每次都不同
   5. oauth_timestamp —— 时间戳
   6. oauth_signature_method —— 签名base string 的方法,目前支持 HMAC-SHA1
   7. oauth_version —— Oauth协议版本

还需要下面三个请求地址(这些地址任何一个提供OAuth的服务商都会提供给你,看下API文档就会找到):

   1. requst_token_url —— 上面第1步中的请求地址
   2. authorize_url —— 上面第2步的请求地址
   3. access_token_url —— 上面第3步的请求地址

至于如何注册应用,新浪微博点此,网易微博点此,腾讯微博点此,搜狐微博需要你发邮件索取,具体看这里。注册成功后就会获得oauth_consumer_key 和 consumer_secret 两个参数。

oauth_callback 起的作用是当用户授权成功后服务商会把用户重定向到这个网址。

oauth_nonce 是一个随机字符串下面是我的生成代码:

    public String set_nonce() {
    String base = "abcdefghijklmnopqrstuvwxyz0123456789";
    Random random = new Random();
    StringBuffer sb = new StringBuffer();
    for (int i = 0; i < 18; i++) {
    int number = random.nextInt(base.length());
    sb.append(base.charAt(number));
    }
    return sb.toString();
    }

oauth_timestamp 是请求的时间戳,我的代码如下:

    public String set_timestamp() {

    Date date = new Date();
    long time = date.getTime();
    return (time + "").substring(0, 10);
    }

需要说明一下的是这里的时间戳为10位而不是13位,因此截取0-10位置。

其他参数直接指定就行了。

接下来,有了这些参数就可以组装base string了。贮备base string的目的就是为了得到 oauth_signature 这个参数,这个参数向服务商发送请求的时候需要用到。

组装的方法是用下面8部分

   1. POST(也可以是GET,取决于你应用服务商支持哪个)。
   2. Urlencode之后的requst_token_url 。
   3. oauth_callback=Urlencode之后你的oauth_callback(Urlencode的参数为“utf-8”)。
   4. oauth_consumer_key = 你的oauth_consumer_key
   5. oauth_nonce = 你的oauth_nonce
   6. oauth_signature_method = 你的 oauth_signature_method
   7. oauth_timestamp = 你的oauth_timestamp
   8. oauth_version = “1.0”——目前大多数OAuth都采用的是1.0或1.0a版本。

需 要注意的是上面除了1跟2外其他参数的格数形如: abc=“abc” ,然后先将上面1和2部分用&号相连得到串A、3-8部分用&相连得到串B,下面需要将串B再进行一次Urlencode得到串C,最后 将A跟C以&号相连就得到了base string。这个过程中 oauth_callback 实质上经过了两次 Urlencode ,组装base string是非常容易出错的,一不小心丢一个引号或者格式稍有不对就会出错。

下面是我的Java实现代码:

    public String set_basestring() throws UnsupportedEncodingException {
    String bss;
    bss = oauth_request_method + "&"
    + URLEncoder.encode(requst_token_url, "utf-8") + "&";
    String bsss = "oauth_callback="
    + URLEncoder.encode(oauth_callback, "utf-8")
    + "&oauth_consumer_key=" + oauth_consumer_key + "&oauth_nonce="
    + oauth_nonce + "&oauth_signature_method="
    + oauth_signature_method + "&oauth_timestamp="
    + oauth_timestamp + "&oauth_version=" + oauth_version;
    bsss = URLEncoder.encode(bsss, "utf-8");
    return bss + bsss;
    }

有 了base string就可以签名生成oauth_signature这个参数,oauth_signature会在请求request_token的时候用到。签 名算法是HMAC-SHA1,签名的key就是最开始的consumer_secret后加一个&号,签名算法代码如下:

    public String hmacsha1(String data, String key) {
    byte[] byteHMAC = null;
    try {
    Mac mac = Mac.getInstance("HmacSHA1");
    SecretKeySpec spec = new SecretKeySpec(key.getBytes(), "HmacSHA1");
    mac.init(spec);
    byteHMAC = mac.doFinal(data.getBytes());
    } catch (InvalidKeyException e) {
    e.printStackTrace();
    } catch (NoSuchAlgorithmException ignore) {
    }
    String oauth = new BASE64Encoder().encode(byteHMAC);
    return oauth;
    }

里面用的的BASE64Encoder这个类可以Google一个。

得到oauth_signature后就要开始向 requst_token_url 发送请求了,OAuth规范定义了三种传递OAuth参数方式:

   1. httpheader中
   2. url中
   3. post form中

国内各大微博的支持情况是:新浪Httpheader可用,网易Httpheader可用,腾讯只支持在url,搜狐由于没有appkey所以还没去尝试。

如果使用Httpheader传递参数头名为“Authorization”,值为下面的格式,将值改为自己应用的。

    OAuth oauth_nonce="9zWH6qe0qG7Lc1telCn7FhUbLyVdjEaL3MO5uHxn8", oauth_signature_method="HMAC-SHA1", oauth_timestamp="1272323047", oauth_consumer_key="GDdmIQH6jhtmLUypg82g", oauth_token="8ldIZyxQeVrFZXFOZH5tAwj6vzJYuLQpl0WUEYtWc", oauth_verifier="pDNg57prOHapMbhv25RNf75lVRd6JDsni1AJJIDYoTY", oauth_signature="PUw%2FdHA4fnlJYM6RhXk5IU%2F0fCc%3D", oauth_version="1.0"

url和post form两种方式的参数名和参数值也即上面的,完全一样。

请求发送成功后就会得到的响应如下:

    oauth_token=8ldIZyxQeVrFZXFOZH5tAwj6vzJYuLQpl0WUEYtWc&oauth_token_secret=x6qpRnlEmW9JbQn4PQVVeVG8ZLPEx6A0TOebgwcuA&oauth_callback_confirmed=true

可以看到响应里面已经包含oauth_token和oauth_token_secret了。
分享到:
评论

相关推荐

    OAuth授权的Java实现详解.doc

    OAuth 授权的 Java 实现详解 OAuth 授权协议是目前最流行的身份认证标准之一,它提供了一个安全、开放、简易的标准,允许第三方应用程序访问用户资源。以下是 OAuth 授权协议的 Java 实现详解。 OAuth 授权协议的...

    新浪微博OAuth授权的Java实现.pdf

    新浪微博OAuth授权的Java实现 一、 OAuth协议简介 OAuth协议是一种广泛使用的授权协议,使用户不需要直接向第三方应用提供用户名及密码,且使一个账户在多个网站中使用成为可能。OAuth协议的细节描述可参考其官方...

    纯java实现的OAuth2流程

    通过这个纯Java实现,你可以更好地掌握OAuth2的工作原理,了解如何在没有特定框架支持的情况下构建安全的授权系统。这个实现对于学习和理解OAuth2的底层机制非常有价值,同时也可以作为自定义授权解决方案的基础。

    小米oauth2.0java实现以及第三方云接入

    本教程将详细讲解如何使用Java实现小米的OAuth2.0流程,并实现与第三方云服务的对接。 OAuth2.0的主要流程包括四个角色:资源所有者(用户)、客户端(第三方应用)、授权服务器(小米平台)和资源服务器(存储用户...

    java对微信的OAuth2.0网页授权进行访问授权

    在微信开发中,OAuth2.0网页授权是一个关键机制,...通过以上讲解,你应该能更好地理解和实施微信OAuth2.0网页授权的Java实现。在"chapter-06"文件中,可能包含了更详细的代码示例和步骤指南,建议参考学习以加深理解。

    java实现oauth2.0服务端+客户端(含JWT)

    在这个Java实现中,我们利用了MAVEN作为项目管理工具和OLTU库来构建OAuth 2.0服务端和客户端。同时,数据加密采用了MD5算法,以增强安全性。 首先,OAuth 2.0的核心概念包括四个角色:资源所有者(Resource Owner)...

    Oauth2 Java demo

    2. Java实现OAuth2: - Spring Security OAuth2:这是一个强大的库,用于在Spring应用中实现OAuth2。它提供了授权服务器、资源服务器和客户端的实现。 - Authorization Server:负责颁发授权码和访问令牌。在...

    Oauth2实现java

    Apache Oltu是Apache基金会提供的一个针对OAuth2协议的Java实现,它为开发者提供了全面的API来处理OAuth2的授权流程。Apache Oltu支持OAuth2的四种主要授权类型:授权码(Authorization Code)、隐式(Implicit)、...

    Spring Security OAuth2认证授权示例详解

    在这个示例中,我们将深入探讨如何使用Spring Security OAuth2实现OAuth2授权流程。 1. **OAuth2的角色**: - **资源所有者**:通常是应用程序的用户,他们拥有数据,决定是否允许第三方应用访问。 - **客户端**...

    Java的oauth2.0 服务端与客户端的实现(源码)

    在Java中实现OAuth 2.0,我们可以利用Spring Security OAuth2库,它提供了服务端(Authorization Server)和客户端(Resource Server)的支持。在提供的压缩包中,包含两个Maven项目,一个是`oauthserver`,代表了...

    Oauth2_淘宝授权JAVA前后端源代码demo

    在这个“Oauth2_淘宝授权JAVA前后端源代码demo”项目中,我们将深入探讨如何在Java环境中实现OAuth2与淘宝API的集成。 首先,OAuth2的核心流程包括四个主要角色:资源所有者(User)、资源服务器(Taobao API ...

    OAuth2.0 JAVA服务端和客户端功能实现(带jar包)

    总的来说,这个压缩包提供了一个完整的OAuth2.0 Java实现,包括服务端和客户端的代码,以及必要的jar依赖,对于理解和实践OAuth2.0协议,或者在Java项目中集成OAuth2.0授权功能,是非常有价值的参考资源。

    Java整合oauth项目代码实现安全认证案例

    在本项目中,我们主要探讨的是如何利用Java技术栈,特别是Spring Boot框架,与OAuth 2.0协议相结合,来构建一个安全的认证系统。OAuth 2.0是一种授权框架,广泛应用于允许第三方应用访问用户资源,而无需共享用户的...

    Spring cloud Oauth2使用授权码模式实现登录验证授权

    3. **实现授权流程**: - 用户打开客户端应用,被重定向到OAuth2服务器的授权页面。 - 用户输入用户名和密码进行登录,服务器验证成功后,显示授权界面让用户确认是否同意授权。 - 用户同意后,服务器返回一个...

    jmeter 实现oauth1.0授权认证

    总结来说,实现JMeter中的OAuth 1.0认证需要对OAuth协议有深入理解,并结合BeanShell的Java脚本能力来生成正确的签名。这虽然比直接使用支持OAuth的工具更复杂,但对于自定义测试场景或在没有其他选项的情况下,这是...

    OAuth Server和OAuth Client(JAVA实现,eclipse环境)

    资源为在eclipse开发环境中使用Java搭建OAuth Server和OAuth Client 参考代码为http://code.google.com/p/oauth/ OAuth Server为遵守OAuth 1.0协议的OAuth认证服务器 OAuth Client分为Desktop版本和Webapp版本

    完整Oauth 2.0实现实例

    - 实现授权和令牌端点,处理用户的授权请求和令牌请求。 - 配置资源服务器,确保它能够验证访问令牌并提供资源。 3. 使用说明: - 在导入数据库脚本后,你需要根据实际情况修改数据库配置,例如连接URL、用户名...

    一个OAuth授权的一个例子,实现了三种常用的授权方式

    在这个"新浪OAuth demo"中,我们可以预期它会展示如何与新浪的OAuth服务进行交互,实现上述三种授权方式。开发者通常会使用新浪提供的API接口,通过用户授权获取到相应的访问令牌,然后用这个令牌去获取用户的微博...

    Java版腾讯微博OAuth2.0授权可发文本微博示例代码

    接下来,`src`目录下的源代码文件展示了如何使用腾讯微博提供的SDK(Software Development Kit)来实现OAuth2.0授权。SDK通常包含了一系列预定义的类和方法,简化了与服务提供商的交互。开发者需要调用SDK提供的方法...

    OAuth2.0代码模拟实现

    通过上述分析,我们可以看出"OAuth2.0代码模拟实现"项目是一个涉及用户授权、令牌管理和安全性的实践项目,涵盖了OAuth2.0的整个生命周期。具体实现细节将涉及到对Spring Security OAuth2的深入理解和配置,以及如何...

Global site tag (gtag.js) - Google Analytics