package com.iailab.module.system.service.oauth2; import com.iailab.module.system.dal.dataobject.oauth2.OAuth2AccessTokenDO; import java.util.List; /** * OAuth2 授予 Service 接口 * * 从功能上,和 Spring Security OAuth 的 TokenGranter 的功能,提供访问令牌、刷新令牌的操作 * * 将自身的 AdminUser 用户,授权给第三方应用,采用 OAuth2.0 的协议。 * * 问题:为什么自身也作为一个第三方应用,也走这套流程呢? * 回复:当然可以这么做,采用 password 模式。考虑到大多数开发者使用不到这个特性,OAuth2.0 毕竟有一定学习成本,所以暂时没有采取这种方式。 * * @author iailab */ public interface OAuth2GrantService { /** * 简化模式 * * 对应 Spring Security OAuth2 的 ImplicitTokenGranter 功能 * * @param userId 用户编号 * @param userType 用户类型 * @param clientId 客户端编号 * @param scopes 授权范围 * @return 访问令牌 */ OAuth2AccessTokenDO grantImplicit(Long userId, Integer userType, String clientId, List scopes); /** * 授权码模式,第一阶段,获得 code 授权码 * * 对应 Spring Security OAuth2 的 AuthorizationEndpoint 的 generateCode 方法 * * @param userId 用户编号 * @param userType 用户类型 * @param clientId 客户端编号 * @param scopes 授权范围 * @param redirectUri 重定向 URI * @param state 状态 * @return 授权码 */ String grantAuthorizationCodeForCode(Long userId, Integer userType, String clientId, List scopes, String redirectUri, String state); /** * 授权码模式,第二阶段,获得 accessToken 访问令牌 * * 对应 Spring Security OAuth2 的 AuthorizationCodeTokenGranter 功能 * * @param clientId 客户端编号 * @param code 授权码 * @param redirectUri 重定向 URI * @param state 状态 * @return 访问令牌 */ OAuth2AccessTokenDO grantAuthorizationCodeForAccessToken(String clientId, String code, String redirectUri, String state); /** * 密码模式 * * 对应 Spring Security OAuth2 的 ResourceOwnerPasswordTokenGranter 功能 * * @param username 账号 * @param password 密码 * @param clientId 客户端编号 * @param scopes 授权范围 * @return 访问令牌 */ OAuth2AccessTokenDO grantPassword(String username, String password, String clientId, List scopes); /** * 刷新模式 * * 对应 Spring Security OAuth2 的 ResourceOwnerPasswordTokenGranter 功能 * * @param refreshToken 刷新令牌 * @param clientId 客户端编号 * @return 访问令牌 */ OAuth2AccessTokenDO grantRefreshToken(String refreshToken, String clientId); /** * 客户端模式 * * 对应 Spring Security OAuth2 的 ClientCredentialsTokenGranter 功能 * * @param clientId 客户端编号 * @param scopes 授权范围 * @return 访问令牌 */ OAuth2AccessTokenDO grantClientCredentials(String clientId, List scopes); /** * 移除访问令牌 * * 对应 Spring Security OAuth2 的 ConsumerTokenServices 的 revokeToken 方法 * * @param accessToken 访问令牌 * @param clientId 客户端编号 * @return 是否移除到 */ boolean revokeToken(String clientId, String accessToken); }