要实现OAuth服务端,就得先理解客户端的调用流程,服务提供商实现可能也有些区别,实现OAuth服务端的方式很多,具体可能看 http://oauth.net/code/

各语言的实现有(我使用了Apache Oltu):

  • Java

    • Apache Oltu
    • Spring Security for OAuth
    • Apis Authorization Server (v2-31)
    • Restlet Framework (draft 30)
    • Apache CXF
  • NodeJS
    • NodeJS OAuth 2.0 Provider
    • Mozilla Firefox Accounts. A full stack Identy Provider system developed to support Firefox market place and other services
  • Ruby
    • Ruby OAuth2 Server (draft 18)
  • .NET
    • .NET DotNetOpenAuth
    • Thinktecture IdentityServer

实现主要涉及参数配置如下:
授权码设置(code)
第三方通过code进行获取 access_token的时候需要用到,code的超时时间为10分钟,一个code只能成功换取一次access_token即失效。
授权作用域(scope)
作用域代表用户授权给第三方的接口权限,第三方应用需要向服务端申请使用相应scope的权限后,经过用户授权,获取到相应access_token后方可对接口进行调用。
令牌有效期(access_token)
access_token是调用授权关系接口的调用凭证,由于access_token有效期(目前为2个小时)较短,当access_token超时后,可以使用refresh_token进行刷新,access_token刷新结果有两种:
    1. 若access_token已超时,那么进行refresh_token会获取一个新的access_token,新的超时时间;
    2. 若access_token未超时,那么进行refresh_token不会改变access_token,但超时时间会刷新,相当于续期access_token。
refresh_token拥有较长的有效期(30天),当refresh_token失效的后,需要用户重新授权。

项目介绍

项目结构如下:
AuthzController:获取授权码
TokenController:获得令牌
ResourceController:资源服务
ClientController:客户端

基础代码放到github:https://github.com/zhouyongtao/homeinns-web

确保项目8080端口运行,可以手动调试

获得授权码
http://localhost:8080/oauth2/authorize?client_id=fbed1d1b4b1449daa4bc49397cbe2350&response_type=code&redirect_uri=http://localhost:8080/oauth_callback
获得令牌(POST)
http://localhost:8080/oauth2/access_token?client_id=fbed1d1b4b1449daa4bc49397cbe2350&client_secret=fbed1d1b4b1449daa4bc49397cbe2350&grant_type=authorization_code&redirect_uri=http://localhost:8080/oauth_callback&code={code}

客户端

也可以使用如下客户端测试代码,访问 http://localhost:8080/client 测试

/*** Created by Irving on 2014/11/24.* OAuth2 客户端实现*/
@Controller
@RequestMapping("/client")
public class ClientController {private static Logger logger = LoggerFactory.getLogger(ClientController.class);/*response_type:表示授权类型,必选项,此处的值固定为"code"client_id:表示客户端的ID,必选项redirect_uri:表示重定向URI,可选项scope:表示申请的权限范围,可选项state:表示客户端的当前状态,可以指定任意值,认证服务器会原封不动地返回这个值*//*** 获得授权码* @return*/@RequestMapping(method = RequestMethod.GET)public String client() {try {OAuthClientRequest oauthResponse = OAuthClientRequest.authorizationLocation(ConstantKey.OAUTH_CLIENT_AUTHORIZE).setResponseType(OAuth.OAUTH_CODE).setClientId(ConstantKey.OAUTH_CLIENT_ID).setRedirectURI(ConstantKey.OAUTH_CLIENT_CALLBACK).setScope(ConstantKey.OAUTH_CLIENT_SCOPE).buildQueryMessage();return "redirect:"+oauthResponse.getLocationUri();} catch (OAuthSystemException e) {e.printStackTrace();}return "redirect:/home";}/*grant_type:表示使用的授权模式,必选项,此处的值固定为"authorization_code"code:表示上一步获得的授权码,必选项。redirect_uri:表示重定向URI,必选项,且必须与A步骤中的该参数值保持一致client_id:表示客户端ID,必选项*//*** 获得令牌* @return oauth_callback?code=1234*/@RequestMapping(value = "/oauth_callback" ,method = RequestMethod.GET)public String getToken(HttpServletRequest request,Model model) throws OAuthProblemException {OAuthAuthzResponse oauthAuthzResponse = null;try {oauthAuthzResponse = OAuthAuthzResponse.oauthCodeAuthzResponse(request);String code = oauthAuthzResponse.getCode();OAuthClientRequest oauthClientRequest = OAuthClientRequest.tokenLocation(ConstantKey.OAUTH_CLIENT_ACCESS_TOKEN).setGrantType(GrantType.AUTHORIZATION_CODE).setClientId(ConstantKey.OAUTH_CLIENT_ID).setClientSecret(ConstantKey.OAUTH_CLIENT_SECRET).setRedirectURI(ConstantKey.OAUTH_CLIENT_CALLBACK).setCode(code).buildQueryMessage();OAuthClient oAuthClient = new OAuthClient(new URLConnectionClient());//Facebook is not fully compatible with OAuth 2.0 draft 10, access token response is//application/x-www-form-urlencoded, not json encoded so we use dedicated response class for that//Custom response classes are an easy way to deal with oauth providers that introduce modifications to//OAuth 2.0 specification//获取access tokenOAuthJSONAccessTokenResponse oAuthResponse = oAuthClient.accessToken(oauthClientRequest, OAuth.HttpMethod.POST);String accessToken = oAuthResponse.getAccessToken();String refreshToken= oAuthResponse.getRefreshToken();Long expiresIn = oAuthResponse.getExpiresIn();//获得资源服务OAuthClientRequest bearerClientRequest = new OAuthBearerClientRequest(ConstantKey.OAUTH_CLIENT_GET_RESOURCE).setAccessToken(accessToken).buildQueryMessage();OAuthResourceResponse resourceResponse = oAuthClient.resource(bearerClientRequest, OAuth.HttpMethod.GET, OAuthResourceResponse.class);String resBody = resourceResponse.getBody();logger.info("accessToken: "+accessToken +" refreshToken: "+refreshToken +" expiresIn: "+expiresIn +" resBody: "+resBody);model.addAttribute("accessToken",  "accessToken: "+accessToken + " resBody: "+resBody);return "oauth2/token";} catch (OAuthSystemException ex) {logger.error("getToken OAuthSystemException : " + ex.getMessage());model.addAttribute("errorMsg",  ex.getMessage());return  "/oauth2/error";}}
}

Refer:
https://cwiki.apache.org/confluence/display/OLTU/Index
https://open.weixin.qq.com/cgi-bin/readtemplate?t=resource/app_wx_login_tmpl&lang=zh_CN#faq

转载于:https://www.cnblogs.com/Irving/p/4134752.html

Apache Oltu 实现 OAuth2.0 服务端【授权码模式(Authorization Code)】相关推荐

