文档章节

OAuth2.0协议原理与实现:协议实现

zhenchao
 zhenchao
发布于 2017/03/19 01:03
字数 819
阅读 743
收藏 2

OAuth2.0协议原理与实现系列


  最初计划在这一篇详细讲解OAuth2.0协议的java实现,提笔写了一段之后突然觉得对于开发人员来说,最好的学习方式还是看源码,所以也就放弃了继续写下去的念头,大家如果对于该协议的具体实现感兴趣,或者有相应的开发需求,可以clone下来研究一下。

项目地址:[https://github.com/procyon-lotor/x-oauth)

本项目为RFC6749协议的标准实现,主要用于对该协议的学习和理解,也可以在本项目基础上结合自己的业务场景做相应的改造,用于生产环境授权。

项目采用java语言开发,基于 Spring MVCSpring, 以及 MyBatis 框架,开发和运行环境如下:

  • 数据库: MySQL 5.7
  • jdk版本: 1.8

  本项目主要实现了RFC6749定义的授权码授权模式和隐式授权模式,并参考文档“HTTP Authentication: MAC Authentication”实现了MAC类型的令牌。由于token的验证,以及OpenID的生成已经超出了OAuth2.0协议的范畴,本项目未作相应实现,token属于对称加密字符串,所以内部元素可以自行定义和验证,你可以采用AOP或注解的方式来实现token验证的逻辑,而OpenID只需要保证在(user_id, client_id)维度唯一即可。

运行与测试

项目相关表结构定义以及测试数据均放在sqls目录下。

注意: 实际应用中请强制开启HTTPS!

1. 授权码模式

  • 请求获取授权码
http://localhost:8080/oauth/authorize/code?response_type=code&client_id=2882303761517520186&redirect_uri=http://www.zhenchao.com&scope=1%204&state=emhlbmNoYW8gcGFzc3BvcnQgb2F1dGg=

响应示例:

HTTP/1.1 302 Found
Location: http://www.zhenchao.com/?code=E670AC74F54CACC6222ADFFBEE51CADB&state=emhlbmNoYW8gcGFzc3BvcnQgb2F1dGg%3D
  • 请求下发访问令牌
http://localhost:8080/oauth/authorize/token?grant_type=authorization_code&client_id=2882303761517520186&redirect_uri=http://www.zhenchao.com&code={your code here}

响应示例:

{
    "access_token": "AAAAHGU4Y0Mrd1I2T3VhOHlRak9walY2T3hHSjM2VT0xLjAuMAAtAAAAAFlD/+YAAAFa4iNFYQAAAAAAAYagKAAAAAAGJToAAAAHMSAyIDQgNQAAAANtYWM=",
    "expires_in": 1497628646,
    "refresh_token": "refresh token",
    "mac_key": "LJ2H7DxyKBGsJlGBryRsVzNKCzpF57owjeOf7CxMJUFegWO7YlLi24M0sDRfvooq",
    "mac_algorithm": "hmac-sha-1"
}

2. 隐式授权模式

  • 请求下发访问令牌
http://localhost:8080/oauth/implicit/token?response_type=token&client_id=2882303761517520186&redirect_uri=http://www.zhenchao.com&scope=1%204&state=emhlbmNoYW8gcGFzc3BvcnQgb2F1dGg=

响应示例:

HTTP/1.1 302 Found
Location: http://www.zhenchao.com#access_token=AAAAHFM5T1ZCZG5hL0RBeTlRekJCSjlWYUduUHpaMD0xLjAuMAAtAAAAAFlEADEAAAFa4iRncwAAAAAAAYagKAAAAAAGJToAAAAHMSAyIDQgNQAAAANtYWM=&token_type=mac&mac_key=fRgEdJsq6rR8TuH84mXkTZzAv0q6KyvQz7BVkkHYyln5FOVccPp4Cz4VuDcz9cfr&mac_algorithm=hmac-sha-1&expires_in=1497628721&scope=1+2+4+5

参考文献

  1. RFC5849 - The OAuth 1.0 Protocol
  2. RFC6749 - The OAuth 2.0 Authorization Framework
  3. RFC6750 - The OAuth 2.0 Authorization Framework: Bearer Token Usage
  4. HTTP Authentication: MAC Authentication (draft-hammer-oauth-v2-mac-token-02)

如有任何疑问,请发邮件到 zhenchao.wang@hotmail.com 咨询,最后打个小广告:

小米开放平台是小米公司面向生态链企业和第三方应用推出的开放服务平台,笔者所负责的账号接入服务是小米开放平台的核心业务之一,旨在通过小米海量用户,为生态链企业以及第三方应用开发者提供方便、快捷的授权登录服务,提升您的应用在MIUI平台(手机、电视、平板、电脑、路由器...)上的用户体验。小米账号开放服务基于OAuth2.0协议授权,每天承载约10亿次的授权调用,以多个IDC服务于全球用户,我们稳定、可靠,期待您的接入!

© 著作权归作者所有

zhenchao
粉丝 111
博文 28
码字总数 98844
作品 0
海淀
高级程序员
私信 提问
Apache Oltu

Apache Oltu是OAuth协议的Java语言实现。 当前开放平台大行其道,其中的授权安全问题如何处理?oauth2.0协议是当今互联网时代用户授权和认证的标准,很好的解决了这一问题。apache孵化项目a...

wangqi1978
2013/07/18
7.7K
0
基于Spring Security OAuth2.0实现单点登录SSO

1. 概述 本文简要总结一下如果使用Spring Security OAuth和Spring Boot来实现SSO,文末有样例代码。不了解OAuth2.0协议的同学请参考《OAuth2.0协议原理详解》 整个工程包括三个独立的应用,一...

半夜菊花茶
2017/11/16
0
0
如何在移动端开发中正确地使用OAuth协议:常见错误剖析

作者在之前的文章中曾经介绍过 OAuth2.0 协议,并将其与OpenID和SAML性对比。然而,在理论上设计协议是一回事,在工程中实现协议是另一回事,由于很多开发人员没有真正理解OAuth2.0的设计意图...

登高且赋
2017/12/22
0
0
OAuth2.0认证流程是如何实现的?

导读 大家也许都有过这样的体验,我们登录一些不是特别常用的软件或网站的时候可以使用QQ、微信或者微博等账号进行授权登陆。例如我们登陆豆瓣网的时候,如果不想单独注册豆瓣网账号的话,就...

无敌码农
05/06
0
0
oauth2.0的java参考实现--Apache Amber

当前开放平台大行其道,其中的授权安全问题如何处理?oauth2.0协议是当今互联网时代用户授权和认证的标准,很好的解决了这一问题。apache孵化项目amber作为oauth2.0的java参考实现与自有平台...

匿名
2012/06/25
12.6K
1

没有更多内容

加载失败,请刷新页面

加载更多

BootStrap

一、BootStrap 简洁、直观、强悍的前端开发框架,让web开发更加迅速、简单 中文镜像网站:http://www.bootcss.com 用于开发响应式布局、移动设备优先的WEB项目 1、使用boot 创建文件夹,在文...

wytao1995
25分钟前
5
0
小知识:讲述Linux命令别名与资源文件的区别

别名 别名是命令的快捷方式。为那些需要经常执行,但需要很长时间输入的长命令创建快捷方式很有用。语法是: alias ppp='ping www.baidu.com' 它们并不总是用来缩短长命令。重要的是,你将它...

老孟的Linux私房菜
今天
4
0
《JAVA核心知识》学习笔记(6. Spring 原理)-5

它是一个全面的、企业应用开发一站式的解决方案,贯穿表现层、业务层、持久层。但是 Spring 仍然可以和其他的框架无缝整合。 6.1.1. Spring 特点 6.1.1.1. 轻量级 6.1.1.2. 控制反转 6.1.1....

Shingfi
今天
6
0
Excel导入数据库数据+Excel导入网页数据【实时追踪】

1.Excel导入数据库数据:数据选项卡------>导入数据 2.Excel导入网页数据【实时追踪】:

东方墨天
今天
6
1
正则表达式如何匹配一个单词存在一次或零次并且不占捕获组位置

正则表达式如何匹配一个单词存在一次或零次并且不占捕获组位置 今天要用正则表达式实现匹配一个词出现一次或者不出现的情况,但是又不仅仅是这么简单的需求。先详细说下我这种情况吧,也许有...

Airship
今天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部