sa-token/sa-token-doc/oauth2/oauth2-dev.md

223 lines
6.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Sa-Token-OAuth2 Server端 二次开发用到的所有函数说明
官方示例只提供了基本的授权流程,以及 userinfo 资源的开放,如果您需要开放更多的接口,则二次开发时可能用到以下相关 API 方法
---
### Client 信息相关
``` java
// 获取 ClientModel根据 clientId
SaOAuth2Util.getClientModel(clientId);
// 校验 clientId 信息并返回 ClientModel如果找不到对应 Client 信息则抛出异常
SaOAuth2Util.checkClientModel(clientId);
// 校验clientId 与 clientSecret 是否正确
SaOAuth2Util.checkClientSecret(clientId, clientSecret);
// 校验clientId 与 clientSecret 是否正确,并且是否签约了指定 scopes
SaOAuth2Util.checkClientSecretAndScope(clientId, clientSecret, scopes);
// 判断:该 Client 是否签约了指定的 Scope返回 true 或 false
SaOAuth2Util.isContractScope(clientId, scopes);
// 校验:该 Client 是否签约了指定的 Scope如果没有则抛出异常
SaOAuth2Util.checkContractScope(clientId, scopes);
// 校验:该 Client 是否签约了指定的 Scope如果没有则抛出异常
SaOAuth2Util.checkContractScope(clientModel, scopes);
// 校验:该 Client 使用指定 url 作为回调地址,是否合法
SaOAuth2Util.checkRedirectUri(clientId, url);
// 判断:指定 loginId 是否对一个 Client 授权给了指定 Scope
SaOAuth2Util.isGrantScope(loginId, clientId, scopes);
// 删除:指定 loginId 针对指定 Client 的授权信息
SaOAuth2Util.deleteGrantScope(loginId, clientId);
```
### Code 相关
``` java
// 获取 CodeModel无效的 code 会返回 null
SaOAuth2Util.getCode(code);
// 校验 Code成功返回 CodeModel失败则抛出异常
SaOAuth2Util.checkCode(code);
// 获取 Code根据索引 clientId、loginId
SaOAuth2Util.getCodeValue(clientId, loginId);
```
### Access-Token 相关
``` java
// 获取 AccessTokenModel无效的 AccessToken 会返回 null
SaOAuth2Util.getAccessToken(accessToken);
// 校验 Access-Token成功返回 AccessTokenModel失败则抛出异常
SaOAuth2Util.checkAccessToken(accessToken);
// 获取 Access-Token 列表:此应用下 对 某个用户 签发的所有 Access-token
SaOAuth2Util.getAccessTokenValueList(clientId, loginId);
// 判断:指定 Access-Token 是否具有指定 Scope 列表,返回 true 或 false
SaOAuth2Util.hasAccessTokenScope(accessToken, ...scopes);
// 校验:指定 Access-Token 是否具有指定 Scope 列表,如果不具备则抛出异常
SaOAuth2Util.checkAccessTokenScope(accessToken, ...scopes);
// 获取 Access-Token 所代表的LoginId
SaOAuth2Util.getLoginIdByAccessToken(accessToken);
// 获取 Access-Token 所代表的 clientId
SaOAuth2Util.getClientIdByAccessToken(accessToken);
// 回收一个 Access-Token
SaOAuth2Util.revokeAccessToken(accessToken);
// 回收全部 Access-Token指定应用下 指定用户 的全部 Access-Token
SaOAuth2Util.revokeAccessTokenByIndex(clientId, loginId);
```
### Refresh-Token 相关
``` java
// 获取 RefreshTokenModel无效的 RefreshToken 会返回 null
SaOAuth2Util.getRefreshToken(refreshToken);
// 校验 Refresh-Token成功返回 RefreshTokenModel失败则抛出异常
SaOAuth2Util.checkRefreshToken(refreshToken);
// 获取 Refresh-Token 列表:此应用下 对 某个用户 签发的所有 Refresh-Token
SaOAuth2Util.getRefreshTokenValueList(clientId, loginId);
// 回收一个 Refresh-Token
SaOAuth2Util.revokeRefreshToken(refreshToken);
// 回收全部 Refresh-Token指定应用下 指定用户 的全部 Refresh-Token
SaOAuth2Util.revokeRefreshTokenByIndex(clientId, loginId);
// 根据 RefreshToken 刷新出一个 AccessToken
SaOAuth2Util.refreshAccessToken(refreshToken);
```
### Client-Token 相关
``` java
// 获取 ClientTokenModel无效的 ClientToken 会返回 null
SaOAuth2Util.getClientToken(clientToken);
// 校验 Client-Token成功返回 ClientTokenModel失败则抛出异常
SaOAuth2Util.checkClientToken(clientToken);
// 获取 Client-Token 列表:此应用下 对 某个用户 签发的所有 Client-token
SaOAuth2Util.getClientTokenValueList(clientId);
// 判断:指定 Client-Token 是否具有指定 Scope 列表,返回 true 或 false
SaOAuth2Util.hasClientTokenScope(clientToken, ...scopes);
// 校验:指定 Client-Token 是否具有指定 Scope 列表,如果不具备则抛出异常
SaOAuth2Util.checkClientTokenScope(clientToken, ...scopes);
// 回收一个 ClientToken
SaOAuth2Util.revokeClientToken(clientToken);
// 回收全部 Client-Token指定应用下的全部 Client-Token
SaOAuth2Util.revokeClientTokenByIndex(clientId);
```
详情请参考源码:[码云SaOAuth2Util.java](https://gitee.com/dromara/sa-token/blob/master/sa-token-plugin/sa-token-oauth2/src/main/java/cn/dev33/satoken/oauth2/template/SaOAuth2Util.java)
### OAuth2-Server 所有可重写策略
#### 权限处理器
``` java
// 根据 scope 信息对一个 AccessTokenModel 进行加工处理
SaOAuth2Strategy.instance.workAccessTokenByScope = at -> {
// ...
}
// 当使用 RefreshToken 刷新 AccessToken 时,根据 scope 信息对一个 AccessTokenModel 进行加工处理
SaOAuth2Strategy.instance.refreshAccessTokenWorkByScope = at -> {
// ...
}
// 根据 scope 信息对一个 ClientTokenModel 进行加工处理
SaOAuth2Strategy.instance.workClientTokenByScope = at -> {
// ...
}
```
#### grant_type 处理器
``` java
// 根据 grantType 构造一个 AccessTokenModel
SaOAuth2Strategy.instance.grantTypeAuth = req -> {
// ...
}
```
#### 凭证创建
``` java
// 创建一个 code value
SaOAuth2Strategy.instance.createCodeValue = (clientId, loginId, scopes) -> {
// ...
}
// 创建一个 AccessToken value
SaOAuth2Strategy.instance.createAccessToken = (clientId, loginId, scopes) -> {
// ...
}
// 创建一个 RefreshToken value
SaOAuth2Strategy.instance.createRefreshToken = (clientId, loginId, scopes) -> {
// ...
}
// 创建一个 ClientToken value
SaOAuth2Strategy.instance.createClientToken = (clientId, scopes) -> {
// ...
}
```
#### 认证流程回调
``` java
// OAuth-Server端未登录时返回的View
SaOAuth2Strategy.instance.notLoginView = () -> {
// ...
}
// OAuth-Server端确认授权时返回的View
SaOAuth2Strategy.instance.confirmView = (clientId, scopes) -> {
// ...
}
// OAuth-Server端登录函数
SaOAuth2Strategy.instance.doLoginHandle = (name, pwd) -> {
// ...
}
// OAuth-Server端用户在授权指定 client 前的检查,如果检查不通过,请直接抛出异常
SaOAuth2Strategy.instance.userAuthorizeClientCheck = (loginId, clientId) -> {
// ...
}
```
#### 其它
``` java
// 在创建 SaClientModel 时,设置其默认字段
SaOAuth2Strategy.instance.setSaClientModelDefaultFields = (clientModel) -> {
// ...
}
```