  1. Spring Security OAuth2 授权码模式 (Authorization Code)

    前言 Spring Security OAuth2 授权码模式 (Authorization Code) 应该是授权登录的一个行业标准 整体流程 首先在平台注册获取CLIENT_ID和CLIENT_S ...

  2. 前后端分离Oauth2.0 - springsecurity + spring-authorization-server —授权码模式

    序言 对于目前有很多的公司在对旧的web工程做重构,拆分服务,使用前端vue,后端springboot微服务,重构的要点之一是认证授权框架的选型. 对于原有的 spring-security-oaut ...

  3. php对接AliGenie天猫精灵服务器控制智能硬件esp8266② 全面认识第三方授权机制 oauth2.0 协议,如何在 php 上搭建 oauth2.0服务端!(附带demo)

    本系列博客学习由非官方人员 半颗心脏 潜心所力所写,仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 1. php对接AliGenie天猫精灵服务器控制智能硬件esp82 ...

  4. OAuth2.0协议(一) - 授权码许可流程

    OAuth2.0是什么可以拿来做什么,它只认真的做了一件事授权(Authorization).OAuth2.0是 Open Authorization 2.0的简称,既然是2.0那前面肯定有个1.0. ...

  5. Oauth2系列2:授权码模式

    目录 传送门 再次重申oauth2的定义 定义 作用 标准授权码流程 4个参与角色 资源拥有者 客户端 授权服务 受保护资源 授权码流程 引导授权 获取code 用授权码code换取令牌token 返 ...

  6. 基于Apache OLTU的OAuth2.0授权解决方案

    Apache OLTU实现了OAuth 2.0的规范,是一种可靠的Java授权解决方案.但是,官方文档实在是太惨不忍睹了.本文参考了开涛的OAuth 2.0集成Shiro文章.模拟了OAuth2.0的 ...

  7. java的oauth2.0_[转]Java的oauth2.0 服务端与客户端的实现

    oauth原理简述 oauth本身不是技术,而是一项资源授权协议,重点是协议!Apache基金会提供了针对Java的oauth封装.我们做Java web项目想要实现oauth协议进行资源授权访问,直 ...

  8. Java的oauth2.0 服务端与客户端的实现

    oauth原理简述 oauth本身不是技术,而是一项资源授权协议,重点是协议!Apache基金会提供了针对Java的oauth封装.我们做Java web项目想要实现oauth协议进行资源授权访问,直 ...

  9. OAuth2.0认证服务器之授权码存放

    第一种方式:采用"内存"存取授权码,即我们在认证服务器的配置类(AuthorizationServerConfigurerAdapter的继承类)中做下述修改: import or ...

最新文章

  1. 2022-2028年中国激光脱毛仪行业市场研究及前瞻分析报告
  2. c++ dll继续使用然后强制删除dll文件_Windows 10系统安全风险,近300个系统执行文件容易遭受劫持攻击...
  3. 这条路有多长,有多难 | 专访OnVideo创始人余世兵刘歧
  4. 前端学习(3230):React中的非受控组件
  5. C#LeetCode刷题-极小化极大
  6. 微信小程序:计算器(附源码)
  7. 21 个人所得税计算
  8. ubantu 安装jekins
  9. mybatis中显示Type interface com.javacto.dao.UserMapper is not known to the MapperRegistry.
  10. 侧脸生成正脸概论与精析(一)Global and Local Perception GAN
  11. 【ZJOI2007】【BZOJ1059】矩阵游戏
  12. Mac录屏想只要电脑内置的声音
  13. AD中的机械尺寸定位的使用
  14. 函数式编程-Stream流(来源三更草堂)
  15. MySQL引擎之Memory
  16. 赵长鹏回复协助洗钱质疑; 欧洲通过区块链监管
  17. RabbitMQ的简单使用
  18. Excel 2016新增图表攻略
  19. Python学习笔记——Python和基础知识
  20. Tosca:定义元宇宙世界的时尚生活方式

热门文章

  1. [4月21日]《51CTO 编辑部的外传》——剧本篇(上)
  2. Android 开发入门学习
  3. 注册表故障恢复 必须使用记录或另一备份以恢复包含系统注册表数据的文件。恢复成功...
  4. CFile类打开文件的有趣现象
  5. 【笔记】Linux就该这么学-第六课第四章
  6. Angular19 自定义表单控件
  7. macOS10.12部署sonarqube5.6.3
  8. 20155117 王震宇 2006-2007-2 《Java程序设计》第三周学习总结
  9. js 禁止复制粘贴全选
  10. C#(Net)软件开发常用工具汇总,提高你的开发效率