shengzhaoli.shengz
1 year ago
3 changed files with 355 additions and 3 deletions
@ -0,0 +1,352 @@
|
||||
<!DOCTYPE html> |
||||
<html lang="en" xmlns:th="http://www.thymeleaf.org"> |
||||
<head> |
||||
<meta charset="utf-8"/> |
||||
<meta name="viewport" content="width=device-width,user-scalable=no"/> |
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/> |
||||
<link rel="shortcut icon" href="../../static/favicon.ico" th:href="@{/favicon.ico}"/> |
||||
|
||||
<title>注册client - Spring Security&OAuth2.1</title> |
||||
|
||||
<th:block th:insert="~{fragments/main::header-css}"/> |
||||
<script th:src="@{/angular.min.js}" src="../../static/angular.min.js"></script> |
||||
</head> |
||||
<body class="container"> |
||||
<a th:href="@{/}">Home</a> |
||||
|
||||
<h2>注册client</h2> |
||||
|
||||
<div ng-app> |
||||
<p class="help-block"> |
||||
若对OAuth2.1的<code>client_details</code>中的属性及作用不清楚, |
||||
建议你先查看项目中的<code>db_table_description.html</code>文件(位于others目录)中对表<code>oauth2_registered_client</code>的说明, |
||||
或在线访问<a href="https://andaily.com/spring-oauth-server/db_table_description_3.0.0.html" target="_blank">db_table_description.html</a>; |
||||
因为注册client实际上是向该表中按不同的条件添加数据. |
||||
</p> |
||||
|
||||
<div ng-controller="RegisterClientCtrl"> |
||||
<form th:object="${formDto}" th:action="@{register_client}" class="form-horizontal"> |
||||
<div class="form-group"> |
||||
<label for="clientId" class="col-sm-2 control-label">client_id<em class="text-danger">*</em></label> |
||||
|
||||
<div class="col-sm-10"> |
||||
<input th:name="clientId" class="form-control" id="clientId" placeholder="client_id" |
||||
required="required" th:field="*{clientId}"/> |
||||
|
||||
<p class="help-block">client_id必须输入,且必须唯一,长度至少5位; 在实际应用中的另一个名称叫appKey,与client_id是同一个概念.</p> |
||||
</div> |
||||
</div> |
||||
<div class="form-group"> |
||||
<label for="clientName" class="col-sm-2 control-label">client_name<em class="text-danger">*</em></label> |
||||
|
||||
<div class="col-sm-10"> |
||||
<input th:name="clientName" class="form-control" id="clientName" placeholder="client_name" |
||||
required="required" th:field="*{clientName}"/> |
||||
|
||||
<p class="help-block">Client有意义的名称.</p> |
||||
</div> |
||||
</div> |
||||
<div class="form-group"> |
||||
<label for="clientSecret" class="col-sm-2 control-label">client_secret<em |
||||
class="text-danger">*</em></label> |
||||
|
||||
<div class="col-sm-10"> |
||||
<input th:name="clientSecret" class="form-control" id="clientSecret" |
||||
placeholder="client_secret" required="required" th:field="*{clientSecret}"/> |
||||
|
||||
<p class="help-block">client_secret必须输入,且长度至少8位; 在实际应用中的另一个名称叫appSecret,与client_secret是同一个概念. |
||||
<br/> |
||||
<strong class="text-danger">注意: </strong> 由于client_secret 会加密存储, 请先复制并保留client_secret值 |
||||
</p> |
||||
</div> |
||||
</div> |
||||
<div class="form-group"> |
||||
<label class="col-sm-2 control-label">authentication_methods<em |
||||
class="text-danger">*</em></label> |
||||
|
||||
<div class="col-sm-10"> |
||||
<label class="checkbox-inline"> |
||||
<input type="checkbox" th:name="clientAuthenticationMethods" th:value="client_secret_basic" |
||||
th:field="*{clientAuthenticationMethods}" checked/> client_secret_basic |
||||
</label> |
||||
<label class="checkbox-inline"> |
||||
<input type="checkbox" th:name="clientAuthenticationMethods" th:value="client_secret_post" |
||||
th:field="*{clientAuthenticationMethods}" checked/> client_secret_post |
||||
</label> |
||||
<label class="checkbox-inline"> |
||||
<input type="checkbox" th:name="clientAuthenticationMethods" th:value="client_secret_jwt" |
||||
th:field="*{clientAuthenticationMethods}"/> client_secret_jwt |
||||
</label> |
||||
<label class="checkbox-inline"> |
||||
<input type="checkbox" th:name="clientAuthenticationMethods" th:value="private_key_jwt" |
||||
th:field="*{clientAuthenticationMethods}"/> private_key_jwt |
||||
</label> |
||||
|
||||
<p class="help-block">选择在认证时支持传递<em>client_secret</em>参数的方式;在正式环境中,此值一般不需要选择而是由后台创建时根据业务设置即可</p> |
||||
</div> |
||||
</div> |
||||
|
||||
<div class="form-group"> |
||||
<label class="col-sm-2 control-label">scopes<em class="text-danger">*</em></label> |
||||
|
||||
<div class="col-sm-10"> |
||||
<label class="checkbox-inline"> |
||||
<input type="checkbox" th:name="scopes" th:value="openid" th:field="*{scopes}" checked |
||||
readonly/> openid |
||||
</label> |
||||
<label class="checkbox-inline"> |
||||
<input type="checkbox" th:name="scopes" th:value="profile" th:field="*{scopes}"/> profile |
||||
</label> |
||||
<label class="checkbox-inline"> |
||||
<input type="checkbox" th:name="scopes" th:value="email" th:field="*{scopes}"/> email |
||||
</label> |
||||
<label class="checkbox-inline"> |
||||
<input type="checkbox" th:name="scopes" th:value="address" th:field="*{scopes}"/> address |
||||
</label> |
||||
<label class="checkbox-inline"> |
||||
<input type="checkbox" th:name="scopes" th:value="phone" th:field="*{scopes}"/> phone |
||||
</label> |
||||
|
||||
<p class="help-block">scopes值由OIDC 1.0协议中定义,<em>openid</em>必须选择;在正式环境中,此值一般不需要选择而是由后台创建时根据业务设置即可</p> |
||||
</div> |
||||
</div> |
||||
|
||||
<div class="form-group"> |
||||
<label class="col-sm-2 control-label">grant_type(s)<em class="text-danger">*</em></label> |
||||
|
||||
<div class="col-sm-10"> |
||||
<label class="checkbox-inline"> |
||||
<input type="checkbox" th:name="authorizationGrantTypes" th:value="authorization_code" |
||||
th:field="*{authorizationGrantTypes}"/> authorization_code |
||||
</label> |
||||
<label class="checkbox-inline"> |
||||
<input type="checkbox" th:name="authorizationGrantTypes" th:value="password" |
||||
th:field="*{authorizationGrantTypes}"/> password <em |
||||
class="label label-danger">不推荐使用</em> |
||||
</label> |
||||
<label class="checkbox-inline"> |
||||
<input type="checkbox" th:name="authorizationGrantTypes" |
||||
value="urn:ietf:params:oauth:grant-type:device_code" |
||||
th:field="*{authorizationGrantTypes}"/> device_code <em class="label">OAuth2.1新增</em> |
||||
</label> |
||||
<label class="checkbox-inline"> |
||||
<input type="checkbox" th:name="authorizationGrantTypes" |
||||
value="urn:ietf:params:oauth:grant-type:jwt-bearer" |
||||
th:field="*{authorizationGrantTypes}"/> jwt-bearer <em class="label">OAuth2.1新增</em> |
||||
</label> |
||||
<label class="checkbox-inline"> |
||||
<input type="checkbox" th:name="authorizationGrantTypes" th:value="client_credentials" |
||||
th:field="*{authorizationGrantTypes}"/> client_credentials |
||||
</label> |
||||
<label class="checkbox-inline"> |
||||
<input type="checkbox" th:name="authorizationGrantTypes" th:value="refresh_token" |
||||
th:field="*{authorizationGrantTypes}"/> refresh_token |
||||
</label> |
||||
|
||||
<p class="help-block">至少勾选一项grant_type(s), 且不能只单独勾选<code>refresh_token</code></p> |
||||
</div> |
||||
</div> |
||||
|
||||
<div class="form-group"> |
||||
<label for="redirectUris" class="col-sm-2 control-label">redirect_uris</label> |
||||
|
||||
<div class="col-sm-10"> |
||||
<input th:name="redirectUris" id="redirectUris" placeholder="https://..." class="form-control" |
||||
th:field="*{redirectUris}"/> |
||||
|
||||
<p class="help-block">若<code>grant_type</code>包括<em>authorization_code</em>, 则必须输入至少一个 redirect_uri |
||||
(多个uri用半角逗号分隔)</p> |
||||
</div> |
||||
</div> |
||||
|
||||
<div class="form-group"> |
||||
<label for="postLogoutRedirectUris" class="col-sm-2 control-label">logout_redirect_uris</label> |
||||
|
||||
<div class="col-sm-10"> |
||||
<input th:name="postLogoutRedirectUris" id="postLogoutRedirectUris" placeholder="https://..." |
||||
class="form-control" |
||||
th:field="*{postLogoutRedirectUris}"/> |
||||
|
||||
<p class="help-block">OAuth2 退出时<em>post</em>的客户端重定向 uri (多个uri用半角逗号分隔),可选</p> |
||||
</div> |
||||
</div> |
||||
|
||||
<div class="form-group"> |
||||
<div class="col-sm-2"></div> |
||||
<div class="col-sm-10"> |
||||
<a href="javascript:void(0);" ng-click="showMore()">更多选项</a> |
||||
</div> |
||||
</div> |
||||
|
||||
<div ng-show="visible"> |
||||
<div class="form-group"> |
||||
<label class="col-sm-2 control-label">require_proof_key(PKCE)</label> |
||||
|
||||
<div class="col-sm-10"> |
||||
<label class="checkbox-inline"> |
||||
<input type="radio" th:name="clientSettings.requireProofKey" th:value="true" |
||||
th:field="*{clientSettings.requireProofKey}"/> 支持PKCE |
||||
</label> |
||||
<label class="checkbox-inline"> |
||||
<input type="radio" th:name="clientSettings.requireProofKey" th:value="false" |
||||
th:field="*{clientSettings.requireProofKey}"/> 不支持PKCE |
||||
</label> |
||||
|
||||
<p class="help-block">是否在<em>authorization_code</em>流程中支持PKCE(Proof Key for Code Exchange)</p> |
||||
</div> |
||||
</div> |
||||
<div class="form-group"> |
||||
<label for="easa" class="col-sm-2 control-label">获取token认证签名算法</label> |
||||
|
||||
<div class="col-sm-10"> |
||||
<select id="easa" th:name="clientSettings.tokenEndpointAuthenticationSigningAlgorithm" |
||||
th:field="*{clientSettings.tokenEndpointAuthenticationSigningAlgorithm}" |
||||
class="form-control"> |
||||
<option th:value="RS256">RS256</option> |
||||
<option th:value="ES256">ES256</option> |
||||
</select> |
||||
|
||||
<p class="help-block">选择在调用<em>/oauth2/token</em> |
||||
API时使用的签名算法(当grant_type为jwt-bearer时会用到);注意:支持的算法要有对应用<em>jwk</em> (jwks.json |
||||
文件),判断支持哪些key可访问 |
||||
<a th:href="@{/.well-known/openid-configuration}" target="_blank">/.well-known/openid-configuration</a>进行查看 |
||||
</p> |
||||
</div> |
||||
</div> |
||||
|
||||
<hr/> |
||||
|
||||
<div class="form-group"> |
||||
<label for="authorizationCodeTimeToLive" class="col-sm-2 control-label">code有效时长</label> |
||||
|
||||
<div class="col-sm-10"> |
||||
<input type="number" class="form-control" th:name="tokenSettings.authorizationCodeTimeToLive" |
||||
id="authorizationCodeTimeToLive" |
||||
placeholder="300" th:field="*{tokenSettings.authorizationCodeTimeToLive}"/> |
||||
|
||||
<p class="help-block">设定<em>authorization_code</em>流程中<em>code</em>的有效时长(单位:秒);默认300(5分钟)</p> |
||||
</div> |
||||
</div> |
||||
<div class="form-group"> |
||||
<label for="deviceCodeTimeToLive" class="col-sm-2 control-label">device_code有效时长</label> |
||||
|
||||
<div class="col-sm-10"> |
||||
<input type="number" class="form-control" th:name="tokenSettings.deviceCodeTimeToLive" |
||||
id="deviceCodeTimeToLive" |
||||
placeholder="300" th:field="*{tokenSettings.deviceCodeTimeToLive}"/> |
||||
|
||||
<p class="help-block">设定<em>device_code</em>流程中<em>code</em>的有效时长(单位:秒);默认300(5分钟)</p> |
||||
</div> |
||||
</div> |
||||
<div class="form-group"> |
||||
<label for="accessTokenTimeToLive" class="col-sm-2 control-label">access_token有效时长</label> |
||||
|
||||
<div class="col-sm-10"> |
||||
<input type="number" class="form-control" th:name="tokenSettings.accessTokenTimeToLive" |
||||
id="accessTokenTimeToLive" |
||||
placeholder="3600" th:field="*{tokenSettings.accessTokenTimeToLive}"/> |
||||
|
||||
<p class="help-block">设定客户端<em>access_token</em>的有效时长(单位:秒),可选, 若不设定值则使用默认的有效时间值(3600秒); |
||||
若设定则必须是大于0的整数值(推荐不小于60)</p> |
||||
</div> |
||||
</div> |
||||
|
||||
<div class="form-group"> |
||||
<label for="refreshTokenTimeToLive" class="col-sm-2 control-label">refresh_token有效时长</label> |
||||
|
||||
<div class="col-sm-10"> |
||||
<input type="number" class="form-control" th:name="tokenSettings.refreshTokenTimeToLive" |
||||
id="refreshTokenTimeToLive" |
||||
placeholder="43200" th:field="*{tokenSettings.refreshTokenTimeToLive}"/> |
||||
|
||||
<p class="help-block">设定客户端<em>refresh_token</em>的有效时长(单位:秒),可选, 若不设定值则使用默认的有效时间值(43200秒); |
||||
若设定则必须是大于0的整数值且不能小于<em>access_token</em>有效时长</p> |
||||
</div> |
||||
</div> |
||||
<div class="form-group"> |
||||
<label class="col-sm-2 control-label">复用refresh_token</label> |
||||
|
||||
<div class="col-sm-10"> |
||||
<label class="radio-inline"> |
||||
<input type="radio" th:name="tokenSettings.reuseRefreshTokens" |
||||
th:field="*{tokenSettings.reuseRefreshTokens}" th:value="true"/> Yes |
||||
</label> |
||||
<label class="radio-inline"> |
||||
<input type="radio" th:name="tokenSettings.reuseRefreshTokens" |
||||
th:field="*{tokenSettings.reuseRefreshTokens}" th:value="false"/> No |
||||
</label> |
||||
|
||||
<p class="help-block">当调用refresh token API后是否继续使用之前的<em>refresh_token</em>值,Yes则继续使用,No则每次调用refresh |
||||
token API后会返回一新的<em>refresh_token</em>值</p> |
||||
</div> |
||||
</div> |
||||
<div class="form-group"> |
||||
<label class="col-sm-2 control-label">access_token格式</label> |
||||
|
||||
<div class="col-sm-10"> |
||||
<label class="radio-inline"> |
||||
<input type="radio" th:name="tokenSettings.accessTokenFormat" |
||||
th:field="*{tokenSettings.accessTokenFormat}" th:value="self-contained"/> |
||||
self-contained(jwt) |
||||
</label> |
||||
<label class="radio-inline"> |
||||
<input type="radio" th:name="tokenSettings.accessTokenFormat" |
||||
th:field="*{tokenSettings.accessTokenFormat}" th:value="reference"/> reference(uuid) |
||||
</label> |
||||
|
||||
<p class="help-block">设置<em>access_token</em>值的格式,<code>self-contained</code>使用JWT格式(默认),<code>reference</code>使用类UUID格式 |
||||
</p> |
||||
</div> |
||||
</div> |
||||
<div class="form-group"> |
||||
<label for="idTokenSignatureAlgorithm" class="col-sm-2 control-label">id_token签名使用的算法</label> |
||||
|
||||
<div class="col-sm-10"> |
||||
<select id="idTokenSignatureAlgorithm" th:name="tokenSettings.idTokenSignatureAlgorithm" |
||||
th:field="*{tokenSettings.idTokenSignatureAlgorithm}" |
||||
class="form-control"> |
||||
<option th:value="RS256">RS256</option> |
||||
<option th:value="ES256">ES256</option> |
||||
</select> |
||||
|
||||
<p class="help-block">选择生成<em>id_token</em>时使用的算法;注意:支持的算法要有对应用<em>jwk</em> (jwks.json |
||||
文件),判断支持哪些key可访问 |
||||
<a th:href="@{/.well-known/openid-configuration}" target="_blank">/.well-known/openid-configuration</a>进行查看 |
||||
</p> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
|
||||
|
||||
<div class="form-group"> |
||||
<div class="col-sm-2"></div> |
||||
<div class="col-sm-10"> |
||||
<span class="text-danger" th:errors="*"></span> |
||||
</div> |
||||
</div> |
||||
|
||||
|
||||
<div class="form-group"> |
||||
<div class="col-sm-2"></div> |
||||
<div class="col-sm-10"> |
||||
<button type="submit" class="btn btn-success">注册</button> |
||||
<a th:href="@{client_details}">取消</a> |
||||
</div> |
||||
</div> |
||||
</form> |
||||
</div> |
||||
</div> |
||||
|
||||
<script> |
||||
var RegisterClientCtrl = ["$scope", function ($scope) { |
||||
$scope.visible = false; |
||||
|
||||
$scope.showMore = function () { |
||||
$scope.visible = !$scope.visible; |
||||
}; |
||||
}]; |
||||
</script> |
||||
|
||||
<div th:replace="~{fragments/main :: footer}"/> |
||||
</body> |
||||
</html> |
Loading…
Reference in new issue