演示涉及角色说明:
演示步骤整体说明:
张三登录念头的首页
点击第三方登录(即:OAuth2授权服务器登录)
注:张三也是这个第三方的用户
OAuth2授权服务弹出oauth2的用户登录界面
张三使用账密完成OAuth2授权服务器登录
张三登录成功后,OAuth2授权服务弹出(念头发起的)授权申请页
张三点击授权通过
OAuth2授权服务通过配置好的回调地址,回调至念头的首页接口,传递授权码
念头首页接口成功接收到授权码
------------------------------- 念头获取oauth2的授权码结束 -------------------------------
念头接收到授权码后,马上调用OAuth2授权服务器的获取token接口
注:发起这个调用时,参数除了携带授权码,还会携带client_id、client_secret、redirect_uri等
OAuth2授权服务器通过授权码及client_id、client_secret等完成认证,并回调念头的redirect_uri地址,返回access_token等信息
念头拿到access_token
------------------------------- 念头获取oauth2的access_token结束 -------------------------------
念头拿到access_token后,马上调用OAuth2资源服务器的获取用户资源
OAuth2资源服务器接收到念头传过来的access_token后,调用OAuth2授权服务器,完成token核对,并获取到相关权限信息
OAuth2资源服务器根据权限信息,完成鉴权,通过鉴权后,返回资源数据给念头
念头拿到OAuth2的资源
------------------------------- 念头获取oauth2的资源信息结束 -------------------------------
admin张三
user李四
演示步骤整体说明:
- 张三登录念头的首页
- 念头弹出输入框,让张三输入oauth2授权服务器的账号密码
- ------------------------------- 念头获取用户在oauth2账号密码 -------------------------------
- 念头拿到张三在oauth2授权服务器的账号密码,然后结合oauth2授权服务器分给自己的client_id等数据,调用oauth2授权服务器,获取到access_token等数据
- OAuth2授权服务器通过用户的账号密码及念头的client_id、client_secret等完成认证,并返回access_token等信息
- 念头拿到access_token
- ------------------------------- 念头获取oauth2的access_token结束 -------------------------------
- 念头拿到access_token后,马上调用OAuth2资源服务器的获取用户资源
- OAuth2资源服务器接收到念头传过来的access_token后,调用OAuth2授权服务器,完成token核对,并获取到相关权限信息
- OAuth2资源服务器根据权限信息,完成鉴权,通过鉴权后,返回资源数据给念头
- 念头拿到OAuth2的资源
- ------------------------------- 念头获取oauth2的资源信息结束 -------------------------------
演示步骤整体说明:
提示:客户端模式不涉及oauth2用户
- 念头以oauth2授权服务器分给自己的client_id、client_secret等数据,调用oauth2授权服务器,获取到access_token等数据
- ------------------------------- 念头获取oauth2的access_token结束 -------------------------------
- 念头拿到access_token后,马上调用OAuth2资源服务器的获取用户资源
- OAuth2资源服务器接收到念头传过来的access_token后,调用OAuth2授权服务器,完成token核对,并获取到相关权限信息
- OAuth2资源服务器根据权限信息,完成鉴权,通过鉴权后,返回资源数据给念头
- 念头拿到OAuth2的资源
- ------------------------------- 念头获取oauth2的资源信息结束 -------------------------------
演示步骤整体说明:
张三进入念头的首页
点击第三方登录(即:OAuth2授权服务器登录)
注:张三也是这个第三方的用户
OAuth2授权服务弹出oauth2的用户登录界面
张三使用账密完成OAuth2授权服务器登录
张三登录成功后,OAuth2授权服务弹出(念头发起的)授权申请页
张三点击授权通过
OAuth2授权服务通过配置好的回调地址,回调至念头的前段页面,以uri后面的fragment的形式船体access_token等信息给念头
注:oauth2授权服务器回调念头的地址形如:
http:niantou/index#access_token=0aacde9c-7204-4b3a-b9b8-567b82d66aea&token_type=bearer&expires_in=19
,其中#access_token=0aacde9c-7204-4b3a-b9b8-567b82d66aea&token_type=bearer&expires_in=19
即为fragment念头页面成功接收到access_token等信息
注:uri中的fragment信息一般是不会传递到后端的,所以后续处理流程仍然在前端进行
------------------------------- 念头获取oauth2的access_token结束 -------------------------------
念头拿到access_token后,马上调用OAuth2资源服务器的获取用户资源
OAuth2资源服务器接收到念头传过来的access_token后,调用OAuth2授权服务器,完成token核对,并获取到相关权限信息
OAuth2资源服务器根据权限信息,完成鉴权,通过鉴权后,返回资源数据给念头
念头拿到OAuth2的资源
------------------------------- 念头获取oauth2的资源信息结束 -------------------------------
注:上面的演示图的最后面,有个弹窗,那个是本人专门alert了一下fragment,来观察oauth2授权服务器回调回来传的是啥数据的
提示:未罗列不重要的项
├─app-niantou ################################### 念头应用
│ └─src
│ └─main
│ ├─java
│ │ └─com
│ │ └─ideaaedi
│ │ └─niantou
│ │ └─controller
│ │ AuthorizationCodeTestController.java # 测试授权码授权模式
│ │ ClientTestController.java # 测试客户端授权模式
│ │ ImplicitTestController.java # 测试简要授权模式
│ │ PasswordTestController.java # 测试账密授权模式
│ │
│ └─resources
│ └─templates
│ authorizationCode-index-all.html
│ authorizationCode-index-read.html
│ authorizationCode-index-write.html
│ client-index.html
│ implicit-index.html
│ password-index.html
│
├─auth-server ################################### oauth2授权服务
│ └─src
│ └─main
│ ├─java
│ │ └─com
│ │ └─ideaaedi
│ │ └─auth_server
│ │ └─conifg
│ │ OAuth2AuthServerConfig.java # oauth2授权服务核心配置
│ │ OAuth2AuthServerExceptionHandler.java # oauth2授权异常处理器
│ │ SpringSecurityConfig.java # spring security的配置
│ │
│ └─resources
│ │
│ │ application.yml # oauth2授权 用的reids存储的token,用的db存储的客户授权详情, 需要在这里面进行相关配置
│ │
│ └─sql
│ auth_server_db.sql # 相关的sql
│
└─resource-server ################################### oauth2资源服务
└─src
└─main
├─java
└─com
└─ideaaedi
└─resource_server
├─conifg
│ OAuth2ResourceServerConfig.java # oauth2资源服务核心配置
│ SpringSecurityConfig.java # spring security的配置
│
└─controller
ResourceController.java # oauth2资源服务的资源(演示示例中,念头就是要获取这个)
提示此sql也在auth-server的resource/sql目录下
DROP TABLE IF EXISTS `oauth_client_details`;
CREATE TABLE `oauth_client_details` (
`client_id` varchar(48) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '客户id',
`resource_ids` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '客户可访问的资源id,多个使用逗号分割\r\n注:不涉及其它资源的访问的话,可不填',
`client_secret` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '客户秘钥\r\n注:须填写对应的密文,加密方式取决于oauth2认证服务器的加密器\r\n注:implicit授权模式可不填,其余授权模式必填',
`scope` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '授权范围',
`authorized_grant_types` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '授权类型,多个使用逗号分割\r\n(client_credentials - 客户端模式授权;password-账密模式授权;authorization_code - 授权码模式授权;implicit - 简要模式授权)\r\n注:需要同时再加一个refresh_token授权类型以支持刷新token, implicit模式、client_credentials模式可不加',
`web_server_redirect_uri` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT 'web回调地址(授权类型含authorization_code或implicit时,必填)',
`authorities` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '权限,多个使用逗号分割',
`access_token_validity` int(11) NULL DEFAULT NULL COMMENT 'access_token失效时长(单位s)',
`refresh_token_validity` int(11) NULL DEFAULT NULL COMMENT 'refresh_token失效时长(单位s)',
`additional_information` varchar(4096) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '附加信息(若设置值,必须是json格式)',
`autoapprove` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
PRIMARY KEY (`client_id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = DYNAMIC;
demo代码下载