refactor: 💡 Remove logos from clients (#23)

DB update can be done - drop column logo_uri from clients

BREAKING CHANGE: 🧨 Removed logo from clients
pull/1580/head
Dominik František Bučík 2021-09-01 14:24:24 +02:00 committed by GitHub
parent d17c11c035
commit 775e2e8b6a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
30 changed files with 1571 additions and 2044 deletions

View File

@ -143,7 +143,6 @@ CREATE TABLE IF NOT EXISTS client_details (
token_endpoint_auth_method VARCHAR(256), token_endpoint_auth_method VARCHAR(256),
subject_type VARCHAR(256), subject_type VARCHAR(256),
logo_uri VARCHAR(2048),
policy_uri VARCHAR(2048), policy_uri VARCHAR(2048),
client_uri VARCHAR(2048), client_uri VARCHAR(2048),
tos_uri VARCHAR(2048), tos_uri VARCHAR(2048),

View File

@ -142,7 +142,6 @@ CREATE TABLE IF NOT EXISTS client_details (
token_endpoint_auth_method VARCHAR(256), token_endpoint_auth_method VARCHAR(256),
subject_type VARCHAR(256), subject_type VARCHAR(256),
logo_uri VARCHAR(2048),
policy_uri VARCHAR(2048), policy_uri VARCHAR(2048),
client_uri VARCHAR(2048), client_uri VARCHAR(2048),
tos_uri VARCHAR(2048), tos_uri VARCHAR(2048),

View File

@ -153,7 +153,6 @@ CREATE TABLE client_details (
token_endpoint_auth_method VARCHAR2(256), token_endpoint_auth_method VARCHAR2(256),
subject_type VARCHAR2(256), subject_type VARCHAR2(256),
logo_uri VARCHAR2(2048),
policy_uri VARCHAR2(2048), policy_uri VARCHAR2(2048),
client_uri VARCHAR2(2048), client_uri VARCHAR2(2048),
tos_uri VARCHAR2(2048), tos_uri VARCHAR2(2048),

View File

@ -143,7 +143,6 @@ CREATE TABLE IF NOT EXISTS client_details (
token_endpoint_auth_method VARCHAR(256), token_endpoint_auth_method VARCHAR(256),
subject_type VARCHAR(256), subject_type VARCHAR(256),
logo_uri VARCHAR(2048),
policy_uri VARCHAR(2048), policy_uri VARCHAR(2048),
client_uri VARCHAR(2048), client_uri VARCHAR(2048),
tos_uri VARCHAR(2048), tos_uri VARCHAR(2048),

View File

@ -82,38 +82,6 @@
</c:choose> </c:choose>
</c:if> </c:if>
<c:if test="${ not empty client.logoUri }">
<ul class="thumbnails">
<li class="span5">
<a class="thumbnail" data-toggle="modal" data-target="#logoModal"><img src="api/clients/${ client.id }/logo" /></a>
</li>
</ul>
<!-- Modal -->
<div id="logoModal" class="modal hide fade" tabindex="-1" role="dialog" aria-labelledby="logoModalLabel" aria-hidden="true">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
<h3 id="logoModalLabel">
<c:choose>
<c:when test="${empty client.clientName}">
<em><c:out value="${client.clientId}" /></em>
</c:when>
<c:otherwise>
<em><c:out value="${client.clientName}" /></em>
</c:otherwise>
</c:choose>
</h3>
</div>
<div class="modal-body">
<img src="api/clients/${ client.id }/logo" />
<c:if test="${ not empty client.clientUri }">
<a href="<c:out value="${ client.clientUri }" />"><c:out value="${ client.clientUri }" /></a>
</c:if>
</div>
<div class="modal-footer">
<button class="btn" data-dismiss="modal" aria-hidden="true">Close</button>
</div>
</div>
</c:if>
<c:if test="${ (not empty client.clientDescription) || (not empty client.clientUri) || (not empty client.policyUri) || (not empty client.tosUri) || (not empty contacts) }"> <c:if test="${ (not empty client.clientDescription) || (not empty client.clientUri) || (not empty client.policyUri) || (not empty client.tosUri) || (not empty contacts) }">
<div class="muted moreInformationContainer"> <div class="muted moreInformationContainer">
<c:out value="${client.clientDescription}" /> <c:out value="${client.clientDescription}" />

View File

@ -82,38 +82,6 @@
</c:choose> </c:choose>
</c:if> </c:if>
<c:if test="${ not empty client.logoUri }">
<ul class="thumbnails">
<li class="span5">
<a class="thumbnail" data-toggle="modal" data-target="#logoModal"><img src="api/clients/${ client.id }/logo" /></a>
</li>
</ul>
<!-- Modal -->
<div id="logoModal" class="modal hide fade" tabindex="-1" role="dialog" aria-labelledby="logoModalLabel" aria-hidden="true">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
<h3 id="logoModalLabel">
<c:choose>
<c:when test="${empty client.clientName}">
<em><c:out value="${client.clientId}" /></em>
</c:when>
<c:otherwise>
<em><c:out value="${client.clientName}" /></em>
</c:otherwise>
</c:choose>
</h3>
</div>
<div class="modal-body">
<img src="api/clients/${ client.id }/logo" />
<c:if test="${ not empty client.clientUri }">
<a href="<c:out value="${ client.clientUri }" />"><c:out value="${ client.clientUri }" /></a>
</c:if>
</div>
<div class="modal-footer">
<button class="btn" data-dismiss="modal" aria-hidden="true">Close</button>
</div>
</div>
</c:if>
<c:if test="${ (not empty client.clientDescription) || (not empty client.clientUri) || (not empty client.policyUri) || (not empty client.tosUri) || (not empty contacts) }"> <c:if test="${ (not empty client.clientDescription) || (not empty client.clientUri) || (not empty client.policyUri) || (not empty client.tosUri) || (not empty contacts) }">
<div class="muted moreInformationContainer"> <div class="muted moreInformationContainer">
<c:out value="${client.clientDescription}" /> <c:out value="${client.clientDescription}" />

View File

@ -187,12 +187,6 @@ h1,label {
height: 20px; height: 20px;
} }
/* Client table images */
.client-logo {
max-width: 64px;
max-height: 64px
}
/* Modal and sheet fight for the same z-index otherwise */ /* Modal and sheet fight for the same z-index otherwise */
.modal-backdrop { .modal-backdrop {
z-index: 2040; z-index: 2040;

View File

@ -40,7 +40,6 @@ var ClientModel = Backbone.Model.extend({
redirectUris: [], redirectUris: [],
clientName: null, clientName: null,
clientUri: null, clientUri: null,
logoUri: null,
contacts: [], contacts: [],
tosUri: null, tosUri: null,
tokenEndpointAuthMethod: null, tokenEndpointAuthMethod: null,
@ -131,9 +130,6 @@ var ClientModel = Backbone.Model.extend({
if (this.get('tosUri') != null && this.get('tosUri').toLowerCase().indexOf(term.toLowerCase()) != -1) { if (this.get('tosUri') != null && this.get('tosUri').toLowerCase().indexOf(term.toLowerCase()) != -1) {
matches.push($.t('client.client-table.match.terms')); matches.push($.t('client.client-table.match.terms'));
} }
if (this.get('logoUri') != null && this.get('logoUri').toLowerCase().indexOf(term.toLowerCase()) != -1) {
matches.push($.t('client.client-table.match.logo'));
}
if (this.get('contacts') != null) { if (this.get('contacts') != null) {
var f = _.filter(this.get('contacts'), function(item) { var f = _.filter(this.get('contacts'), function(item) {
return item.toLowerCase().indexOf(term.toLowerCase()) != -1; return item.toLowerCase().indexOf(term.toLowerCase()) != -1;
@ -720,7 +716,6 @@ var ClientFormView = Backbone.View.extend({
"change #tokenEndpointAuthMethod input:radio": "toggleClientCredentials", "change #tokenEndpointAuthMethod input:radio": "toggleClientCredentials",
"change #displayClientSecret": "toggleDisplayClientSecret", "change #displayClientSecret": "toggleDisplayClientSecret",
"change #generateClientSecret": "toggleGenerateClientSecret", "change #generateClientSecret": "toggleGenerateClientSecret",
"change #logoUri input": "previewLogo",
"change #jwkSelector input:radio": "toggleJWKSetType" "change #jwkSelector input:radio": "toggleJWKSetType"
}, },
@ -760,16 +755,6 @@ var ClientFormView = Backbone.View.extend({
$("#refreshTokenValidityTime", this.$el).toggle(); $("#refreshTokenValidityTime", this.$el).toggle();
}, },
previewLogo: function() {
if ($('#logoUri input', this.el).val()) {
$('#logoPreview', this.el).empty();
$('#logoPreview', this.el).attr('src', $('#logoUri input', this.el).val());
} else {
// $('#logoBlock', this.el).hide();
$('#logoPreview', this.el).attr('src', 'resources/images/logo_placeholder.gif');
}
},
/** /**
* Set up the form based on the current state of the tokenEndpointAuthMethod * Set up the form based on the current state of the tokenEndpointAuthMethod
* parameter * parameter
@ -1047,7 +1032,6 @@ var ClientFormView = Backbone.View.extend({
generateClientSecret: generateClientSecret, generateClientSecret: generateClientSecret,
redirectUris: redirectUris, redirectUris: redirectUris,
clientDescription: this.emptyToNull($('#clientDescription textarea').val()), clientDescription: this.emptyToNull($('#clientDescription textarea').val()),
logoUri: this.emptyToNull($('#logoUri input').val()),
grantTypes: grantTypes, grantTypes: grantTypes,
accessTokenValiditySeconds: accessTokenValiditySeconds, accessTokenValiditySeconds: accessTokenValiditySeconds,
refreshTokenValiditySeconds: refreshTokenValiditySeconds, refreshTokenValiditySeconds: refreshTokenValiditySeconds,
@ -1297,7 +1281,6 @@ var ClientFormView = Backbone.View.extend({
// toggle other dynamic fields // toggle other dynamic fields
this.toggleClientCredentials(); this.toggleClientCredentials();
this.previewLogo();
this.toggleJWKSetType(); this.toggleJWKSetType();
// disable unsupported JOSE algorithms // disable unsupported JOSE algorithms

View File

@ -24,7 +24,6 @@ var DynRegClient = Backbone.Model.extend({
redirect_uris: [], redirect_uris: [],
client_name: null, client_name: null,
client_uri: null, client_uri: null,
logo_uri: null,
contacts: [], contacts: [],
tos_uri: null, tos_uri: null,
token_endpoint_auth_method: null, token_endpoint_auth_method: null,
@ -242,7 +241,6 @@ var DynRegEditView = Backbone.View.extend({
"click .btn-save": "saveClient", "click .btn-save": "saveClient",
"click .btn-cancel": "cancel", "click .btn-cancel": "cancel",
"click .btn-delete": "deleteClient", "click .btn-delete": "deleteClient",
"change #logoUri input": "previewLogo",
"change #tokenEndpointAuthMethod input:radio": "toggleClientCredentials", "change #tokenEndpointAuthMethod input:radio": "toggleClientCredentials",
"change #jwkSelector input:radio": "toggleJWKSetType" "change #jwkSelector input:radio": "toggleJWKSetType"
}, },
@ -279,16 +277,6 @@ var DynRegEditView = Backbone.View.extend({
return false; return false;
}, },
previewLogo: function() {
if ($('#logoUri input', this.el).val()) {
$('#logoPreview', this.el).empty();
$('#logoPreview', this.el).attr('src', $('#logoUri input', this.el).val());
} else {
// $('#logoBlock', this.el).hide();
$('#logoPreview', this.el).attr('src', 'resources/images/logo_placeholder.gif');
}
},
/** /**
* Set up the form based on the current state of the tokenEndpointAuthMethod * Set up the form based on the current state of the tokenEndpointAuthMethod
* parameter * parameter
@ -458,7 +446,6 @@ var DynRegEditView = Backbone.View.extend({
var attrs = { var attrs = {
client_name: this.emptyToNull($('#clientName input').val()), client_name: this.emptyToNull($('#clientName input').val()),
redirect_uris: redirectUris, redirect_uris: redirectUris,
logo_uri: this.emptyToNull($('#logoUri input').val()),
grant_types: grantTypes, grant_types: grantTypes,
scope: scopes, scope: scopes,
client_secret: null, // never send a client secret client_secret: null, // never send a client secret
@ -680,7 +667,6 @@ var DynRegEditView = Backbone.View.extend({
this.listWidgetViews.push(defaultAcrView); this.listWidgetViews.push(defaultAcrView);
this.toggleClientCredentials(); this.toggleClientCredentials();
this.previewLogo();
this.toggleJWKSetType(); this.toggleJWKSetType();
// disable unsupported JOSE algorithms // disable unsupported JOSE algorithms

View File

@ -87,8 +87,6 @@
"jwk-set": "Public Key Set", "jwk-set": "Public Key Set",
"jwk-set-help": "URL for the client's JSON Web Key set (must be reachable by the server)", "jwk-set-help": "URL for the client's JSON Web Key set (must be reachable by the server)",
"jwk-set-value-help": "URL for the client's JSON Web Key set (must be reachable by the server)", "jwk-set-value-help": "URL for the client's JSON Web Key set (must be reachable by the server)",
"logo": "Logo",
"logo-help": "URL that points to a logo image, will be displayed on approval page",
"main": "Main", "main": "Main",
"max-age": "Default Max Age", "max-age": "Default Max Age",
"max-age-help": "Default maximum session age before re-prompting", "max-age-help": "Default maximum session age before re-prompting",
@ -197,7 +195,6 @@
"description": "description", "description": "description",
"homepage": "home page", "homepage": "home page",
"id": "id", "id": "id",
"logo": "logo",
"name": "name", "name": "name",
"policy": "policy", "policy": "policy",
"redirect": "redirect uri", "redirect": "redirect uri",

View File

@ -87,7 +87,6 @@
"jwk-set": "Jeu de Clés publique", "jwk-set": "Jeu de Clés publique",
"jwk-set-help": "URI du jeu de clés Web JSON pour le client (doit être accessible par le serveur)", "jwk-set-help": "URI du jeu de clés Web JSON pour le client (doit être accessible par le serveur)",
"jwk-set-value-help": "URI du jeu de clés Web JSON pour le client (doit être accessible par le serveur)", "jwk-set-value-help": "URI du jeu de clés Web JSON pour le client (doit être accessible par le serveur)",
"logo": "Logo",
"logo-help": "L'URI qui pointe vers une image de logo sera affichée sur la page d'approbation", "logo-help": "L'URI qui pointe vers une image de logo sera affichée sur la page d'approbation",
"main": "Principal", "main": "Principal",
"max-age": "Age Maximum par Défaut", "max-age": "Age Maximum par Défaut",
@ -197,7 +196,6 @@
"description": "description", "description": "description",
"homepage": "page d'accueil", "homepage": "page d'accueil",
"id": "id", "id": "id",
"logo": "logo",
"name": "nom", "name": "nom",
"policy": "politique", "policy": "politique",
"redirect": "uri de redirection", "redirect": "uri de redirection",

View File

@ -83,8 +83,6 @@
"introspection": "Introspektion", "introspection": "Introspektion",
"jwk-set": "JWK Set", "jwk-set": "JWK Set",
"jwk-set-help": "Länk till klientens JSON Webb-nyckel-set", "jwk-set-help": "Länk till klientens JSON Webb-nyckel-set",
"logo": "Logotyp",
"logo-help": "Länk till en logotyp. Den visas på bekräftelsesidan.",
"main": "Basinformation", "main": "Basinformation",
"max-age": "Max sessions-längd", "max-age": "Max sessions-längd",
"max-age-help": "Default maximal sessions-längd innan användaren tillfrågas igen", "max-age-help": "Default maximal sessions-längd innan användaren tillfrågas igen",
@ -168,7 +166,6 @@
"description": "beskrivning", "description": "beskrivning",
"homepage": "hemsida", "homepage": "hemsida",
"id": "id", "id": "id",
"logo": "logotyp",
"name": "namn", "name": "namn",
"policy": "policy", "policy": "policy",
"redirect": "omdirigeringslänk", "redirect": "omdirigeringslänk",
@ -433,4 +430,4 @@
"deny": "Avbryt" "deny": "Avbryt"
} }
} }
} }

View File

@ -1,490 +1,487 @@
{ {
"admin": { "admin": {
"blacklist": "黑名单", "blacklist": "黑名单",
"blacklist-form": { "blacklist-form": {
"blacklisted-uris": "列入黑名单的URI" "blacklisted-uris": "列入黑名单的URI"
}, },
"home": "首页", "home": "首页",
"list-widget": { "list-widget": {
"empty": "此列表为空。", "empty": "此列表为空。",
"tooltip": "单击显示全部值。" "tooltip": "单击显示全部值。"
}, },
"manage-blacklist": "管理列入黑名单的客户端", "manage-blacklist": "管理列入黑名单的客户端",
"self-service-client": "自助服务-客户端注册", "self-service-client": "自助服务-客户端注册",
"self-service-resource": "自助服务-受保护资源注册", "self-service-resource": "自助服务-受保护资源注册",
"user-profile": { "user-profile": {
"claim": "声明项", "claim": "声明项",
"show": "查看用户信息", "show": "查看用户信息",
"text": "您的用户信息如下:", "text": "您的用户信息如下:",
"value": "内容" "value": "内容"
} }
}, },
"client": { "client": {
"client-form": { "client-form": {
"access": "访问", "access": "访问",
"access-token-no-timeout": "访问令牌不时间", "access-token-no-timeout": "访问令牌不时间",
"access-token-timeout": "访问令牌超时", "access-token-timeout": "访问令牌超时",
"access-token-timeout-help": "输入时间(秒、分钟或小时)。", "access-token-timeout-help": "输入时间(秒、分钟或小时)。",
"acr-values": "默认ACR值", "acr-values": "默认ACR值",
"acr-values-placeholder": "新的ACR值", "acr-values-placeholder": "新的ACR值",
"acr-values-help": "用于请求该客户端的默认身份验证上下文参考", "acr-values-help": "用于请求该客户端的默认身份验证上下文参考",
"allow-introspection": "允许调用内省端点?", "allow-introspection": "允许调用内省端点?",
"authentication-method": "令牌端点认证方法", "authentication-method": "令牌端点认证方法",
"authorization-code": "授权码", "authorization-code": "授权码",
"client-credentials": "客户端凭证", "client-credentials": "客户端凭证",
"client-description": "描述", "client-description": "描述",
"client-description-help": "人类可读的文本描述", "client-description-help": "人类可读的文本描述",
"client-description-placeholder": "填入说明描述", "client-description-placeholder": "填入说明描述",
"client-id": "客户端ID", "client-id": "客户端ID",
"client-id-help": "唯一标识符。如果不填则系统会自动生成一个。", "client-id-help": "唯一标识符。如果不填则系统会自动生成一个。",
"client-id-placeholder": "输入一些字符", "client-id-placeholder": "输入一些字符",
"client-name": "客户端名称", "client-name": "客户端名称",
"client-name-help": "人类可读的应用程序名称", "client-name-help": "人类可读的应用程序名称",
"client-name-placeholder": "输入一些字符", "client-name-placeholder": "输入一些字符",
"client-secret": "客户端密钥", "client-secret": "客户端密钥",
"client-secret-placeholder": "输入密钥", "client-secret-placeholder": "输入密钥",
"contacts": "联系人", "contacts": "联系人",
"contacts-help": "此客户端管理员的联系人名单。", "contacts-help": "此客户端管理员的联系人名单。",
"contacts-placeholder": "新联系人", "contacts-placeholder": "新联系人",
"credentials": "凭据", "credentials": "凭据",
"crypto": { "crypto": {
"a128cbc-hs256": "复合认证加密算法采用密码块链CBC模式AES以PKCS #5填充完整性计算使用HMAC SHA-256并使用256位的CMK和128位CEK", "a128cbc-hs256": "复合认证加密算法采用密码块链CBC模式AES以PKCS #5填充完整性计算使用HMAC SHA-256并使用256位的CMK和128位CEK",
"a256cbc-hs512": "复合认证加密算法采用密码块链CBC模式AES以PKCS #5填充完整性计算使用HMAC SHA-512并使用512位的CMK和256位CEK", "a256cbc-hs512": "复合认证加密算法采用密码块链CBC模式AES以PKCS #5填充完整性计算使用HMAC SHA-512并使用512位的CMK和256位CEK",
"a128gcm": "AES GCM使用128位的密钥", "a128gcm": "AES GCM使用128位的密钥",
"a256gcm": "AES GCM使用256位的密钥", "a256gcm": "AES GCM使用256位的密钥",
"a128kw": "AES密钥封装算法使用128位的密钥", "a128kw": "AES密钥封装算法使用128位的密钥",
"a256kw": "AES密钥封装算法使用256位的密钥", "a256kw": "AES密钥封装算法使用256位的密钥",
"default": "使用服务器默认", "default": "使用服务器默认",
"dir": "直接使用一个共享对称密钥作为块加密的内容主密钥CMK", "dir": "直接使用一个共享对称密钥作为块加密的内容主密钥CMK",
"ecdh-es": "椭圆曲线Diffie-Hellman短时静态密钥协议使用Concat KDF商定的密钥被直接用作内容主密钥CMK", "ecdh-es": "椭圆曲线Diffie-Hellman短时静态密钥协议使用Concat KDF商定的密钥被直接用作内容主密钥CMK",
"ecdh-es-a128kw": "椭圆曲线Diffie-Hellman短时静态密钥协议使用ECDH-ES和第4.7小节但商定的密钥是用以A128KW函数封装内容主密钥CMK", "ecdh-es-a128kw": "椭圆曲线Diffie-Hellman短时静态密钥协议使用ECDH-ES和第4.7小节但商定的密钥是用以A128KW函数封装内容主密钥CMK",
"ecdh-es-a256kw": "椭圆曲线Diffie-Hellman短时静态密钥协议使用ECDH-ES和第4.7小节但商定的密钥是用以A256KW函数封装内容主密钥CMK", "ecdh-es-a256kw": "椭圆曲线Diffie-Hellman短时静态密钥协议使用ECDH-ES和第4.7小节但商定的密钥是用以A256KW函数封装内容主密钥CMK",
"none": "不加密", "none": "不加密",
"rsa-oaep": "RSAES使用最优不对称加密填充OAEP", "rsa-oaep": "RSAES使用最优不对称加密填充OAEP",
"rsa1-5": "RSAES-PKCS1-V1_5" "rsa1-5": "RSAES-PKCS1-V1_5"
}, },
"cryptography": "密码", "cryptography": "密码",
"display-secret": "显示/编辑客户端密钥:", "display-secret": "显示/编辑客户端密钥:",
"edit": "编辑客户端", "edit": "编辑客户端",
"generate-new-secret": "生成一个新的客户端密钥吗?", "generate-new-secret": "生成一个新的客户端密钥吗?",
"generate-new-secret-help": "当点击“保存”时生成新的密钥", "generate-new-secret-help": "当点击“保存”时生成新的密钥",
"generate-on-save": "保存时生成", "generate-on-save": "保存时生成",
"grant-types": "批准的类型", "grant-types": "批准的类型",
"home": "主页", "home": "主页",
"home-help": "客户端首页的URL将显示给用户", "home-help": "客户端首页的URL将显示给用户",
"hours": "小时", "hours": "小时",
"id": "ID", "id": "ID",
"id-token-crypto-algorithm": "身份令牌加密算法", "id-token-crypto-algorithm": "身份令牌加密算法",
"id-token-crypto-method": "身份令牌加密方法", "id-token-crypto-method": "身份令牌加密方法",
"id-token-signing-algorithm": "身份令牌签名算法", "id-token-signing-algorithm": "身份令牌签名算法",
"id-token-timeout": "身份令牌超时", "id-token-timeout": "身份令牌超时",
"implicit": "隐式的", "implicit": "隐式的",
"initiate-login": "初始化登录", "initiate-login": "初始化登录",
"initiate-login-help": "启动登录客户端的URL", "initiate-login-help": "启动登录客户端的URL",
"introspection": "自省", "introspection": "自省",
"jwk-set": "公钥集", "jwk-set": "公钥集",
"jwk-set-help": "客户端JSON Web Key集的URL (须可被服务器访问)", "jwk-set-help": "客户端JSON Web Key集的URL (须可被服务器访问)",
"jwk-set-value-help": "客户端JSON Web Key集的URL (须可被服务器访问)", "jwk-set-value-help": "客户端JSON Web Key集的URL (须可被服务器访问)",
"logo": "标志Logo)", "main": "首要",
"logo-help": "标志Logo图像的URL将显示在批准页", "max-age": "默认最长有效时间",
"main": "首要", "max-age-help": "再提示之前的默认最长会话有效时间",
"max-age": "默认最长有效时间", "minutes": "分钟",
"max-age-help": "再提示之前的默认最长会话有效时间", "new": "新客户端",
"minutes": "分钟", "other": "其它",
"new": "新客户端", "pairwise": "Pairwise对",
"other": "其它", "password": "密码",
"pairwise": "Pairwise对", "policy": "政策声明",
"password": "密码", "policy-help": "此客户端的政策声明链接,将显示给用户",
"policy": "政策声明", "post-logout": "注销后重定向",
"policy-help": "此客户端的政策声明链接,将显示给用户", "post-logout-help": "客户端注销操作后的重定向URL",
"post-logout": "注销后重定向", "public": "公共",
"post-logout-help": "客户端注销操作后的重定向URL", "redelegation": "重新授权",
"public": "公共", "redirect-uris": "重定向URI",
"redelegation": "重新授权", "redirect-uris-help": "在授权页面之后客户端重定向URI",
"redirect-uris": "重定向URI", "claims-redirect-uris": "声明重定向URI",
"redirect-uris-help": "在授权页面之后客户端重定向URI", "claims-redirect-uris-help": "在声明收集步骤之后浏览器跳转至的目的地址",
"claims-redirect-uris": "声明重定向URI", "refresh": "刷新",
"claims-redirect-uris-help": "在声明收集步骤之后浏览器跳转至的目的地址", "refresh-tokens": "刷新令牌",
"refresh": "刷新", "refresh-tokens-issued": "为此客户端发布的刷新令牌",
"refresh-tokens": "刷新令牌", "refresh-tokens-issued-help": "这将把 offline_access 加入客户端的范围。",
"refresh-tokens-issued": "为此客户端发布的刷新令牌", "refresh-tokens-reused": "此客户端的刷新令牌被重用",
"refresh-tokens-issued-help": "这将把 offline_access 加入客户端的范围。", "clear-access-tokens": "当刷新令牌用过之后,已激活的访问令牌自动失效",
"refresh-tokens-reused": "此客户端的刷新令牌被重用", "refresh-tokens-no-expire": "刷新令牌尚未过期",
"clear-access-tokens": "当刷新令牌用过之后,已激活的访问令牌自动失效", "registered": "注册于",
"refresh-tokens-no-expire": "刷新令牌尚未过期", "registration-token": "注册令牌:",
"registered": "注册于", "registration-access-token": "注册访问令牌",
"registration-token": "注册令牌:", "registration-token-error": "无法为此客户端下载注册访问令牌。",
"registration-access-token": "注册访问令牌", "request-object-signing-algorithm": "请求对象签名算法",
"registration-token-error": "无法为此客户端下载注册访问令牌。", "request-uri": "请求的URI",
"request-object-signing-algorithm": "请求对象签名算法", "request-uri-help": "URI包含此客户端使用的请求对象",
"request-uri": "请求的URI", "require-auth-time": "需要身份认证时间(auth_time)",
"request-uri-help": "URI包含此客户端使用的请求对象", "require-auth-time-label": "总是需要在身份令牌中包含auth_time声明",
"require-auth-time": "需要身份认证时间(auth_time)", "response-types": "响应类型",
"require-auth-time-label": "总是需要在身份令牌中包含auth_time声明", "rotate-registration-token": "旋转注册令牌",
"response-types": "响应类型", "rotate-registration-token-confirm": "你确定你想旋转这个客户端的登录令牌?",
"rotate-registration-token": "旋转注册令牌", "rotate-registration-token-error": "无法旋转该客户端的注册访问令牌。",
"rotate-registration-token-confirm": "你确定你想旋转这个客户端的登录令牌?", "saved": {
"rotate-registration-token-error": "无法旋转该客户端的注册访问令牌。", "no-secret": "没有客户端密钥",
"saved": { "saved": "客户端已保存",
"no-secret": "没有客户端密钥", "secret": "密钥:",
"saved": "客户端已保存", "show-secret": "显示密钥",
"secret": "密钥:", "unchanged": "不变"
"show-secret": "显示密钥", },
"unchanged": "不变" "scope-placeholder": "新范围",
}, "scope-help": "OAuth范围允许客户端请求",
"scope-placeholder": "新范围", "seconds": "秒",
"scope-help": "OAuth范围允许客户端请求", "secret-asymmetric-jwt": "非对称签名JWT断言",
"seconds": "秒", "secret-http": "客户端密钥经由HTTP Basic",
"secret-asymmetric-jwt": "非对称签名JWT断言", "secret-none": "没有认证",
"secret-http": "客户端密钥经由HTTP Basic", "secret-post": "客户端密钥经由HTTP POST",
"secret-none": "没有认证", "secret-symmetric-jwt": "客户端密钥经由对称签名JWT断言",
"secret-post": "客户端密钥经由HTTP POST", "sector-identifier": "扇区标识符URI",
"secret-symmetric-jwt": "客户端密钥经由对称签名JWT断言", "signing": {
"sector-identifier": "扇区标识符URI", "any": "允许",
"signing": { "default": "使用服务器默认",
"any": "允许", "es256": "ECDSA采用P-256曲线和SHA-256哈希算法",
"default": "使用服务器默认", "es384": "ECDSA采用P-384曲线及SHA-384哈希算法",
"es256": "ECDSA采用P-256曲线和SHA-256哈希算法", "es512": "ECDSA采用P-512曲线及SHA-512哈希算法",
"es384": "ECDSA采用P-384曲线及SHA-384哈希算法", "hs256": "HMAC使用SHA-256哈希算法",
"es512": "ECDSA采用P-512曲线及SHA-512哈希算法", "hs384": "HMAC使用SHA-384哈希算法",
"hs256": "HMAC使用SHA-256哈希算法", "hs512": "HMAC使用SHA-512哈希算法",
"hs384": "HMAC使用SHA-384哈希算法", "none": "没有数字签名",
"hs512": "HMAC使用SHA-512哈希算法", "rs256": "RSASSA使用SHA-256哈希算法",
"none": "没有数字签名", "rs384": "RSASSA采用SHA-384哈希算法",
"rs256": "RSASSA使用SHA-256哈希算法", "rs512": "RSASSA使用SHA-512哈希算法",
"rs384": "RSASSA采用SHA-384哈希算法", "ps256": "采用SHA-256和MGF1的RSASSA-PSS算法",
"rs512": "RSASSA使用SHA-512哈希算法", "ps384": "采用SHA-384和MGF1的RSASSA-PSS算法",
"ps256": "采用SHA-256和MGF1的RSASSA-PSS算法", "ps512": "采用SHA-512和MGF1的RSASSA-PSS算法"
"ps384": "采用SHA-384和MGF1的RSASSA-PSS算法", },
"ps512": "采用SHA-512和MGF1的RSASSA-PSS算法" "subject-type": "主体类型",
}, "terms": "服务条款",
"subject-type": "主体类型", "terms-help": "此客户服务条款的URL将向用户显示",
"terms": "服务条款", "token-signing-algorithm": "令牌端点认证签名算法",
"terms-help": "此客户服务条款的URL将向用户显示", "tokens": "令牌",
"token-signing-algorithm": "令牌端点认证签名算法", "type": "应用类型",
"tokens": "令牌", "type-native": "原生应用",
"type": "应用类型", "type-web": "网络应用",
"type-native": "原生应用", "unknown": "(未知)",
"type-web": "网络应用", "user-info-crypto-algorithm": "用户信息端点加密算法",
"unknown": "(未知)", "user-info-crypto-method": "用户信息端点加密方法",
"user-info-crypto-algorithm": "用户信息端点加密算法", "user-info-signing-algorithm": "用户信息端点签名算法"
"user-info-crypto-method": "用户信息端点加密方法", },
"user-info-signing-algorithm": "用户信息端点签名算法" "client-table": {
}, "allow-introspection-tooltip": "这个客户端可以执行令牌自省",
"client-table": { "confirm": "你确定要删除这个客户端?",
"allow-introspection-tooltip": "这个客户端可以执行令牌自省", "dynamically-registered-tooltip": "这个客户端是动态注册的。点击查看注册访问令牌",
"confirm": "你确定要删除这个客户端?", "match": {
"dynamically-registered-tooltip": "这个客户端是动态注册的。点击查看注册访问令牌", "contacts": "联系人",
"match": { "description": "描述",
"contacts": "联系人", "homepage": "主页",
"description": "描述", "id": "身份",
"homepage": "主页", "name": "名称",
"id": "身份", "policy": "政策",
"logo": "标志", "redirect": "重定向URI",
"name": "名称", "scope": "范围",
"policy": "政策", "terms": "服务条款"
"redirect": "重定向URI", },
"scope": "范围", "matched-search": "匹配搜索:",
"terms": "服务条款" "new": "新客户端",
}, "no-clients": "此服务器上没有注册的客户端。",
"matched-search": "匹配搜索:", "no-matches": "没有匹配搜索条件的客户端。",
"new": "新客户端", "no-redirect": "没有重定向URI",
"no-clients": "此服务器上没有注册的客户端。", "registered": "注册于",
"no-matches": "没有匹配搜索条件的客户端。", "search": "搜索……",
"no-redirect": "没有重定向URI", "whitelist": "白名单",
"registered": "注册于", "unknown": "一个未知的时间"
"search": "搜索……", },
"whitelist": "白名单", "manage": "管理客户端",
"unknown": "一个未知的时间" "more-info": {
}, "contacts": "管理员联系方式:",
"manage": "管理客户端", "home": "主页",
"more-info": { "more": "更多信息",
"contacts": "管理员联系方式:", "policy": "政策",
"home": "主页", "terms": "服务条款:"
"more": "更多信息", },
"policy": "政策", "newClient": "新客户端"
"terms": "服务条款:" },
}, "common": {
"newClient": "新客户端" "cancel": "取消",
}, "client": "客户端",
"common": { "clients": "客户端",
"cancel": "取消", "close": "关闭",
"client": "客户端", "delete": "删除",
"clients": "客户端", "description": "描述",
"close": "关闭", "dynamically-registered": "这个客户端是动态注册的",
"delete": "删除", "edit": "编辑",
"description": "描述", "expires": "到期:",
"dynamically-registered": "这个客户端是动态注册的", "information": "信息",
"edit": "编辑", "new": "新建",
"expires": "到期:", "not-yet-implemented": "未实现",
"information": "信息", "not-yet-implemented-content": "这个字段的值将于客户端保存,但服务器目前不处理任何事情。服务器的未来库版本将利用它。",
"new": "新建", "revoke": "撤销",
"not-yet-implemented": "未实现", "save": "保存",
"not-yet-implemented-content": "这个字段的值将于客户端保存,但服务器目前不处理任何事情。服务器的未来库版本将利用它。", "scopes": "范围",
"revoke": "撤销", "statistics": "统计",
"save": "保存", "refresh": "刷新",
"scopes": "范围", "scope": "范围",
"statistics": "统计", "users": "用户",
"refresh": "刷新", "user": "用户",
"scope": "范围", "roles": "角色",
"users": "用户", "role": "角色",
"user": "用户", "email": "电子邮箱",
"roles": "角色", "active": "已激活",
"role": "角色", "inactive": "未激活"
"email": "电子邮箱", },
"active": "已激活", "dynreg": {
"inactive": "未激活" "client-id-placeholder": "输入客户端ID",
}, "configuration-url": "客户端配置URL",
"dynreg": { "edit-dynamically-registered": "编辑动态注册的客户端",
"client-id-placeholder": "输入客户端ID", "edit-existing": "编辑一个现有的客户端",
"configuration-url": "客户端配置URL", "edit-existing-help": "用于编辑之前已注册的客户端。粘贴您的客户端ID和注册访问令牌以便访问该客户端。",
"edit-dynamically-registered": "编辑动态注册的客户端", "edit-existing-button": "编辑客户端",
"edit-existing": "编辑一个现有的客户端", "invalid-access-token": "无效的客户端或注册访问令牌。",
"edit-existing-help": "用于编辑之前已注册的客户端。粘贴您的客户端ID和注册访问令牌以便访问该客户端。", "new-client": "注册新客户端",
"edit-existing-button": "编辑客户端", "new-client-help": "用于注册新的客户端。请提供客户端ID和注册访问令牌以便管理您的客户端。",
"invalid-access-token": "无效的客户端或注册访问令牌。", "new-client-button": "新建客户端",
"new-client": "注册新客户端", "regtoken-placeholder": "输入注册访问令牌",
"new-client-help": "用于注册新的客户端。请提供客户端ID和注册访问令牌以便管理您的客户端。", "warning": "<strong>警告!</strong>你必须保护好<b>客户端ID </b><b>客户密钥(如果提供)</b>,以及您的<b>注册访问令牌</b>。如果你丢失了客户端ID或注册访问令牌将无法访问您的客户端注册记录你需要注册一个新客户端。",
"new-client-button": "新建客户端", "will-be-generated": "当保存客户端信息将由服务器生成"
"regtoken-placeholder": "输入注册访问令牌", },
"warning": "<strong>警告!</strong>你必须保护好<b>客户端ID </b><b>客户密钥(如果提供)</b>,以及您的<b>注册访问令牌</b>。如果你丢失了客户端ID或注册访问令牌将无法访问您的客户端注册记录你需要注册一个新客户端。", "grant": {
"will-be-generated": "当保存客户端信息将由服务器生成" "manage-approved-sites": "管理批准的网站",
}, "refresh": "刷新",
"grant": { "grant-table": {
"manage-approved-sites": "管理批准的网站", "active-tokens": "当前活跃的访问令牌数量",
"refresh": "刷新", "application": "应用程序",
"grant-table": { "approved-sites": "许可站点",
"active-tokens": "当前活跃的访问令牌数量", "authorized": "授权:",
"application": "应用程序", "dynamically-registered": "这个客户端是动态注册的",
"approved-sites": "许可站点", "expires": "到期:",
"authorized": "授权:", "last-accessed": "上次访问:",
"dynamically-registered": "这个客户端是动态注册的", "never": "从未",
"expires": "到期:", "no-sites": "还未批准任何网站。",
"last-accessed": "上次访问:", "no-whitelisted": "还未访问任何白名单的网站。",
"never": "从未", "pre-approved": "这些都是预先由管理员批准的网站。",
"no-sites": "还未批准任何网站。", "text": "这些都是您已经手动批准的网站。如果同一网站将来要进行同样的访问,它将直接通过、且没有提示。",
"no-whitelisted": "还未访问任何白名单的网站。", "unknown": "未知",
"pre-approved": "这些都是预先由管理员批准的网站。", "whitelist-note": "<b>注:</b>如果你在此撤销它们,它们将在您下次访问时不经提示即被自动重新批准。",
"text": "这些都是您已经手动批准的网站。如果同一网站将来要进行同样的访问,它将直接通过、且没有提示。", "whitelisted-site": "这个网站由管理员列入白名单中",
"unknown": "未知", "whitelisted-sites": "白名单的网站"
"whitelist-note": "<b>注:</b>如果你在此撤销它们,它们将在您下次访问时不经提示即被自动重新批准。", }
"whitelisted-site": "这个网站由管理员列入白名单中", },
"whitelisted-sites": "白名单的网站" "rsreg": {
} "resource-id-placeholder": "输入资源ID",
}, "configuration-url": "客户端配置URL",
"rsreg": { "edit": "编辑受保护的资源",
"resource-id-placeholder": "输入资源ID", "edit-existing": "编辑现有的保护资源",
"configuration-url": "客户端配置URL", "edit-existing-help": "用于编辑之前已注册的资源。请提供您的客戶端ID和注册访问令牌来访问资源的属性。",
"edit": "编辑受保护的资源", "edit-existing-button": "编辑资源",
"edit-existing": "编辑现有的保护资源", "invalid-access-token": "无效的客户端或注册访问令牌。",
"edit-existing-help": "用于编辑之前已注册的资源。请提供您的客戶端ID和注册访问令牌来访问资源的属性。", "new-client": "注册新的受保护资源",
"edit-existing-button": "编辑资源", "new-client-help": "用于注册新的资源。请提供客户端ID和注册访问令牌以便管理您的资源。",
"invalid-access-token": "无效的客户端或注册访问令牌。", "new-client-button": "新建资源",
"new-client": "注册新的受保护资源", "regtoken-placeholder": "输入注册访问令牌",
"new-client-help": "用于注册新的资源。请提供客户端ID和注册访问令牌以便管理您的资源。", "will-be-generated": "当保存资源信息将由服务器生成",
"new-client-button": "新建资源", "warning": "<strong>警告!</strong>你必须保护好<b>客户端ID </b><b>客户密钥(如果提供)</b>,以及<b>注册访问令牌</b>。如果丢失了客户端ID或注册访问令牌将无法再次获得您的客户端注册记录你需要注册一个新客户端。",
"regtoken-placeholder": "输入注册访问令牌", "client-form": {
"will-be-generated": "当保存资源信息将由服务器生成", "scope-help": "这个资源能够自省令牌的范围。"
"warning": "<strong>警告!</strong>你必须保护好<b>客户端ID </b><b>客户密钥(如果提供)</b>,以及<b>注册访问令牌</b>。如果丢失了客户端ID或注册访问令牌将无法再次获得您的客户端注册记录你需要注册一个新客户端。", }
"client-form": { },
"scope-help": "这个资源能够自省令牌的范围。" "scope": {
} "manage": "管理系统范围",
}, "scope-list": {
"scope": { "no-scopes": "没有范围"
"manage": "管理系统范围", },
"scope-list": { "system-scope-form": {
"no-scopes": "没有范围" "default": "默认范围",
}, "default-help": "新创建的用户默认情况下获得这个范围?",
"system-scope-form": { "description-help": "人类可读的文本描述",
"default": "默认范围", "description-placeholder": "输入说明",
"default-help": "新创建的用户默认情况下获得这个范围?", "restricted": "限制",
"description-help": "人类可读的文本描述", "restricted-help": "限制范围只能由系统管理员使用,可用动态注册客户和保护资源",
"description-placeholder": "输入说明", "edit": "编辑范围",
"restricted": "限制", "icon": "图标",
"restricted-help": "限制范围只能由系统管理员使用,可用动态注册客户和保护资源", "new": "新范围",
"edit": "编辑范围", "select-icon": "选择图标",
"icon": "图标", "structured": "是一个结构化的范围",
"new": "新范围", "structured-help": "范围结构化是否包含如<code>base:extension</code>的结构化值?",
"select-icon": "选择图标", "structured-param-help": "人类可读的结构化参数描述",
"structured": "是一个结构化的范围", "subject-type": "主体类型",
"structured-help": "范围结构化是否包含如<code>base:extension</code>的结构化值?", "value": "范围值",
"structured-param-help": "人类可读的结构化参数描述", "value-help": "不含空格的单个字符串",
"subject-type": "主体类型", "value-placeholder": "范围"
"value": "范围值", },
"value-help": "不含空格的单个字符串", "system-scope-table": {
"value-placeholder": "范围" "confirm": "你确定要删除此范围?引用了此范围的客户端还需要它。",
}, "new": "新范围",
"system-scope-table": { "text": "尚未定义系统范围。客户可自定义范围。",
"confirm": "你确定要删除此范围?引用了此范围的客户端还需要它。", "tooltip-restricted": "此范围只能由管理员使用。它不能用于动态注册。",
"new": "新范围", "tooltip-default": "这个范围将自动分配给新注册的客户。"
"text": "尚未定义系统范围。客户可自定义范围。", }
"tooltip-restricted": "此范围只能由管理员使用。它不能用于动态注册。", },
"tooltip-default": "这个范围将自动分配给新注册的客户。" "token": {
} "manage": "管理活动的令牌",
}, "token-table": {
"token": { "access-tokens": "访问令牌",
"manage": "管理活动的令牌", "associated-id": "这个访问令牌附带相关的身份令牌。",
"token-table": { "associated-refresh": "这个访问令牌附带相关的刷新令牌。",
"access-tokens": "访问令牌", "click-to-display": "点击显示完整的令牌值",
"associated-id": "这个访问令牌附带相关的身份令牌。", "confirm": "你确定要撤销这个令牌?",
"associated-refresh": "这个访问令牌附带相关的刷新令牌。", "confirm-refresh": "你确定要撤销这个刷新令牌及其相关的访问令牌?",
"click-to-display": "点击显示完整的令牌值", "expires": "过期",
"confirm": "你确定要撤销这个令牌?", "no-access": "没有活动的访问令牌。",
"confirm-refresh": "你确定要撤销这个刷新令牌及其相关的访问令牌?", "no-refresh": "没有活动的刷新令牌。",
"expires": "过期", "number-of-tokens": "关联的访问令牌数量",
"no-access": "没有活动的访问令牌。", "refresh-tokens": "刷新令牌",
"no-refresh": "没有活动的刷新令牌。", "text": "访问令牌通常是短暂的供客户端访问特定的资源。身份令牌是采用OpenID Connect协议登录的、专门的访问令牌。",
"number-of-tokens": "关联的访问令牌数量", "text-refresh": "刷新令牌通常是长期的,以便客户端能无需用户介入即可获取新的访问令牌。",
"refresh-tokens": "刷新令牌", "token-info": "令牌的信息"
"text": "访问令牌通常是短暂的供客户端访问特定的资源。身份令牌是采用OpenID Connect协议登录的、专门的访问令牌。", }
"text-refresh": "刷新令牌通常是长期的,以便客户端能无需用户介入即可获取新的访问令牌。", },
"token-info": "令牌的信息" "whitelist": {
} "confirm": "你确定要删除这个白名单项?",
}, "edit": "编辑白名单",
"whitelist": { "manage": "管理列入白名单的网站",
"confirm": "你确定要删除这个白名单项?", "new": "新白名单",
"edit": "编辑白名单", "whitelist": "白名单",
"manage": "管理列入白名单的网站", "whitelist-form": {
"new": "新白名单", "allowed-scopes": "允许范围",
"whitelist": "白名单", "edit": "编辑白名单的网站",
"whitelist-form": { "new": "新增白名单网站",
"allowed-scopes": "允许范围", "scope-help": "当客户端发出请求列表时将自动批准的范围",
"edit": "编辑白名单的网站", "scope-placeholder": "新范围"
"new": "新增白名单网站", },
"scope-help": "当客户端发出请求列表时将自动批准的范围", "whitelist-table": {
"scope-placeholder": "新范围" "no-sites": "白名单列表为空。使用<strong>白名单</strong>按钮在客户端管理页面创建一个。"
}, }
"whitelist-table": { },
"no-sites": "白名单列表为空。使用<strong>白名单</strong>按钮在客户端管理页面创建一个。" "blacklist": {
} "text": "被拉黑的网站URI将无法用做注册客户端的重定向地址无论是在管理界面中添加、还是动态注册都不会成功。",
}, "blacklist-uri-placeholder": "要拉黑的网站URI",
"blacklist": { "add": "将网站URI加入黑名单",
"text": "被拉黑的网站URI将无法用做注册客户端的重定向地址无论是在管理界面中添加、还是动态注册都不会成功。", "empty": "当前黑名单为空",
"blacklist-uri-placeholder": "要拉黑的网站URI", "uri": "URI"
"add": "将网站URI加入黑名单", },
"empty": "当前黑名单为空", "copyright": "基于<a href=\"https://github.com/mitreid-connect/\">MITREid Connect <span class=\"label\">{0}</span></a>技术构建 <span class=\"pull-right\">&copy; 2016 MITRE公司及MIT因特网信任联盟</span>.",
"uri": "URI" "about": {
}, "title": "关于",
"copyright": "基于<a href=\"https://github.com/mitreid-connect/\">MITREid Connect <span class=\"label\">{0}</span></a>技术构建 <span class=\"pull-right\">&copy; 2016 MITRE公司及MIT因特网信任联盟</span>.", "body": "\n此OpenID Connect服务基于开源的MITREid Connect项目该项目来自 \n<a href=\"http://www.mitre.org/\">MITRE公司</a> 及 <a href=\"http://www.trust.mit.edu/\">MIT因特网信任联盟</a>。\n</p>\n<p>\n有关项目的更多信息可见 \n<a href=\"http://github.com/mitreid-connect/\">GitHub上的MITREid Connect项目</a>。 \n在那儿您可以提交bug报告、提交反馈甚或提交代码补丁。"
"about": { },
"title": "关于", "statistics": {
"body": "\n此OpenID Connect服务基于开源的MITREid Connect项目该项目来自 \n<a href=\"http://www.mitre.org/\">MITRE公司</a> 及 <a href=\"http://www.trust.mit.edu/\">MIT因特网信任联盟</a>。\n</p>\n<p>\n有关项目的更多信息可见 \n<a href=\"http://github.com/mitreid-connect/\">GitHub上的MITREid Connect项目</a>。 \n在那儿您可以提交bug报告、提交反馈甚或提交代码补丁。" "title": "统计",
}, "number_users": "用户数: <span class=\"label label-info\" id=\"userCount\">{0}</span>",
"statistics": { "number_clients": "授权的客户端: <span class=\"label label-info\" id=\"clientCount\">{0}</span>",
"title": "统计", "number_approvals": "已批准的站点: <span class=\"label label-info\" id=\"approvalCount\">{0}</span>"
"number_users": "用户数: <span class=\"label label-info\" id=\"userCount\">{0}</span>", },
"number_clients": "授权的客户端: <span class=\"label label-info\" id=\"clientCount\">{0}</span>", "home": {
"number_approvals": "已批准的站点: <span class=\"label label-info\" id=\"approvalCount\">{0}</span>" "title": "首页",
}, "welcome": {
"home": { "title": "欢迎!",
"title": "首页", "body": "\nOpenID Connect是适于因特网部署的身份联邦认证服务器基于OAuth2授权框架之上的OpenID Connect技术构建。\nOpenID Connect让您无需暴露自己的用户名、密码即可便捷登录网站。</p>\n<p><a class=\"btn btn-primary btn-large\" href=\"http://openid.net/connect/\">了解更多信息&raquo;</a>"
"welcome": { },
"title": "欢迎!", "more": "更多",
"body": "\nOpenID Connect是适于因特网部署的身份联邦认证服务器基于OAuth2授权框架之上的OpenID Connect技术构建。\nOpenID Connect让您无需暴露自己的用户名、密码即可便捷登录网站。</p>\n<p><a class=\"btn btn-primary btn-large\" href=\"http://openid.net/connect/\">了解更多信息&raquo;</a>" "about": {
}, "title": "关于",
"more": "更多", "body": "本服务基于开源的MITREid Connect项目该项目来自 \n<a href=\"http://www.mitre.org/\">MITRE公司</a> 及 <a href=\"http://www.trust.mit.edu/\">MIT因特网信任联盟</a>。"
"about": { },
"title": "关于", "contact": {
"body": "本服务基于开源的MITREid Connect项目该项目来自 \n<a href=\"http://www.mitre.org/\">MITRE公司</a> 及 <a href=\"http://www.trust.mit.edu/\">MIT因特网信任联盟</a>。" "title": "联系方式",
}, "body": "\n如需更多的信息和支持请联系本系统的管理员。</p>\n<p><a class=\"btn\" href=\"mailto:idp@example.com?Subject=OpenID Connect\">电子信箱 &raquo;</a>"
"contact": { },
"title": "联系方式", "statistics": {
"body": "\n如需更多的信息和支持请联系本系统的管理员。</p>\n<p><a class=\"btn\" href=\"mailto:idp@example.com?Subject=OpenID Connect\">电子信箱 &raquo;</a>" "title": "当前统计",
}, "loading": "加载……",
"statistics": { "number_users": "用户数: <span class=\"label label-info\" id=\"userCount\">{0}</span>",
"title": "当前统计", "number_clients": "授权的客户端: <span class=\"label label-info\" id=\"clientCount\">{0}</span>",
"loading": "加载……", "number_approvals": "已批准的站点: <span class=\"label label-info\" id=\"approvalCount\">{0}</span>"
"number_users": "用户数: <span class=\"label label-info\" id=\"userCount\">{0}</span>", }
"number_clients": "授权的客户端: <span class=\"label label-info\" id=\"clientCount\">{0}</span>", },
"number_approvals": "已批准的站点: <span class=\"label label-info\" id=\"approvalCount\">{0}</span>" "contact": {
} "title": "联系方式",
}, "body": "如果要报告有关MITREid Connect软件自身的bug请访问\n<a href=\"https://github.com/mitreid-connect/OpenID-Connect-Java-Spring-Server/issues\">GitHub issue追踪系统</a>。 \n有关当前服务器的问题请联系服务器管理员。"
"contact": { },
"title": "联系方式", "topbar": {
"body": "如果要报告有关MITREid Connect软件自身的bug请访问\n<a href=\"https://github.com/mitreid-connect/OpenID-Connect-Java-Spring-Server/issues\">GitHub issue追踪系统</a>。 \n有关当前服务器的问题请联系服务器管理员。" "about": "关于",
}, "contact": "联系方式",
"topbar": { "statistics": "统计",
"about": "关于", "home": "首页",
"contact": "联系方式", "login": "登录",
"statistics": "统计", "logout": "注销"
"home": "首页", },
"login": "登录", "sidebar": {
"logout": "注销" "administrative": {
}, "title": "管理",
"sidebar": { "manage_clients": "管理客户端",
"administrative": { "whitelisted_clients": "白名单",
"title": "管理", "blacklisted_clients": "黑名单",
"manage_clients": "管理客户端", "system_scopes": "系统范围"
"whitelisted_clients": "白名单", },
"blacklisted_clients": "黑名单", "personal": {
"system_scopes": "系统范围" "title": "个人",
}, "approved_sites": "管理批准的网站",
"personal": { "active_tokens": "管理活动的令牌",
"title": "个人", "profile_information": "查看用户信息"
"approved_sites": "管理批准的网站", },
"active_tokens": "管理活动的令牌", "developer": {
"profile_information": "查看用户信息" "title": "开发者自助服务",
}, "client_registration": "客户端注册",
"developer": { "resource_registration": "保护资源注册"
"title": "开发者自助服务", }
"client_registration": "客户端注册", },
"resource_registration": "保护资源注册" "manage": {
} "ok": "好的",
}, "loading": "加载",
"manage": { "title": "管理控制台"
"ok": "好的", },
"loading": "加载", "approve": {
"title": "管理控制台" "dynamically-registered-unknown": "在一个未知的时间",
}, "title": "批准访问",
"approve": { "error": {
"dynamically-registered-unknown": "在一个未知的时间", "not_granted": "访问可能不获批准。"
"title": "批准访问", },
"error": { "required_for": "有待批准",
"not_granted": "访问可能不获批准。" "dynamically_registered": "此客户端已被动态注册了<span class=\"label label-info\" id=\"registrationTime\">{0}</span>次。",
}, "caution": {
"required_for": "有待批准", "title": "注意",
"dynamically_registered": "此客户端已被动态注册了<span class=\"label label-info\" id=\"registrationTime\">{0}</span>次。", "message": {
"caution": { "none": "它之前<span class=\"label label-important\">从未</span>被批准。",
"title": "注意", "singular": "它之前已被批准了<span class=\"label label-warning\">{0}</span>次。",
"message": { "plural": "它之前已被批准了<span class=\"label\">{0}</span>次。"
"none": "它之前<span class=\"label label-important\">从未</span>被批准。", }
"singular": "它之前已被批准了<span class=\"label label-warning\">{0}</span>次。", },
"plural": "它之前已被批准了<span class=\"label\">{0}</span>次。" "more_information": "更多信息",
} "home_page": "主页",
}, "policy": "政策",
"more_information": "更多信息", "terms": "服务条款",
"home_page": "主页", "contacts": "管理人员",
"policy": "政策", "warning": "警告",
"terms": "服务条款", "no_redirect_uri": "该客户端没有注册任何重定向URI可能被使用恶意的URI。",
"contacts": "管理人员", "redirect_uri": "如果点击批准,您将被重定向至如下页面: <code>{0}</code>",
"warning": "警告", "pairwise": "该客户端使用<b>pairwise</b>标识符,这使得在不同站点间关联身份变得稍加困难。",
"no_redirect_uri": "该客户端没有注册任何重定向URI可能被使用恶意的URI。", "no_scopes": "该客户端没有注册任何范围,因此允许请求系统可用的<em>any</em>(任意)范围。请务必谨慎处理。",
"redirect_uri": "如果点击批准,您将被重定向至如下页面: <code>{0}</code>", "access_to": "访问",
"pairwise": "该客户端使用<b>pairwise</b>标识符,这使得在不同站点间关联身份变得稍加困难。", "remember": {
"no_scopes": "该客户端没有注册任何范围,因此允许请求系统可用的<em>any</em>(任意)范围。请务必谨慎处理。", "title": "记住这个决定",
"access_to": "访问", "until_revoke": "记住这个决定直到我撤销",
"remember": { "one_hour": "记住该决定一个小时",
"title": "记住这个决定", "next_time": "下次再提醒我"
"until_revoke": "记住这个决定直到我撤销", },
"one_hour": "记住该决定一个小时", "do_authorize": "是否授权",
"next_time": "下次再提醒我" "label": {
}, "authorize": "授权",
"do_authorize": "是否授权", "deny": "拒绝"
"label": { }
"authorize": "授权", },
"deny": "拒绝" "error": {
} "title": "错误",
}, "header": "错误:",
"error": { "message": "在处理您的请求过程中发生了错误。服务器信息为:"
"title": "错误", },
"header": "错误:", "login": {
"message": "在处理您的请求过程中发生了错误。服务器信息为:" "login_with_username_and_password": "请使用您的用户名及密码登录",
}, "username": "用户名",
"login": { "password": "密码",
"login_with_username_and_password": "请使用您的用户名及密码登录", "login-button": "登录",
"username": "用户名", "error": "登录失败。请重试。"
"password": "密码", }
"login-button": "登录", }
"error": "登录失败。请重试。"
}
}

View File

@ -1,490 +1,487 @@
{ {
"admin": { "admin": {
"blacklist": "黑名单", "blacklist": "黑名单",
"blacklist-form": { "blacklist-form": {
"blacklisted-uris": "列入黑名单的URI" "blacklisted-uris": "列入黑名单的URI"
}, },
"home": "首页", "home": "首页",
"list-widget": { "list-widget": {
"empty": "此列表为空。", "empty": "此列表为空。",
"tooltip": "单击显示全部值。" "tooltip": "单击显示全部值。"
}, },
"manage-blacklist": "管理列入黑名单的客户端", "manage-blacklist": "管理列入黑名单的客户端",
"self-service-client": "自助服务-客户端注册", "self-service-client": "自助服务-客户端注册",
"self-service-resource": "自助服务-受保护资源注册", "self-service-resource": "自助服务-受保护资源注册",
"user-profile": { "user-profile": {
"claim": "声明项", "claim": "声明项",
"show": "查看用户信息", "show": "查看用户信息",
"text": "您的用户信息如下:", "text": "您的用户信息如下:",
"value": "内容" "value": "内容"
} }
}, },
"client": { "client": {
"client-form": { "client-form": {
"access": "访问", "access": "访问",
"access-token-no-timeout": "访问令牌不时间", "access-token-no-timeout": "访问令牌不时间",
"access-token-timeout": "访问令牌超时", "access-token-timeout": "访问令牌超时",
"access-token-timeout-help": "输入时间(秒、分钟或小时)。", "access-token-timeout-help": "输入时间(秒、分钟或小时)。",
"acr-values": "默认ACR值", "acr-values": "默认ACR值",
"acr-values-placeholder": "新的ACR值", "acr-values-placeholder": "新的ACR值",
"acr-values-help": "用于请求该客户端的默认身份验证上下文参考", "acr-values-help": "用于请求该客户端的默认身份验证上下文参考",
"allow-introspection": "允许调用内省端点?", "allow-introspection": "允许调用内省端点?",
"authentication-method": "令牌端点认证方法", "authentication-method": "令牌端点认证方法",
"authorization-code": "授权码", "authorization-code": "授权码",
"client-credentials": "客户端凭证", "client-credentials": "客户端凭证",
"client-description": "描述", "client-description": "描述",
"client-description-help": "人类可读的文本描述", "client-description-help": "人类可读的文本描述",
"client-description-placeholder": "填入说明描述", "client-description-placeholder": "填入说明描述",
"client-id": "客户端ID", "client-id": "客户端ID",
"client-id-help": "唯一标识符。如果不填则系统会自动生成一个。", "client-id-help": "唯一标识符。如果不填则系统会自动生成一个。",
"client-id-placeholder": "输入一些字符", "client-id-placeholder": "输入一些字符",
"client-name": "客户端名称", "client-name": "客户端名称",
"client-name-help": "人类可读的应用程序名称", "client-name-help": "人类可读的应用程序名称",
"client-name-placeholder": "输入一些字符", "client-name-placeholder": "输入一些字符",
"client-secret": "客户端密钥", "client-secret": "客户端密钥",
"client-secret-placeholder": "输入密钥", "client-secret-placeholder": "输入密钥",
"contacts": "联系人", "contacts": "联系人",
"contacts-help": "此客户端管理员的联系人名单。", "contacts-help": "此客户端管理员的联系人名单。",
"contacts-placeholder": "新联系人", "contacts-placeholder": "新联系人",
"credentials": "凭据", "credentials": "凭据",
"crypto": { "crypto": {
"a128cbc-hs256": "复合认证加密算法采用密码块链CBC模式AES以PKCS #5填充完整性计算使用HMAC SHA-256并使用256位的CMK和128位CEK", "a128cbc-hs256": "复合认证加密算法采用密码块链CBC模式AES以PKCS #5填充完整性计算使用HMAC SHA-256并使用256位的CMK和128位CEK",
"a256cbc-hs512": "复合认证加密算法采用密码块链CBC模式AES以PKCS #5填充完整性计算使用HMAC SHA-512并使用512位的CMK和256位CEK", "a256cbc-hs512": "复合认证加密算法采用密码块链CBC模式AES以PKCS #5填充完整性计算使用HMAC SHA-512并使用512位的CMK和256位CEK",
"a128gcm": "AES GCM使用128位的密钥", "a128gcm": "AES GCM使用128位的密钥",
"a256gcm": "AES GCM使用256位的密钥", "a256gcm": "AES GCM使用256位的密钥",
"a128kw": "AES密钥封装算法使用128位的密钥", "a128kw": "AES密钥封装算法使用128位的密钥",
"a256kw": "AES密钥封装算法使用256位的密钥", "a256kw": "AES密钥封装算法使用256位的密钥",
"default": "使用服务器默认", "default": "使用服务器默认",
"dir": "直接使用一个共享对称密钥作为块加密的内容主密钥CMK", "dir": "直接使用一个共享对称密钥作为块加密的内容主密钥CMK",
"ecdh-es": "椭圆曲线Diffie-Hellman短时静态密钥协议使用Concat KDF商定的密钥被直接用作内容主密钥CMK", "ecdh-es": "椭圆曲线Diffie-Hellman短时静态密钥协议使用Concat KDF商定的密钥被直接用作内容主密钥CMK",
"ecdh-es-a128kw": "椭圆曲线Diffie-Hellman短时静态密钥协议使用ECDH-ES和第4.7小节但商定的密钥是用以A128KW函数封装内容主密钥CMK", "ecdh-es-a128kw": "椭圆曲线Diffie-Hellman短时静态密钥协议使用ECDH-ES和第4.7小节但商定的密钥是用以A128KW函数封装内容主密钥CMK",
"ecdh-es-a256kw": "椭圆曲线Diffie-Hellman短时静态密钥协议使用ECDH-ES和第4.7小节但商定的密钥是用以A256KW函数封装内容主密钥CMK", "ecdh-es-a256kw": "椭圆曲线Diffie-Hellman短时静态密钥协议使用ECDH-ES和第4.7小节但商定的密钥是用以A256KW函数封装内容主密钥CMK",
"none": "不加密", "none": "不加密",
"rsa-oaep": "RSAES使用最优不对称加密填充OAEP", "rsa-oaep": "RSAES使用最优不对称加密填充OAEP",
"rsa1-5": "RSAES-PKCS1-V1_5" "rsa1-5": "RSAES-PKCS1-V1_5"
}, },
"cryptography": "密码", "cryptography": "密码",
"display-secret": "显示/编辑客户端密钥:", "display-secret": "显示/编辑客户端密钥:",
"edit": "编辑客户端", "edit": "编辑客户端",
"generate-new-secret": "生成一个新的客户端密钥吗?", "generate-new-secret": "生成一个新的客户端密钥吗?",
"generate-new-secret-help": "当点击“保存”时生成新的密钥", "generate-new-secret-help": "当点击“保存”时生成新的密钥",
"generate-on-save": "保存时生成", "generate-on-save": "保存时生成",
"grant-types": "批准的类型", "grant-types": "批准的类型",
"home": "主页", "home": "主页",
"home-help": "客户端首页的URL将显示给用户", "home-help": "客户端首页的URL将显示给用户",
"hours": "小时", "hours": "小时",
"id": "ID", "id": "ID",
"id-token-crypto-algorithm": "身份令牌加密算法", "id-token-crypto-algorithm": "身份令牌加密算法",
"id-token-crypto-method": "身份令牌加密方法", "id-token-crypto-method": "身份令牌加密方法",
"id-token-signing-algorithm": "身份令牌签名算法", "id-token-signing-algorithm": "身份令牌签名算法",
"id-token-timeout": "身份令牌超时", "id-token-timeout": "身份令牌超时",
"implicit": "隐式的", "implicit": "隐式的",
"initiate-login": "初始化登录", "initiate-login": "初始化登录",
"initiate-login-help": "启动登录客户端的URL", "initiate-login-help": "启动登录客户端的URL",
"introspection": "自省", "introspection": "自省",
"jwk-set": "公钥集", "jwk-set": "公钥集",
"jwk-set-help": "客户端JSON Web Key集的URL (须可被服务器访问)", "jwk-set-help": "客户端JSON Web Key集的URL (须可被服务器访问)",
"jwk-set-value-help": "客户端JSON Web Key集的URL (须可被服务器访问)", "jwk-set-value-help": "客户端JSON Web Key集的URL (须可被服务器访问)",
"logo": "标志Logo)", "main": "首要",
"logo-help": "标志Logo图像的URL将显示在批准页", "max-age": "默认最长有效时间",
"main": "首要", "max-age-help": "再提示之前的默认最长会话有效时间",
"max-age": "默认最长有效时间", "minutes": "分钟",
"max-age-help": "再提示之前的默认最长会话有效时间", "new": "新客户端",
"minutes": "分钟", "other": "其它",
"new": "新客户端", "pairwise": "Pairwise对",
"other": "其它", "password": "密码",
"pairwise": "Pairwise对", "policy": "政策声明",
"password": "密码", "policy-help": "此客户端的政策声明链接,将显示给用户",
"policy": "政策声明", "post-logout": "注销后重定向",
"policy-help": "此客户端的政策声明链接,将显示给用户", "post-logout-help": "客户端注销操作后的重定向URL",
"post-logout": "注销后重定向", "public": "公共",
"post-logout-help": "客户端注销操作后的重定向URL", "redelegation": "重新授权",
"public": "公共", "redirect-uris": "重定向URI",
"redelegation": "重新授权", "redirect-uris-help": "在授权页面之后客户端重定向URI",
"redirect-uris": "重定向URI", "claims-redirect-uris": "声明重定向URI",
"redirect-uris-help": "在授权页面之后客户端重定向URI", "claims-redirect-uris-help": "在声明收集步骤之后浏览器跳转至的目的地址",
"claims-redirect-uris": "声明重定向URI", "refresh": "刷新",
"claims-redirect-uris-help": "在声明收集步骤之后浏览器跳转至的目的地址", "refresh-tokens": "刷新令牌",
"refresh": "刷新", "refresh-tokens-issued": "为此客户端发布的刷新令牌",
"refresh-tokens": "刷新令牌", "refresh-tokens-issued-help": "这将把 offline_access 加入客户端的范围。",
"refresh-tokens-issued": "为此客户端发布的刷新令牌", "refresh-tokens-reused": "此客户端的刷新令牌被重用",
"refresh-tokens-issued-help": "这将把 offline_access 加入客户端的范围。", "clear-access-tokens": "当刷新令牌用过之后,已激活的访问令牌自动失效",
"refresh-tokens-reused": "此客户端的刷新令牌被重用", "refresh-tokens-no-expire": "刷新令牌尚未过期",
"clear-access-tokens": "当刷新令牌用过之后,已激活的访问令牌自动失效", "registered": "注册于",
"refresh-tokens-no-expire": "刷新令牌尚未过期", "registration-token": "注册令牌:",
"registered": "注册于", "registration-access-token": "注册访问令牌",
"registration-token": "注册令牌:", "registration-token-error": "无法为此客户端下载注册访问令牌。",
"registration-access-token": "注册访问令牌", "request-object-signing-algorithm": "请求对象签名算法",
"registration-token-error": "无法为此客户端下载注册访问令牌。", "request-uri": "请求的URI",
"request-object-signing-algorithm": "请求对象签名算法", "request-uri-help": "URI包含此客户端使用的请求对象",
"request-uri": "请求的URI", "require-auth-time": "需要身份认证时间(auth_time)",
"request-uri-help": "URI包含此客户端使用的请求对象", "require-auth-time-label": "总是需要在身份令牌中包含auth_time声明",
"require-auth-time": "需要身份认证时间(auth_time)", "response-types": "响应类型",
"require-auth-time-label": "总是需要在身份令牌中包含auth_time声明", "rotate-registration-token": "旋转注册令牌",
"response-types": "响应类型", "rotate-registration-token-confirm": "你确定你想旋转这个客户端的登录令牌?",
"rotate-registration-token": "旋转注册令牌", "rotate-registration-token-error": "无法旋转该客户端的注册访问令牌。",
"rotate-registration-token-confirm": "你确定你想旋转这个客户端的登录令牌?", "saved": {
"rotate-registration-token-error": "无法旋转该客户端的注册访问令牌。", "no-secret": "没有客户端密钥",
"saved": { "saved": "客户端已保存",
"no-secret": "没有客户端密钥", "secret": "密钥:",
"saved": "客户端已保存", "show-secret": "显示密钥",
"secret": "密钥:", "unchanged": "不变"
"show-secret": "显示密钥", },
"unchanged": "不变" "scope-placeholder": "新范围",
}, "scope-help": "OAuth范围允许客户端请求",
"scope-placeholder": "新范围", "seconds": "秒",
"scope-help": "OAuth范围允许客户端请求", "secret-asymmetric-jwt": "非对称签名JWT断言",
"seconds": "秒", "secret-http": "客户端密钥经由HTTP Basic",
"secret-asymmetric-jwt": "非对称签名JWT断言", "secret-none": "没有认证",
"secret-http": "客户端密钥经由HTTP Basic", "secret-post": "客户端密钥经由HTTP POST",
"secret-none": "没有认证", "secret-symmetric-jwt": "客户端密钥经由对称签名JWT断言",
"secret-post": "客户端密钥经由HTTP POST", "sector-identifier": "扇区标识符URI",
"secret-symmetric-jwt": "客户端密钥经由对称签名JWT断言", "signing": {
"sector-identifier": "扇区标识符URI", "any": "允许",
"signing": { "default": "使用服务器默认",
"any": "允许", "es256": "ECDSA采用P-256曲线和SHA-256哈希算法",
"default": "使用服务器默认", "es384": "ECDSA采用P-384曲线及SHA-384哈希算法",
"es256": "ECDSA采用P-256曲线和SHA-256哈希算法", "es512": "ECDSA采用P-512曲线及SHA-512哈希算法",
"es384": "ECDSA采用P-384曲线及SHA-384哈希算法", "hs256": "HMAC使用SHA-256哈希算法",
"es512": "ECDSA采用P-512曲线及SHA-512哈希算法", "hs384": "HMAC使用SHA-384哈希算法",
"hs256": "HMAC使用SHA-256哈希算法", "hs512": "HMAC使用SHA-512哈希算法",
"hs384": "HMAC使用SHA-384哈希算法", "none": "没有数字签名",
"hs512": "HMAC使用SHA-512哈希算法", "rs256": "RSASSA使用SHA-256哈希算法",
"none": "没有数字签名", "rs384": "RSASSA采用SHA-384哈希算法",
"rs256": "RSASSA使用SHA-256哈希算法", "rs512": "RSASSA使用SHA-512哈希算法",
"rs384": "RSASSA采用SHA-384哈希算法", "ps256": "采用SHA-256和MGF1的RSASSA-PSS算法",
"rs512": "RSASSA使用SHA-512哈希算法", "ps384": "采用SHA-384和MGF1的RSASSA-PSS算法",
"ps256": "采用SHA-256和MGF1的RSASSA-PSS算法", "ps512": "采用SHA-512和MGF1的RSASSA-PSS算法"
"ps384": "采用SHA-384和MGF1的RSASSA-PSS算法", },
"ps512": "采用SHA-512和MGF1的RSASSA-PSS算法" "subject-type": "主体类型",
}, "terms": "服务条款",
"subject-type": "主体类型", "terms-help": "此客户服务条款的URL将向用户显示",
"terms": "服务条款", "token-signing-algorithm": "令牌端点认证签名算法",
"terms-help": "此客户服务条款的URL将向用户显示", "tokens": "令牌",
"token-signing-algorithm": "令牌端点认证签名算法", "type": "应用类型",
"tokens": "令牌", "type-native": "原生应用",
"type": "应用类型", "type-web": "网络应用",
"type-native": "原生应用", "unknown": "(未知)",
"type-web": "网络应用", "user-info-crypto-algorithm": "用户信息端点加密算法",
"unknown": "(未知)", "user-info-crypto-method": "用户信息端点加密方法",
"user-info-crypto-algorithm": "用户信息端点加密算法", "user-info-signing-algorithm": "用户信息端点签名算法"
"user-info-crypto-method": "用户信息端点加密方法", },
"user-info-signing-algorithm": "用户信息端点签名算法" "client-table": {
}, "allow-introspection-tooltip": "这个客户端可以执行令牌自省",
"client-table": { "confirm": "你确定要删除这个客户端?",
"allow-introspection-tooltip": "这个客户端可以执行令牌自省", "dynamically-registered-tooltip": "这个客户端是动态注册的。点击查看注册访问令牌",
"confirm": "你确定要删除这个客户端?", "match": {
"dynamically-registered-tooltip": "这个客户端是动态注册的。点击查看注册访问令牌", "contacts": "联系人",
"match": { "description": "描述",
"contacts": "联系人", "homepage": "主页",
"description": "描述", "id": "身份",
"homepage": "主页", "name": "名称",
"id": "身份", "policy": "政策",
"logo": "标志", "redirect": "重定向URI",
"name": "名称", "scope": "范围",
"policy": "政策", "terms": "服务条款"
"redirect": "重定向URI", },
"scope": "范围", "matched-search": "匹配搜索:",
"terms": "服务条款" "new": "新客户端",
}, "no-clients": "此服务器上没有注册的客户端。",
"matched-search": "匹配搜索:", "no-matches": "没有匹配搜索条件的客户端。",
"new": "新客户端", "no-redirect": "没有重定向URI",
"no-clients": "此服务器上没有注册的客户端。", "registered": "注册于",
"no-matches": "没有匹配搜索条件的客户端。", "search": "搜索……",
"no-redirect": "没有重定向URI", "whitelist": "白名单",
"registered": "注册于", "unknown": "一个未知的时间"
"search": "搜索……", },
"whitelist": "白名单", "manage": "管理客户端",
"unknown": "一个未知的时间" "more-info": {
}, "contacts": "管理员联系方式:",
"manage": "管理客户端", "home": "主页",
"more-info": { "more": "更多信息",
"contacts": "管理员联系方式:", "policy": "政策",
"home": "主页", "terms": "服务条款:"
"more": "更多信息", },
"policy": "政策", "newClient": "新客户端"
"terms": "服务条款:" },
}, "common": {
"newClient": "新客户端" "cancel": "取消",
}, "client": "客户端",
"common": { "clients": "客户端",
"cancel": "取消", "close": "关闭",
"client": "客户端", "delete": "删除",
"clients": "客户端", "description": "描述",
"close": "关闭", "dynamically-registered": "这个客户端是动态注册的",
"delete": "删除", "edit": "编辑",
"description": "描述", "expires": "到期:",
"dynamically-registered": "这个客户端是动态注册的", "information": "信息",
"edit": "编辑", "new": "新建",
"expires": "到期:", "not-yet-implemented": "未实现",
"information": "信息", "not-yet-implemented-content": "这个字段的值将于客户端保存,但服务器目前不处理任何事情。服务器的未来库版本将利用它。",
"new": "新建", "revoke": "撤销",
"not-yet-implemented": "未实现", "save": "保存",
"not-yet-implemented-content": "这个字段的值将于客户端保存,但服务器目前不处理任何事情。服务器的未来库版本将利用它。", "scopes": "范围",
"revoke": "撤销", "statistics": "统计",
"save": "保存", "refresh": "刷新",
"scopes": "范围", "scope": "范围",
"statistics": "统计", "users": "用户",
"refresh": "刷新", "user": "用户",
"scope": "范围", "roles": "角色",
"users": "用户", "role": "角色",
"user": "用户", "email": "电子邮箱",
"roles": "角色", "active": "已激活",
"role": "角色", "inactive": "未激活"
"email": "电子邮箱", },
"active": "已激活", "dynreg": {
"inactive": "未激活" "client-id-placeholder": "输入客户端ID",
}, "configuration-url": "客户端配置URL",
"dynreg": { "edit-dynamically-registered": "编辑动态注册的客户端",
"client-id-placeholder": "输入客户端ID", "edit-existing": "编辑一个现有的客户端",
"configuration-url": "客户端配置URL", "edit-existing-help": "用于编辑之前已注册的客户端。粘贴您的客户端ID和注册访问令牌以便访问该客户端。",
"edit-dynamically-registered": "编辑动态注册的客户端", "edit-existing-button": "编辑客户端",
"edit-existing": "编辑一个现有的客户端", "invalid-access-token": "无效的客户端或注册访问令牌。",
"edit-existing-help": "用于编辑之前已注册的客户端。粘贴您的客户端ID和注册访问令牌以便访问该客户端。", "new-client": "注册新客户端",
"edit-existing-button": "编辑客户端", "new-client-help": "用于注册新的客户端。请提供客户端ID和注册访问令牌以便管理您的客户端。",
"invalid-access-token": "无效的客户端或注册访问令牌。", "new-client-button": "新建客户端",
"new-client": "注册新客户端", "regtoken-placeholder": "输入注册访问令牌",
"new-client-help": "用于注册新的客户端。请提供客户端ID和注册访问令牌以便管理您的客户端。", "warning": "<strong>警告!</strong>你必须保护好<b>客户端ID </b><b>客户密钥(如果提供)</b>,以及您的<b>注册访问令牌</b>。如果你丢失了客户端ID或注册访问令牌将无法访问您的客户端注册记录你需要注册一个新客户端。",
"new-client-button": "新建客户端", "will-be-generated": "当保存客户端信息将由服务器生成"
"regtoken-placeholder": "输入注册访问令牌", },
"warning": "<strong>警告!</strong>你必须保护好<b>客户端ID </b><b>客户密钥(如果提供)</b>,以及您的<b>注册访问令牌</b>。如果你丢失了客户端ID或注册访问令牌将无法访问您的客户端注册记录你需要注册一个新客户端。", "grant": {
"will-be-generated": "当保存客户端信息将由服务器生成" "manage-approved-sites": "管理批准的网站",
}, "refresh": "刷新",
"grant": { "grant-table": {
"manage-approved-sites": "管理批准的网站", "active-tokens": "当前活跃的访问令牌数量",
"refresh": "刷新", "application": "应用程序",
"grant-table": { "approved-sites": "许可站点",
"active-tokens": "当前活跃的访问令牌数量", "authorized": "授权:",
"application": "应用程序", "dynamically-registered": "这个客户端是动态注册的",
"approved-sites": "许可站点", "expires": "到期:",
"authorized": "授权:", "last-accessed": "上次访问:",
"dynamically-registered": "这个客户端是动态注册的", "never": "从未",
"expires": "到期:", "no-sites": "还未批准任何网站。",
"last-accessed": "上次访问:", "no-whitelisted": "还未访问任何白名单的网站。",
"never": "从未", "pre-approved": "这些都是预先由管理员批准的网站。",
"no-sites": "还未批准任何网站。", "text": "这些都是您已经手动批准的网站。如果同一网站将来要进行同样的访问,它将直接通过、且没有提示。",
"no-whitelisted": "还未访问任何白名单的网站。", "unknown": "未知",
"pre-approved": "这些都是预先由管理员批准的网站。", "whitelist-note": "<b>注:</b>如果你在此撤销它们,它们将在您下次访问时不经提示即被自动重新批准。",
"text": "这些都是您已经手动批准的网站。如果同一网站将来要进行同样的访问,它将直接通过、且没有提示。", "whitelisted-site": "这个网站由管理员列入白名单中",
"unknown": "未知", "whitelisted-sites": "白名单的网站"
"whitelist-note": "<b>注:</b>如果你在此撤销它们,它们将在您下次访问时不经提示即被自动重新批准。", }
"whitelisted-site": "这个网站由管理员列入白名单中", },
"whitelisted-sites": "白名单的网站" "rsreg": {
} "resource-id-placeholder": "输入资源ID",
}, "configuration-url": "客户端配置URL",
"rsreg": { "edit": "编辑受保护的资源",
"resource-id-placeholder": "输入资源ID", "edit-existing": "编辑现有的保护资源",
"configuration-url": "客户端配置URL", "edit-existing-help": "用于编辑之前已注册的资源。请提供您的客戶端ID和注册访问令牌来访问资源的属性。",
"edit": "编辑受保护的资源", "edit-existing-button": "编辑资源",
"edit-existing": "编辑现有的保护资源", "invalid-access-token": "无效的客户端或注册访问令牌。",
"edit-existing-help": "用于编辑之前已注册的资源。请提供您的客戶端ID和注册访问令牌来访问资源的属性。", "new-client": "注册新的受保护资源",
"edit-existing-button": "编辑资源", "new-client-help": "用于注册新的资源。请提供客户端ID和注册访问令牌以便管理您的资源。",
"invalid-access-token": "无效的客户端或注册访问令牌。", "new-client-button": "新建资源",
"new-client": "注册新的受保护资源", "regtoken-placeholder": "输入注册访问令牌",
"new-client-help": "用于注册新的资源。请提供客户端ID和注册访问令牌以便管理您的资源。", "will-be-generated": "当保存资源信息将由服务器生成",
"new-client-button": "新建资源", "warning": "<strong>警告!</strong>你必须保护好<b>客户端ID </b><b>客户密钥(如果提供)</b>,以及<b>注册访问令牌</b>。如果丢失了客户端ID或注册访问令牌将无法再次获得您的客户端注册记录你需要注册一个新客户端。",
"regtoken-placeholder": "输入注册访问令牌", "client-form": {
"will-be-generated": "当保存资源信息将由服务器生成", "scope-help": "这个资源能够自省令牌的范围。"
"warning": "<strong>警告!</strong>你必须保护好<b>客户端ID </b><b>客户密钥(如果提供)</b>,以及<b>注册访问令牌</b>。如果丢失了客户端ID或注册访问令牌将无法再次获得您的客户端注册记录你需要注册一个新客户端。", }
"client-form": { },
"scope-help": "这个资源能够自省令牌的范围。" "scope": {
} "manage": "管理系统范围",
}, "scope-list": {
"scope": { "no-scopes": "没有范围"
"manage": "管理系统范围", },
"scope-list": { "system-scope-form": {
"no-scopes": "没有范围" "default": "默认范围",
}, "default-help": "新创建的用户默认情况下获得这个范围?",
"system-scope-form": { "description-help": "人类可读的文本描述",
"default": "默认范围", "description-placeholder": "输入说明",
"default-help": "新创建的用户默认情况下获得这个范围?", "restricted": "限制",
"description-help": "人类可读的文本描述", "restricted-help": "限制范围只能由系统管理员使用,可用动态注册客户和保护资源",
"description-placeholder": "输入说明", "edit": "编辑范围",
"restricted": "限制", "icon": "图标",
"restricted-help": "限制范围只能由系统管理员使用,可用动态注册客户和保护资源", "new": "新范围",
"edit": "编辑范围", "select-icon": "选择图标",
"icon": "图标", "structured": "是一个结构化的范围",
"new": "新范围", "structured-help": "范围结构化是否包含如<code>base:extension</code>的结构化值?",
"select-icon": "选择图标", "structured-param-help": "人类可读的结构化参数描述",
"structured": "是一个结构化的范围", "subject-type": "主体类型",
"structured-help": "范围结构化是否包含如<code>base:extension</code>的结构化值?", "value": "范围值",
"structured-param-help": "人类可读的结构化参数描述", "value-help": "不含空格的单个字符串",
"subject-type": "主体类型", "value-placeholder": "范围"
"value": "范围值", },
"value-help": "不含空格的单个字符串", "system-scope-table": {
"value-placeholder": "范围" "confirm": "你确定要删除此范围?引用了此范围的客户端还需要它。",
}, "new": "新范围",
"system-scope-table": { "text": "尚未定义系统范围。客户可自定义范围。",
"confirm": "你确定要删除此范围?引用了此范围的客户端还需要它。", "tooltip-restricted": "此范围只能由管理员使用。它不能用于动态注册。",
"new": "新范围", "tooltip-default": "这个范围将自动分配给新注册的客户。"
"text": "尚未定义系统范围。客户可自定义范围。", }
"tooltip-restricted": "此范围只能由管理员使用。它不能用于动态注册。", },
"tooltip-default": "这个范围将自动分配给新注册的客户。" "token": {
} "manage": "管理活动的令牌",
}, "token-table": {
"token": { "access-tokens": "访问令牌",
"manage": "管理活动的令牌", "associated-id": "这个访问令牌附带相关的身份令牌。",
"token-table": { "associated-refresh": "这个访问令牌附带相关的刷新令牌。",
"access-tokens": "访问令牌", "click-to-display": "点击显示完整的令牌值",
"associated-id": "这个访问令牌附带相关的身份令牌。", "confirm": "你确定要撤销这个令牌?",
"associated-refresh": "这个访问令牌附带相关的刷新令牌。", "confirm-refresh": "你确定要撤销这个刷新令牌及其相关的访问令牌?",
"click-to-display": "点击显示完整的令牌值", "expires": "过期",
"confirm": "你确定要撤销这个令牌?", "no-access": "没有活动的访问令牌。",
"confirm-refresh": "你确定要撤销这个刷新令牌及其相关的访问令牌?", "no-refresh": "没有活动的刷新令牌。",
"expires": "过期", "number-of-tokens": "关联的访问令牌数量",
"no-access": "没有活动的访问令牌。", "refresh-tokens": "刷新令牌",
"no-refresh": "没有活动的刷新令牌。", "text": "访问令牌通常是短暂的供客户端访问特定的资源。身份令牌是采用OpenID Connect协议登录的、专门的访问令牌。",
"number-of-tokens": "关联的访问令牌数量", "text-refresh": "刷新令牌通常是长期的,以便客户端能无需用户介入即可获取新的访问令牌。",
"refresh-tokens": "刷新令牌", "token-info": "令牌的信息"
"text": "访问令牌通常是短暂的供客户端访问特定的资源。身份令牌是采用OpenID Connect协议登录的、专门的访问令牌。", }
"text-refresh": "刷新令牌通常是长期的,以便客户端能无需用户介入即可获取新的访问令牌。", },
"token-info": "令牌的信息" "whitelist": {
} "confirm": "你确定要删除这个白名单项?",
}, "edit": "编辑白名单",
"whitelist": { "manage": "管理列入白名单的网站",
"confirm": "你确定要删除这个白名单项?", "new": "新白名单",
"edit": "编辑白名单", "whitelist": "白名单",
"manage": "管理列入白名单的网站", "whitelist-form": {
"new": "新白名单", "allowed-scopes": "允许范围",
"whitelist": "白名单", "edit": "编辑白名单的网站",
"whitelist-form": { "new": "新增白名单网站",
"allowed-scopes": "允许范围", "scope-help": "当客户端发出请求列表时将自动批准的范围",
"edit": "编辑白名单的网站", "scope-placeholder": "新范围"
"new": "新增白名单网站", },
"scope-help": "当客户端发出请求列表时将自动批准的范围", "whitelist-table": {
"scope-placeholder": "新范围" "no-sites": "白名单列表为空。使用<strong>白名单</strong>按钮在客户端管理页面创建一个。"
}, }
"whitelist-table": { },
"no-sites": "白名单列表为空。使用<strong>白名单</strong>按钮在客户端管理页面创建一个。" "blacklist": {
} "text": "被拉黑的网站URI将无法用做注册客户端的重定向地址无论是在管理界面中添加、还是动态注册都不会成功。",
}, "blacklist-uri-placeholder": "要拉黑的网站URI",
"blacklist": { "add": "将网站URI加入黑名单",
"text": "被拉黑的网站URI将无法用做注册客户端的重定向地址无论是在管理界面中添加、还是动态注册都不会成功。", "empty": "当前黑名单为空",
"blacklist-uri-placeholder": "要拉黑的网站URI", "uri": "URI"
"add": "将网站URI加入黑名单", },
"empty": "当前黑名单为空", "copyright": "基于<a href=\"https://github.com/mitreid-connect/\">MITREid Connect <span class=\"label\">{0}</span></a>技术构建 <span class=\"pull-right\">&copy; 2016 MITRE公司及MIT因特网信任联盟</span>.",
"uri": "URI" "about": {
}, "title": "关于",
"copyright": "基于<a href=\"https://github.com/mitreid-connect/\">MITREid Connect <span class=\"label\">{0}</span></a>技术构建 <span class=\"pull-right\">&copy; 2016 MITRE公司及MIT因特网信任联盟</span>.", "body": "\n此OpenID Connect服务基于开源的MITREid Connect项目该项目来自 \n<a href=\"http://www.mitre.org/\">MITRE公司</a> 及 <a href=\"http://www.trust.mit.edu/\">MIT因特网信任联盟</a>。\n</p>\n<p>\n有关项目的更多信息可见 \n<a href=\"http://github.com/mitreid-connect/\">GitHub上的MITREid Connect项目</a>。 \n在那儿您可以提交bug报告、提交反馈甚或提交代码补丁。"
"about": { },
"title": "关于", "statistics": {
"body": "\n此OpenID Connect服务基于开源的MITREid Connect项目该项目来自 \n<a href=\"http://www.mitre.org/\">MITRE公司</a> 及 <a href=\"http://www.trust.mit.edu/\">MIT因特网信任联盟</a>。\n</p>\n<p>\n有关项目的更多信息可见 \n<a href=\"http://github.com/mitreid-connect/\">GitHub上的MITREid Connect项目</a>。 \n在那儿您可以提交bug报告、提交反馈甚或提交代码补丁。" "title": "统计",
}, "number_users": "用户数: <span class=\"label label-info\" id=\"userCount\">{0}</span>",
"statistics": { "number_clients": "授权的客户端: <span class=\"label label-info\" id=\"clientCount\">{0}</span>",
"title": "统计", "number_approvals": "已批准的站点: <span class=\"label label-info\" id=\"approvalCount\">{0}</span>"
"number_users": "用户数: <span class=\"label label-info\" id=\"userCount\">{0}</span>", },
"number_clients": "授权的客户端: <span class=\"label label-info\" id=\"clientCount\">{0}</span>", "home": {
"number_approvals": "已批准的站点: <span class=\"label label-info\" id=\"approvalCount\">{0}</span>" "title": "首页",
}, "welcome": {
"home": { "title": "欢迎!",
"title": "首页", "body": "\nOpenID Connect是适于因特网部署的身份联邦认证服务器基于OAuth2授权框架之上的OpenID Connect技术构建。\nOpenID Connect让您无需暴露自己的用户名、密码即可便捷登录网站。</p>\n<p><a class=\"btn btn-primary btn-large\" href=\"http://openid.net/connect/\">了解更多信息&raquo;</a>"
"welcome": { },
"title": "欢迎!", "more": "更多",
"body": "\nOpenID Connect是适于因特网部署的身份联邦认证服务器基于OAuth2授权框架之上的OpenID Connect技术构建。\nOpenID Connect让您无需暴露自己的用户名、密码即可便捷登录网站。</p>\n<p><a class=\"btn btn-primary btn-large\" href=\"http://openid.net/connect/\">了解更多信息&raquo;</a>" "about": {
}, "title": "关于",
"more": "更多", "body": "本服务基于开源的MITREid Connect项目该项目来自 \n<a href=\"http://www.mitre.org/\">MITRE公司</a> 及 <a href=\"http://www.trust.mit.edu/\">MIT因特网信任联盟</a>。"
"about": { },
"title": "关于", "contact": {
"body": "本服务基于开源的MITREid Connect项目该项目来自 \n<a href=\"http://www.mitre.org/\">MITRE公司</a> 及 <a href=\"http://www.trust.mit.edu/\">MIT因特网信任联盟</a>。" "title": "联系方式",
}, "body": "\n如需更多的信息和支持请联系本系统的管理员。</p>\n<p><a class=\"btn\" href=\"mailto:idp@example.com?Subject=OpenID Connect\">电子信箱 &raquo;</a>"
"contact": { },
"title": "联系方式", "statistics": {
"body": "\n如需更多的信息和支持请联系本系统的管理员。</p>\n<p><a class=\"btn\" href=\"mailto:idp@example.com?Subject=OpenID Connect\">电子信箱 &raquo;</a>" "title": "当前统计",
}, "loading": "加载……",
"statistics": { "number_users": "用户数: <span class=\"label label-info\" id=\"userCount\">{0}</span>",
"title": "当前统计", "number_clients": "授权的客户端: <span class=\"label label-info\" id=\"clientCount\">{0}</span>",
"loading": "加载……", "number_approvals": "已批准的站点: <span class=\"label label-info\" id=\"approvalCount\">{0}</span>"
"number_users": "用户数: <span class=\"label label-info\" id=\"userCount\">{0}</span>", }
"number_clients": "授权的客户端: <span class=\"label label-info\" id=\"clientCount\">{0}</span>", },
"number_approvals": "已批准的站点: <span class=\"label label-info\" id=\"approvalCount\">{0}</span>" "contact": {
} "title": "联系方式",
}, "body": "如果要报告有关MITREid Connect软件自身的bug请访问\n<a href=\"https://github.com/mitreid-connect/OpenID-Connect-Java-Spring-Server/issues\">GitHub issue追踪系统</a>。 \n有关当前服务器的问题请联系服务器管理员。"
"contact": { },
"title": "联系方式", "topbar": {
"body": "如果要报告有关MITREid Connect软件自身的bug请访问\n<a href=\"https://github.com/mitreid-connect/OpenID-Connect-Java-Spring-Server/issues\">GitHub issue追踪系统</a>。 \n有关当前服务器的问题请联系服务器管理员。" "about": "关于",
}, "contact": "联系方式",
"topbar": { "statistics": "统计",
"about": "关于", "home": "首页",
"contact": "联系方式", "login": "登录",
"statistics": "统计", "logout": "注销"
"home": "首页", },
"login": "登录", "sidebar": {
"logout": "注销" "administrative": {
}, "title": "管理",
"sidebar": { "manage_clients": "管理客户端",
"administrative": { "whitelisted_clients": "白名单",
"title": "管理", "blacklisted_clients": "黑名单",
"manage_clients": "管理客户端", "system_scopes": "系统范围"
"whitelisted_clients": "白名单", },
"blacklisted_clients": "黑名单", "personal": {
"system_scopes": "系统范围" "title": "个人",
}, "approved_sites": "管理批准的网站",
"personal": { "active_tokens": "管理活动的令牌",
"title": "个人", "profile_information": "查看用户信息"
"approved_sites": "管理批准的网站", },
"active_tokens": "管理活动的令牌", "developer": {
"profile_information": "查看用户信息" "title": "开发者自助服务",
}, "client_registration": "客户端注册",
"developer": { "resource_registration": "保护资源注册"
"title": "开发者自助服务", }
"client_registration": "客户端注册", },
"resource_registration": "保护资源注册" "manage": {
} "ok": "好的",
}, "loading": "加载",
"manage": { "title": "管理控制台"
"ok": "好的", },
"loading": "加载", "approve": {
"title": "管理控制台" "dynamically-registered-unknown": "在一个未知的时间",
}, "title": "批准访问",
"approve": { "error": {
"dynamically-registered-unknown": "在一个未知的时间", "not_granted": "访问可能不获批准。"
"title": "批准访问", },
"error": { "required_for": "有待批准",
"not_granted": "访问可能不获批准。" "dynamically_registered": "此客户端已被动态注册了<span class=\"label label-info\" id=\"registrationTime\">{0}</span>次。",
}, "caution": {
"required_for": "有待批准", "title": "注意",
"dynamically_registered": "此客户端已被动态注册了<span class=\"label label-info\" id=\"registrationTime\">{0}</span>次。", "message": {
"caution": { "none": "它之前<span class=\"label label-important\">从未</span>被批准。",
"title": "注意", "singular": "它之前已被批准了<span class=\"label label-warning\">{0}</span>次。",
"message": { "plural": "它之前已被批准了<span class=\"label\">{0}</span>次。"
"none": "它之前<span class=\"label label-important\">从未</span>被批准。", }
"singular": "它之前已被批准了<span class=\"label label-warning\">{0}</span>次。", },
"plural": "它之前已被批准了<span class=\"label\">{0}</span>次。" "more_information": "更多信息",
} "home_page": "主页",
}, "policy": "政策",
"more_information": "更多信息", "terms": "服务条款",
"home_page": "主页", "contacts": "管理人员",
"policy": "政策", "warning": "警告",
"terms": "服务条款", "no_redirect_uri": "该客户端没有注册任何重定向URI可能被使用恶意的URI。",
"contacts": "管理人员", "redirect_uri": "如果点击批准,您将被重定向至如下页面: <code>{0}</code>",
"warning": "警告", "pairwise": "该客户端使用<b>pairwise</b>标识符,这使得在不同站点间关联身份变得稍加困难。",
"no_redirect_uri": "该客户端没有注册任何重定向URI可能被使用恶意的URI。", "no_scopes": "该客户端没有注册任何范围,因此允许请求系统可用的<em>any</em>(任意)范围。请务必谨慎处理。",
"redirect_uri": "如果点击批准,您将被重定向至如下页面: <code>{0}</code>", "access_to": "访问",
"pairwise": "该客户端使用<b>pairwise</b>标识符,这使得在不同站点间关联身份变得稍加困难。", "remember": {
"no_scopes": "该客户端没有注册任何范围,因此允许请求系统可用的<em>any</em>(任意)范围。请务必谨慎处理。", "title": "记住这个决定",
"access_to": "访问", "until_revoke": "记住这个决定直到我撤销",
"remember": { "one_hour": "记住该决定一个小时",
"title": "记住这个决定", "next_time": "下次再提醒我"
"until_revoke": "记住这个决定直到我撤销", },
"one_hour": "记住该决定一个小时", "do_authorize": "是否授权",
"next_time": "下次再提醒我" "label": {
}, "authorize": "授权",
"do_authorize": "是否授权", "deny": "拒绝"
"label": { }
"authorize": "授权", },
"deny": "拒绝" "error": {
} "title": "错误",
}, "header": "错误:",
"error": { "message": "在处理您的请求过程中发生了错误。服务器信息为:"
"title": "错误", },
"header": "错误:", "login": {
"message": "在处理您的请求过程中发生了错误。服务器信息为:" "login_with_username_and_password": "请使用您的用户名及密码登录",
}, "username": "用户名",
"login": { "password": "密码",
"login_with_username_and_password": "请使用您的用户名及密码登录", "login-button": "登录",
"username": "用户名", "error": "登录失败。请重试。"
"password": "密码", }
"login-button": "登录", }
"error": "登录失败。请重试。"
}
}

View File

@ -1,490 +1,487 @@
{ {
"admin": { "admin": {
"blacklist": "黑名單", "blacklist": "黑名單",
"blacklist-form": { "blacklist-form": {
"blacklisted-uris": "列入黑名單的URI" "blacklisted-uris": "列入黑名單的URI"
}, },
"home": "首頁", "home": "首頁",
"list-widget": { "list-widget": {
"empty": "此列表為空。", "empty": "此列表為空。",
"tooltip": "單擊顯示全部值。" "tooltip": "單擊顯示全部值。"
}, },
"manage-blacklist": "管理列入黑名單的客戶端", "manage-blacklist": "管理列入黑名單的客戶端",
"self-service-client": "自助服務-客戶端註冊", "self-service-client": "自助服務-客戶端註冊",
"self-service-resource": "自助服務-受保護資源註冊", "self-service-resource": "自助服務-受保護資源註冊",
"user-profile": { "user-profile": {
"claim": "聲明項", "claim": "聲明項",
"show": "查看用戶資訊", "show": "查看用戶資訊",
"text": "您的用戶資訊如下:", "text": "您的用戶資訊如下:",
"value": "內容" "value": "內容"
} }
}, },
"client": { "client": {
"client-form": { "client-form": {
"access": "訪問", "access": "訪問",
"access-token-no-timeout": "訪問令牌不時間", "access-token-no-timeout": "訪問令牌不時間",
"access-token-timeout": "訪問令牌超時", "access-token-timeout": "訪問令牌超時",
"access-token-timeout-help": "輸入時間(秒、分鐘或小時)。", "access-token-timeout-help": "輸入時間(秒、分鐘或小時)。",
"acr-values": "默認ACR值", "acr-values": "默認ACR值",
"acr-values-placeholder": "新的ACR值", "acr-values-placeholder": "新的ACR值",
"acr-values-help": "用於請求該客戶端的默認身份驗證上下文參考", "acr-values-help": "用於請求該客戶端的默認身份驗證上下文參考",
"allow-introspection": "允許調用內省端點?", "allow-introspection": "允許調用內省端點?",
"authentication-method": "令牌端點認證方法", "authentication-method": "令牌端點認證方法",
"authorization-code": "授權碼", "authorization-code": "授權碼",
"client-credentials": "客戶端憑證", "client-credentials": "客戶端憑證",
"client-description": "描述", "client-description": "描述",
"client-description-help": "人類可讀的文本描述", "client-description-help": "人類可讀的文本描述",
"client-description-placeholder": "填入說明描述", "client-description-placeholder": "填入說明描述",
"client-id": "客戶端ID", "client-id": "客戶端ID",
"client-id-help": "唯一標識符。如果不填則系統會自動生成一個。", "client-id-help": "唯一標識符。如果不填則系統會自動生成一個。",
"client-id-placeholder": "輸入一些字符", "client-id-placeholder": "輸入一些字符",
"client-name": "客戶端名稱", "client-name": "客戶端名稱",
"client-name-help": "人類可讀的應用程式名稱", "client-name-help": "人類可讀的應用程式名稱",
"client-name-placeholder": "輸入一些字符", "client-name-placeholder": "輸入一些字符",
"client-secret": "客戶端密鑰", "client-secret": "客戶端密鑰",
"client-secret-placeholder": "輸入密鑰", "client-secret-placeholder": "輸入密鑰",
"contacts": "聯繫人", "contacts": "聯繫人",
"contacts-help": "此客戶端管理員的聯繫人名單。", "contacts-help": "此客戶端管理員的聯繫人名單。",
"contacts-placeholder": "新聯繫人", "contacts-placeholder": "新聯繫人",
"credentials": "憑據", "credentials": "憑據",
"crypto": { "crypto": {
"a128cbc-hs256": "複合認證加密算法採用密碼塊鏈CBC模式AES以PKCS #5填充完整性計算使用HMAC SHA-256並使用256位的CMK和128位CEK", "a128cbc-hs256": "複合認證加密算法採用密碼塊鏈CBC模式AES以PKCS #5填充完整性計算使用HMAC SHA-256並使用256位的CMK和128位CEK",
"a256cbc-hs512": "複合認證加密算法採用密碼塊鏈CBC模式AES以PKCS #5填充完整性計算使用HMAC SHA-512並使用512位的CMK和256位CEK", "a256cbc-hs512": "複合認證加密算法採用密碼塊鏈CBC模式AES以PKCS #5填充完整性計算使用HMAC SHA-512並使用512位的CMK和256位CEK",
"a128gcm": "AES GCM使用128位的密鑰", "a128gcm": "AES GCM使用128位的密鑰",
"a256gcm": "AES GCM使用256位的密鑰", "a256gcm": "AES GCM使用256位的密鑰",
"a128kw": "AES密鑰封裝算法使用128位的密鑰", "a128kw": "AES密鑰封裝算法使用128位的密鑰",
"a256kw": "AES密鑰封裝算法使用256位的密鑰", "a256kw": "AES密鑰封裝算法使用256位的密鑰",
"default": "使用伺服器默認", "default": "使用伺服器默認",
"dir": "直接使用一個共享對稱密鑰作為塊加密的內容主密鑰CMK", "dir": "直接使用一個共享對稱密鑰作為塊加密的內容主密鑰CMK",
"ecdh-es": "橢圓曲線Diffie-Hellman短時靜態密鑰協議使用Concat KDF商定的密鑰被直接用作內容主密鑰CMK", "ecdh-es": "橢圓曲線Diffie-Hellman短時靜態密鑰協議使用Concat KDF商定的密鑰被直接用作內容主密鑰CMK",
"ecdh-es-a128kw": "橢圓曲線Diffie-Hellman短時靜態密鑰協議使用ECDH-ES和第4.7小節但商定的密鑰是用以A128KW函數封裝內容主密鑰CMK", "ecdh-es-a128kw": "橢圓曲線Diffie-Hellman短時靜態密鑰協議使用ECDH-ES和第4.7小節但商定的密鑰是用以A128KW函數封裝內容主密鑰CMK",
"ecdh-es-a256kw": "橢圓曲線Diffie-Hellman短時靜態密鑰協議使用ECDH-ES和第4.7小節但商定的密鑰是用以A256KW函數封裝內容主密鑰CMK", "ecdh-es-a256kw": "橢圓曲線Diffie-Hellman短時靜態密鑰協議使用ECDH-ES和第4.7小節但商定的密鑰是用以A256KW函數封裝內容主密鑰CMK",
"none": "不加密", "none": "不加密",
"rsa-oaep": "RSAES使用最優不對稱加密填充OAEP", "rsa-oaep": "RSAES使用最優不對稱加密填充OAEP",
"rsa1-5": "RSAES-PKCS1-V1_5" "rsa1-5": "RSAES-PKCS1-V1_5"
}, },
"cryptography": "密碼", "cryptography": "密碼",
"display-secret": "顯示/編輯客戶端密鑰:", "display-secret": "顯示/編輯客戶端密鑰:",
"edit": "編輯客戶端", "edit": "編輯客戶端",
"generate-new-secret": "生成一個新的客戶端密鑰嗎?", "generate-new-secret": "生成一個新的客戶端密鑰嗎?",
"generate-new-secret-help": "當點擊「保存」時生成新的密鑰", "generate-new-secret-help": "當點擊「保存」時生成新的密鑰",
"generate-on-save": "保存時生成", "generate-on-save": "保存時生成",
"grant-types": "批准的類型", "grant-types": "批准的類型",
"home": "主頁", "home": "主頁",
"home-help": "客戶端首頁的URL將顯示給用戶", "home-help": "客戶端首頁的URL將顯示給用戶",
"hours": "小時", "hours": "小時",
"id": "ID", "id": "ID",
"id-token-crypto-algorithm": "身份令牌加密算法", "id-token-crypto-algorithm": "身份令牌加密算法",
"id-token-crypto-method": "身份令牌加密方法", "id-token-crypto-method": "身份令牌加密方法",
"id-token-signing-algorithm": "身份令牌簽名算法", "id-token-signing-algorithm": "身份令牌簽名算法",
"id-token-timeout": "身份令牌超時", "id-token-timeout": "身份令牌超時",
"implicit": "隱式的", "implicit": "隱式的",
"initiate-login": "初始化登入", "initiate-login": "初始化登入",
"initiate-login-help": "啟動登入客戶端的URL", "initiate-login-help": "啟動登入客戶端的URL",
"introspection": "自省", "introspection": "自省",
"jwk-set": "公鑰集", "jwk-set": "公鑰集",
"jwk-set-help": "客戶端JSON Web Key集的URL (須可被伺服器訪問)", "jwk-set-help": "客戶端JSON Web Key集的URL (須可被伺服器訪問)",
"jwk-set-value-help": "客戶端JSON Web Key集的URL (須可被伺服器訪問)", "jwk-set-value-help": "客戶端JSON Web Key集的URL (須可被伺服器訪問)",
"logo": "標誌Logo)", "main": "首要",
"logo-help": "標誌Logo圖像的URL將顯示在批准頁", "max-age": "默認最長有效時間",
"main": "首要", "max-age-help": "再提示之前的默認最長會話有效時間",
"max-age": "默認最長有效時間", "minutes": "分鐘",
"max-age-help": "再提示之前的默認最長會話有效時間", "new": "新客戶端",
"minutes": "分鐘", "other": "其它",
"new": "新客戶端", "pairwise": "Pairwise對",
"other": "其它", "password": "密碼",
"pairwise": "Pairwise對", "policy": "政策聲明",
"password": "密碼", "policy-help": "此客戶端的政策聲明連接,將顯示給用戶",
"policy": "政策聲明", "post-logout": "登出後重定向",
"policy-help": "此客戶端的政策聲明連接,將顯示給用戶", "post-logout-help": "客戶端登出操作後的重定向URL",
"post-logout": "登出後重定向", "public": "公共",
"post-logout-help": "客戶端登出操作後的重定向URL", "redelegation": "重新授權",
"public": "公共", "redirect-uris": "重定向URI",
"redelegation": "重新授權", "redirect-uris-help": "在授權頁面之後客戶端重定向URI",
"redirect-uris": "重定向URI", "claims-redirect-uris": "聲明重定向URI",
"redirect-uris-help": "在授權頁面之後客戶端重定向URI", "claims-redirect-uris-help": "在聲明採集步驟之後瀏覽器需重定向的目標URI",
"claims-redirect-uris": "聲明重定向URI", "refresh": "刷新",
"claims-redirect-uris-help": "在聲明採集步驟之後瀏覽器需重定向的目標URI", "refresh-tokens": "刷新令牌",
"refresh": "刷新", "refresh-tokens-issued": "為此客戶端發佈的刷新令牌",
"refresh-tokens": "刷新令牌", "refresh-tokens-issued-help": "這將把 offline_access 加入客戶端的範圍。",
"refresh-tokens-issued": "為此客戶端發佈的刷新令牌", "refresh-tokens-reused": "此客戶端的刷新令牌被重用",
"refresh-tokens-issued-help": "這將把 offline_access 加入客戶端的範圍。", "clear-access-tokens": "當刷新令牌用過之後,已激活的訪問令牌自動失效",
"refresh-tokens-reused": "此客戶端的刷新令牌被重用", "refresh-tokens-no-expire": "刷新令牌尚未過期",
"clear-access-tokens": "當刷新令牌用過之後,已激活的訪問令牌自動失效", "registered": "註冊於",
"refresh-tokens-no-expire": "刷新令牌尚未過期", "registration-token": "註冊令牌:",
"registered": "註冊於", "registration-access-token": "註冊訪問令牌",
"registration-token": "註冊令牌:", "registration-token-error": "無法為此客戶端下載註冊訪問令牌。",
"registration-access-token": "註冊訪問令牌", "request-object-signing-algorithm": "請求對像簽名算法",
"registration-token-error": "無法為此客戶端下載註冊訪問令牌。", "request-uri": "請求的URI",
"request-object-signing-algorithm": "請求對像簽名算法", "request-uri-help": "URI包含此客戶端使用的請求對像",
"request-uri": "請求的URI", "require-auth-time": "需要身份認證時間(auth_time)",
"request-uri-help": "URI包含此客戶端使用的請求對像", "require-auth-time-label": "總是需要在身份令牌中包含auth_time聲明",
"require-auth-time": "需要身份認證時間(auth_time)", "response-types": "回應類型",
"require-auth-time-label": "總是需要在身份令牌中包含auth_time聲明", "rotate-registration-token": "旋轉註冊令牌",
"response-types": "回應類型", "rotate-registration-token-confirm": "你確定你想旋轉這個客戶端的登入令牌?",
"rotate-registration-token": "旋轉註冊令牌", "rotate-registration-token-error": "無法旋轉該客戶端的註冊訪問令牌。",
"rotate-registration-token-confirm": "你確定你想旋轉這個客戶端的登入令牌?", "saved": {
"rotate-registration-token-error": "無法旋轉該客戶端的註冊訪問令牌。", "no-secret": "沒有客戶端密鑰",
"saved": { "saved": "客戶端已保存",
"no-secret": "沒有客戶端密鑰", "secret": "密鑰:",
"saved": "客戶端已保存", "show-secret": "顯示密鑰",
"secret": "密鑰:", "unchanged": "不變"
"show-secret": "顯示密鑰", },
"unchanged": "不變" "scope-placeholder": "新範圍",
}, "scope-help": "OAuth範圍允許客戶端請求",
"scope-placeholder": "新範圍", "seconds": "秒",
"scope-help": "OAuth範圍允許客戶端請求", "secret-asymmetric-jwt": "非對稱簽名JWT斷言",
"seconds": "秒", "secret-http": "客戶端密鑰經由HTTP Basic",
"secret-asymmetric-jwt": "非對稱簽名JWT斷言", "secret-none": "沒有認證",
"secret-http": "客戶端密鑰經由HTTP Basic", "secret-post": "客戶端密鑰經由HTTP POST",
"secret-none": "沒有認證", "secret-symmetric-jwt": "客戶端密鑰經由對稱簽名JWT斷言",
"secret-post": "客戶端密鑰經由HTTP POST", "sector-identifier": "扇區標識符URI",
"secret-symmetric-jwt": "客戶端密鑰經由對稱簽名JWT斷言", "signing": {
"sector-identifier": "扇區標識符URI", "any": "允許",
"signing": { "default": "使用伺服器默認",
"any": "允許", "es256": "ECDSA採用P-256曲線和SHA-256哈希算法",
"default": "使用伺服器默認", "es384": "ECDSA採用P-384曲線及SHA-384哈希算法",
"es256": "ECDSA採用P-256曲線和SHA-256哈希算法", "es512": "ECDSA採用P-512曲線及SHA-512哈希算法",
"es384": "ECDSA採用P-384曲線及SHA-384哈希算法", "hs256": "HMAC使用SHA-256哈希算法",
"es512": "ECDSA採用P-512曲線及SHA-512哈希算法", "hs384": "HMAC使用SHA-384哈希算法",
"hs256": "HMAC使用SHA-256哈希算法", "hs512": "HMAC使用SHA-512哈希算法",
"hs384": "HMAC使用SHA-384哈希算法", "none": "沒有數字簽名",
"hs512": "HMAC使用SHA-512哈希算法", "rs256": "RSASSA使用SHA-256哈希算法",
"none": "沒有數字簽名", "rs384": "RSASSA採用SHA-384哈希算法",
"rs256": "RSASSA使用SHA-256哈希算法", "rs512": "RSASSA使用SHA-512哈希算法",
"rs384": "RSASSA採用SHA-384哈希算法", "ps256": "採用SHA-256和MGF1的RSASSA-PSS算法",
"rs512": "RSASSA使用SHA-512哈希算法", "ps384": "採用SHA-384和MGF1的RSASSA-PSS算法",
"ps256": "採用SHA-256和MGF1的RSASSA-PSS算法", "ps512": "採用SHA-512和MGF1的RSASSA-PSS算法"
"ps384": "採用SHA-384和MGF1的RSASSA-PSS算法", },
"ps512": "採用SHA-512和MGF1的RSASSA-PSS算法" "subject-type": "主體類型",
}, "terms": "服務條款",
"subject-type": "主體類型", "terms-help": "此客戶服務條款的URL將向用戶顯示",
"terms": "服務條款", "token-signing-algorithm": "令牌端點認證簽名算法",
"terms-help": "此客戶服務條款的URL將向用戶顯示", "tokens": "令牌",
"token-signing-algorithm": "令牌端點認證簽名算法", "type": "應用類型",
"tokens": "令牌", "type-native": "原生應用",
"type": "應用類型", "type-web": "網絡應用",
"type-native": "原生應用", "unknown": "(未知)",
"type-web": "網絡應用", "user-info-crypto-algorithm": "用戶資訊端點加密算法",
"unknown": "(未知)", "user-info-crypto-method": "用戶資訊端點加密方法",
"user-info-crypto-algorithm": "用戶資訊端點加密算法", "user-info-signing-algorithm": "用戶資訊端點簽名算法"
"user-info-crypto-method": "用戶資訊端點加密方法", },
"user-info-signing-algorithm": "用戶資訊端點簽名算法" "client-table": {
}, "allow-introspection-tooltip": "這個客戶端可以執行令牌自省",
"client-table": { "confirm": "你確定要刪除這個客戶端?",
"allow-introspection-tooltip": "這個客戶端可以執行令牌自省", "dynamically-registered-tooltip": "這個客戶端是動態註冊的。點擊查看註冊訪問令牌",
"confirm": "你確定要刪除這個客戶端?", "match": {
"dynamically-registered-tooltip": "這個客戶端是動態註冊的。點擊查看註冊訪問令牌", "contacts": "聯繫人",
"match": { "description": "描述",
"contacts": "聯繫人", "homepage": "主頁",
"description": "描述", "id": "身分",
"homepage": "主頁", "name": "名稱",
"id": "身分", "policy": "政策",
"logo": "標誌", "redirect": "重定向URI",
"name": "名稱", "scope": "範圍",
"policy": "政策", "terms": "服務條款"
"redirect": "重定向URI", },
"scope": "範圍", "matched-search": "匹配搜索:",
"terms": "服務條款" "new": "新客戶端",
}, "no-clients": "此伺服器上沒有註冊的客戶端。",
"matched-search": "匹配搜索:", "no-matches": "沒有匹配搜索條件的客戶端。",
"new": "新客戶端", "no-redirect": "沒有重定向URI",
"no-clients": "此伺服器上沒有註冊的客戶端。", "registered": "註冊於",
"no-matches": "沒有匹配搜索條件的客戶端。", "search": "搜索……",
"no-redirect": "沒有重定向URI", "whitelist": "白名單",
"registered": "註冊於", "unknown": "一個未知的時間"
"search": "搜索……", },
"whitelist": "白名單", "manage": "管理客戶端",
"unknown": "一個未知的時間" "more-info": {
}, "contacts": "管理員聯繫方式:",
"manage": "管理客戶端", "home": "主頁",
"more-info": { "more": "更多資訊",
"contacts": "管理員聯繫方式:", "policy": "政策",
"home": "主頁", "terms": "服務條款:"
"more": "更多資訊", },
"policy": "政策", "newClient": "新客戶端"
"terms": "服務條款:" },
}, "common": {
"newClient": "新客戶端" "cancel": "取消",
}, "client": "客戶端",
"common": { "clients": "客戶端",
"cancel": "取消", "close": "關閉",
"client": "客戶端", "delete": "刪除",
"clients": "客戶端", "description": "描述",
"close": "關閉", "dynamically-registered": "這個客戶端是動態註冊的",
"delete": "刪除", "edit": "編輯",
"description": "描述", "expires": "到期:",
"dynamically-registered": "這個客戶端是動態註冊的", "information": "資訊",
"edit": "編輯", "new": "新建",
"expires": "到期:", "not-yet-implemented": "未實現",
"information": "資訊", "not-yet-implemented-content": "這個字段的值將於客戶端保存,但伺服器目前不處理任何事情。伺服器的未來庫版本將利用它。",
"new": "新建", "revoke": "撤銷",
"not-yet-implemented": "未實現", "save": "保存",
"not-yet-implemented-content": "這個字段的值將於客戶端保存,但伺服器目前不處理任何事情。伺服器的未來庫版本將利用它。", "scopes": "範圍",
"revoke": "撤銷", "statistics": "統計",
"save": "保存", "refresh": "刷新",
"scopes": "範圍", "scope": "範圍",
"statistics": "統計", "users": "用戶",
"refresh": "刷新", "user": "用戶",
"scope": "範圍", "roles": "角色",
"users": "用戶", "role": "角色",
"user": "用戶", "email": "電子郵箱",
"roles": "角色", "active": "已激活",
"role": "角色", "inactive": "未激活"
"email": "電子郵箱", },
"active": "已激活", "dynreg": {
"inactive": "未激活" "client-id-placeholder": "輸入客戶端ID",
}, "configuration-url": "客戶端配置URL",
"dynreg": { "edit-dynamically-registered": "編輯動態註冊的客戶端",
"client-id-placeholder": "輸入客戶端ID", "edit-existing": "編輯一個現有的客戶端",
"configuration-url": "客戶端配置URL", "edit-existing-help": "用於編輯之前已註冊的客戶端。粘貼您的客戶端ID和註冊訪問令牌以便訪問該客戶端。",
"edit-dynamically-registered": "編輯動態註冊的客戶端", "edit-existing-button": "編輯客戶端",
"edit-existing": "編輯一個現有的客戶端", "invalid-access-token": "無效的客戶端或註冊訪問令牌。",
"edit-existing-help": "用於編輯之前已註冊的客戶端。粘貼您的客戶端ID和註冊訪問令牌以便訪問該客戶端。", "new-client": "註冊新客戶端",
"edit-existing-button": "編輯客戶端", "new-client-help": "用於註冊新的客戶端。請提供客戶端ID和註冊訪問令牌以便管理您的客戶端。",
"invalid-access-token": "無效的客戶端或註冊訪問令牌。", "new-client-button": "新建客戶端",
"new-client": "註冊新客戶端", "regtoken-placeholder": "輸入註冊訪問令牌",
"new-client-help": "用於註冊新的客戶端。請提供客戶端ID和註冊訪問令牌以便管理您的客戶端。", "warning": "<strong>警告!</strong>你必須保護好<b>客戶端ID </b><b>客戶密鑰(如果提供)</b>,以及您的<b>註冊訪問令牌</b>。如果你丟失了客戶端ID或註冊訪問令牌將無法訪問您的客戶端註冊記錄你需要註冊一個新客戶端。",
"new-client-button": "新建客戶端", "will-be-generated": "當存儲客戶端資訊時將由伺服器自動生成"
"regtoken-placeholder": "輸入註冊訪問令牌", },
"warning": "<strong>警告!</strong>你必須保護好<b>客戶端ID </b><b>客戶密鑰(如果提供)</b>,以及您的<b>註冊訪問令牌</b>。如果你丟失了客戶端ID或註冊訪問令牌將無法訪問您的客戶端註冊記錄你需要註冊一個新客戶端。", "grant": {
"will-be-generated": "當存儲客戶端資訊時將由伺服器自動生成" "manage-approved-sites": "管理批准的網站",
}, "refresh": "刷新",
"grant": { "grant-table": {
"manage-approved-sites": "管理批准的網站", "active-tokens": "當前活躍的訪問令牌數量",
"refresh": "刷新", "application": "應用程式",
"grant-table": { "approved-sites": "許可站點",
"active-tokens": "當前活躍的訪問令牌數量", "authorized": "授權:",
"application": "應用程式", "dynamically-registered": "這個客戶端是動態註冊的",
"approved-sites": "許可站點", "expires": "到期:",
"authorized": "授權:", "last-accessed": "上次訪問:",
"dynamically-registered": "這個客戶端是動態註冊的", "never": "從未",
"expires": "到期:", "no-sites": "還未批准任何網站。",
"last-accessed": "上次訪問:", "no-whitelisted": "還未訪問任何白名單的網站。",
"never": "從未", "pre-approved": "這些都是預先由管理員批准的網站。",
"no-sites": "還未批准任何網站。", "text": "這些都是您已經手動批准的網站。如果同一網站將來要進行同樣的訪問,它將直接通過、且沒有提示。",
"no-whitelisted": "還未訪問任何白名單的網站。", "unknown": "未知",
"pre-approved": "這些都是預先由管理員批准的網站。", "whitelist-note": "<b>註:</b>如果你在此撤銷它們,它們將在您下次訪問時不經提示即被自動重新批准。",
"text": "這些都是您已經手動批准的網站。如果同一網站將來要進行同樣的訪問,它將直接通過、且沒有提示。", "whitelisted-site": "這個網站由管理員列入白名單中",
"unknown": "未知", "whitelisted-sites": "白名單的網站"
"whitelist-note": "<b>註:</b>如果你在此撤銷它們,它們將在您下次訪問時不經提示即被自動重新批准。", }
"whitelisted-site": "這個網站由管理員列入白名單中", },
"whitelisted-sites": "白名單的網站" "rsreg": {
} "resource-id-placeholder": "輸入資源ID",
}, "configuration-url": "客戶端配置URL",
"rsreg": { "edit": "編輯受保護的資源",
"resource-id-placeholder": "輸入資源ID", "edit-existing": "編輯現有的保護資源",
"configuration-url": "客戶端配置URL", "edit-existing-help": "用於編輯之前已註冊的資源。請使用您的客戶端ID和註冊訪問令牌來訪問資源的屬性。",
"edit": "編輯受保護的資源", "edit-existing-button": "編輯資源",
"edit-existing": "編輯現有的保護資源", "invalid-access-token": "無效的客戶端或註冊訪問令牌。",
"edit-existing-help": "用於編輯之前已註冊的資源。請使用您的客戶端ID和註冊訪問令牌來訪問資源的屬性。", "new-client": "註冊新的受保護資源",
"edit-existing-button": "編輯資源", "new-client-help": "用於註冊新的資源。請提供客戶端ID和註冊訪問令牌以便管理您的資源。",
"invalid-access-token": "無效的客戶端或註冊訪問令牌。", "new-client-button": "新建資源",
"new-client": "註冊新的受保護資源", "regtoken-placeholder": "輸入註冊訪問令牌",
"new-client-help": "用於註冊新的資源。請提供客戶端ID和註冊訪問令牌以便管理您的資源。", "will-be-generated": "將生成",
"new-client-button": "新建資源", "warning": "<strong>警告!</strong>你必須保護好<b>客戶端ID </b><b>客戶密鑰(如果提供)</b>,以及<b>註冊訪問令牌</b>。如果丟失了客戶端ID或註冊訪問令牌將無法獲得您客戶端的登記記錄你需要註冊一個新客戶端。",
"regtoken-placeholder": "輸入註冊訪問令牌", "client-form": {
"will-be-generated": "將生成", "scope-help": "這個資源能夠自省令牌的範圍。"
"warning": "<strong>警告!</strong>你必須保護好<b>客戶端ID </b><b>客戶密鑰(如果提供)</b>,以及<b>註冊訪問令牌</b>。如果丟失了客戶端ID或註冊訪問令牌將無法獲得您客戶端的登記記錄你需要註冊一個新客戶端。", }
"client-form": { },
"scope-help": "這個資源能夠自省令牌的範圍。" "scope": {
} "manage": "管理系統範圍",
}, "scope-list": {
"scope": { "no-scopes": "沒有範圍"
"manage": "管理系統範圍", },
"scope-list": { "system-scope-form": {
"no-scopes": "沒有範圍" "default": "默認範圍",
}, "default-help": "新創建的用戶默認情況下獲得這個範圍?",
"system-scope-form": { "description-help": "人類可讀的文本描述",
"default": "默認範圍", "description-placeholder": "輸入說明",
"default-help": "新創建的用戶默認情況下獲得這個範圍?", "restricted": "限制",
"description-help": "人類可讀的文本描述", "restricted-help": "限制範圍衹能由系統管理員使用,可用動態註冊客戶和保護資源",
"description-placeholder": "輸入說明", "edit": "編輯範圍",
"restricted": "限制", "icon": "圖標",
"restricted-help": "限制範圍衹能由系統管理員使用,可用動態註冊客戶和保護資源", "new": "新範圍",
"edit": "編輯範圍", "select-icon": "選擇圖標",
"icon": "圖標", "structured": "是一個結構化的範圍",
"new": "新範圍", "structured-help": "範圍結構化是否包含如<code>base:extension</code>的結構化值?",
"select-icon": "選擇圖標", "structured-param-help": "人類可讀的結構化參數描述",
"structured": "是一個結構化的範圍", "subject-type": "主體類型",
"structured-help": "範圍結構化是否包含如<code>base:extension</code>的結構化值?", "value": "範圍值",
"structured-param-help": "人類可讀的結構化參數描述", "value-help": "不含空格的單個字符串",
"subject-type": "主體類型", "value-placeholder": "範圍"
"value": "範圍值", },
"value-help": "不含空格的單個字符串", "system-scope-table": {
"value-placeholder": "範圍" "confirm": "你確定要刪除此範圍?引用了此範圍的客戶端還需要它。",
}, "new": "新範圍",
"system-scope-table": { "text": "尚未定義系統範圍。客戶還可自定義範圍。",
"confirm": "你確定要刪除此範圍?引用了此範圍的客戶端還需要它。", "tooltip-restricted": "此範圍衹能由管理員使用。它不能用於動態註冊。",
"new": "新範圍", "tooltip-default": "這個範圍將自動分配給新註冊的客戶。"
"text": "尚未定義系統範圍。客戶還可自定義範圍。", }
"tooltip-restricted": "此範圍衹能由管理員使用。它不能用於動態註冊。", },
"tooltip-default": "這個範圍將自動分配給新註冊的客戶。" "token": {
} "manage": "管理活動的令牌",
}, "token-table": {
"token": { "access-tokens": "訪問令牌",
"manage": "管理活動的令牌", "associated-id": "這個訪問令牌附帶相關的身份令牌。",
"token-table": { "associated-refresh": "這個訪問令牌附帶相關的刷新令牌。",
"access-tokens": "訪問令牌", "click-to-display": "點擊顯示完整的令牌值",
"associated-id": "這個訪問令牌附帶相關的身份令牌。", "confirm": "你確定要撤銷這個令牌?",
"associated-refresh": "這個訪問令牌附帶相關的刷新令牌。", "confirm-refresh": "你確定要撤銷這個刷新令牌及其相關的訪問令牌?",
"click-to-display": "點擊顯示完整的令牌值", "expires": "過期",
"confirm": "你確定要撤銷這個令牌?", "no-access": "沒有活動的訪問令牌。",
"confirm-refresh": "你確定要撤銷這個刷新令牌及其相關的訪問令牌?", "no-refresh": "沒有活動的刷新令牌。",
"expires": "過期", "number-of-tokens": "關聯的訪問令牌數量",
"no-access": "沒有活動的訪問令牌。", "refresh-tokens": "刷新令牌",
"no-refresh": "沒有活動的刷新令牌。", "text": "訪問令牌通常是短暫的供客戶端訪問特定的資源。身份令牌是採用OpenID Connect協議登入的、專門的訪問令牌。",
"number-of-tokens": "關聯的訪問令牌數量", "text-refresh": "刷新令牌通常是長期的,以便客戶端能無需用戶介入即可獲取新的訪問令牌。",
"refresh-tokens": "刷新令牌", "token-info": "令牌的資訊"
"text": "訪問令牌通常是短暫的供客戶端訪問特定的資源。身份令牌是採用OpenID Connect協議登入的、專門的訪問令牌。", }
"text-refresh": "刷新令牌通常是長期的,以便客戶端能無需用戶介入即可獲取新的訪問令牌。", },
"token-info": "令牌的資訊" "whitelist": {
} "confirm": "你確定要刪除這個白名單項?",
}, "edit": "編輯白名單",
"whitelist": { "manage": "管理列入白名單的網站",
"confirm": "你確定要刪除這個白名單項?", "new": "新白名單",
"edit": "編輯白名單", "whitelist": "白名單",
"manage": "管理列入白名單的網站", "whitelist-form": {
"new": "新白名單", "allowed-scopes": "允許範圍",
"whitelist": "白名單", "edit": "編輯白名單的網站",
"whitelist-form": { "new": "新增白名單網站",
"allowed-scopes": "允許範圍", "scope-help": "當客戶端發出請求列表時將自動批准的範圍",
"edit": "編輯白名單的網站", "scope-placeholder": "新範圍"
"new": "新增白名單網站", },
"scope-help": "當客戶端發出請求列表時將自動批准的範圍", "whitelist-table": {
"scope-placeholder": "新範圍" "no-sites": "白名單列表為空。使用<strong>白名單</strong>按鈕在客戶端管理頁面創建一個。"
}, }
"whitelist-table": { },
"no-sites": "白名單列表為空。使用<strong>白名單</strong>按鈕在客戶端管理頁面創建一個。" "blacklist": {
} "text": "被拉黑的網站URI將無法用於註冊客戶端的重定向地址無論是在管理介面中添加、還是動態註冊都不行。",
}, "blacklist-uri-placeholder": "要拉黑的網站URI",
"blacklist": { "add": "將網站URI加入黑名單",
"text": "被拉黑的網站URI將無法用於註冊客戶端的重定向地址無論是在管理介面中添加、還是動態註冊都不行。", "empty": "當前黑名單為空",
"blacklist-uri-placeholder": "要拉黑的網站URI", "uri": "URI"
"add": "將網站URI加入黑名單", },
"empty": "當前黑名單為空", "copyright": "基於<a href=\"https://github.com/mitreid-connect/\">MITREid Connect <span class=\"label\">{0}</span></a>技術構建 <span class=\"pull-right\">&copy; 2016 MITRE公司及MIT因特網信任聯盟</span>。",
"uri": "URI" "about": {
}, "title": "關於",
"copyright": "基於<a href=\"https://github.com/mitreid-connect/\">MITREid Connect <span class=\"label\">{0}</span></a>技術構建 <span class=\"pull-right\">&copy; 2016 MITRE公司及MIT因特網信任聯盟</span>。", "body": "\n此OpenID Connect服務基於開源的MITREid Connect專案該專案來自 \n<a href=\"http://www.mitre.org/\">MITRE公司</a> 及 <a href=\"http://www.trust.mit.edu/\">MIT因特網信任聯盟</a>。\n</p>\n<p>\n有關該專案的更多資訊可見 \n<a href=\"http://github.com/mitreid-connect/\">GitHub上的MITREid Connect專案</a>。 \n您可以在該網站報告bug、提交意見及代碼補丁。"
"about": { },
"title": "關於", "statistics": {
"body": "\n此OpenID Connect服務基於開源的MITREid Connect專案該專案來自 \n<a href=\"http://www.mitre.org/\">MITRE公司</a> 及 <a href=\"http://www.trust.mit.edu/\">MIT因特網信任聯盟</a>。\n</p>\n<p>\n有關該專案的更多資訊可見 \n<a href=\"http://github.com/mitreid-connect/\">GitHub上的MITREid Connect專案</a>。 \n您可以在該網站報告bug、提交意見及代碼補丁。" "title": "統計",
}, "number_users": "用戶數: <span class=\"label label-info\" id=\"userCount\">{0}</span>",
"statistics": { "number_clients": "授權的客戶端: <span class=\"label label-info\" id=\"clientCount\">{0}</span>",
"title": "統計", "number_approvals": "已批准的站點: <span class=\"label label-info\" id=\"approvalCount\">{0}</span>"
"number_users": "用戶數: <span class=\"label label-info\" id=\"userCount\">{0}</span>", },
"number_clients": "授權的客戶端: <span class=\"label label-info\" id=\"clientCount\">{0}</span>", "home": {
"number_approvals": "已批准的站點: <span class=\"label label-info\" id=\"approvalCount\">{0}</span>" "title": "首頁",
}, "welcome": {
"home": { "title": "歡迎!",
"title": "首頁", "body": "\nOpenID Connect是適於因特網部署的身分聯邦認證伺服器基於OAuth2授權框架之上的OpenID Connect技術構建。\nOpenID Connect讓您無需暴露自己的用戶名、密碼即可便捷登入網站。</p>\n<p><a class=\"btn btn-primary btn-large\" href=\"http://openid.net/connect/\">在此瞭解更多詳情&raquo;</a>"
"welcome": { },
"title": "歡迎!", "more": "更多",
"body": "\nOpenID Connect是適於因特網部署的身分聯邦認證伺服器基於OAuth2授權框架之上的OpenID Connect技術構建。\nOpenID Connect讓您無需暴露自己的用戶名、密碼即可便捷登入網站。</p>\n<p><a class=\"btn btn-primary btn-large\" href=\"http://openid.net/connect/\">在此瞭解更多詳情&raquo;</a>" "about": {
}, "title": "關於",
"more": "更多", "body": "本服務基於開源的MITREid Connect專案該專案來自 \n<a href=\"http://www.mitre.org/\">MITRE公司</a> 及 <a href=\"http://www.trust.mit.edu/\">MIT因特網信任聯盟</a>。"
"about": { },
"title": "關於", "contact": {
"body": "本服務基於開源的MITREid Connect專案該專案來自 \n<a href=\"http://www.mitre.org/\">MITRE公司</a> 及 <a href=\"http://www.trust.mit.edu/\">MIT因特網信任聯盟</a>。" "title": "聯繫方式",
}, "body": "\n如需更多的資訊和支持請聯繫本系統的管理員。</p>\n<p><a class=\"btn\" href=\"mailto:idp@example.com?Subject=OpenID Connect\">電子信箱 &raquo;</a>"
"contact": { },
"title": "聯繫方式", "statistics": {
"body": "\n如需更多的資訊和支持請聯繫本系統的管理員。</p>\n<p><a class=\"btn\" href=\"mailto:idp@example.com?Subject=OpenID Connect\">電子信箱 &raquo;</a>" "title": "當前統計",
}, "loading": "加載……",
"statistics": { "number_users": "用戶數: <span class=\"label label-info\" id=\"userCount\">{0}</span>",
"title": "當前統計", "number_clients": "授權的客戶端: <span class=\"label label-info\" id=\"clientCount\">{0}</span>",
"loading": "加載……", "number_approvals": "已批准的站點: <span class=\"label label-info\" id=\"approvalCount\">{0}</span>"
"number_users": "用戶數: <span class=\"label label-info\" id=\"userCount\">{0}</span>", }
"number_clients": "授權的客戶端: <span class=\"label label-info\" id=\"clientCount\">{0}</span>", },
"number_approvals": "已批准的站點: <span class=\"label label-info\" id=\"approvalCount\">{0}</span>" "contact": {
} "title": "聯繫方式",
}, "body": "如果要報告有關MITREid Connect軟體自身的bug請拜訪\n<a href=\"https://github.com/mitreid-connect/OpenID-Connect-Java-Spring-Server/issues\">GitHub issue追蹤系統</a>。 \n有關當前伺服器的問題請聯繫伺服器的管理者。"
"contact": { },
"title": "聯繫方式", "topbar": {
"body": "如果要報告有關MITREid Connect軟體自身的bug請拜訪\n<a href=\"https://github.com/mitreid-connect/OpenID-Connect-Java-Spring-Server/issues\">GitHub issue追蹤系統</a>。 \n有關當前伺服器的問題請聯繫伺服器的管理者。" "about": "關於",
}, "contact": "聯繫方式",
"topbar": { "statistics": "統計",
"about": "關於", "home": "首頁",
"contact": "聯繫方式", "login": "登入",
"statistics": "統計", "logout": "登出"
"home": "首頁", },
"login": "登入", "sidebar": {
"logout": "登出" "administrative": {
}, "title": "管理",
"sidebar": { "manage_clients": "管理客戶端",
"administrative": { "whitelisted_clients": "白名單",
"title": "管理", "blacklisted_clients": "黑名單",
"manage_clients": "管理客戶端", "system_scopes": "系統範圍"
"whitelisted_clients": "白名單", },
"blacklisted_clients": "黑名單", "personal": {
"system_scopes": "系統範圍" "title": "個人",
}, "approved_sites": "管理批准的網站",
"personal": { "active_tokens": "管理活動的令牌",
"title": "個人", "profile_information": "查看用戶資訊"
"approved_sites": "管理批准的網站", },
"active_tokens": "管理活動的令牌", "developer": {
"profile_information": "查看用戶資訊" "title": "開發者自助服務",
}, "client_registration": "客戶端註冊",
"developer": { "resource_registration": "保護資源註冊"
"title": "開發者自助服務", }
"client_registration": "客戶端註冊", },
"resource_registration": "保護資源註冊" "manage": {
} "ok": "好的",
}, "loading": "加載",
"manage": { "title": "管理控制檯"
"ok": "好的", },
"loading": "加載", "approve": {
"title": "管理控制檯" "dynamically-registered-unknown": "在一個未知的時間",
}, "title": "批准訪問",
"approve": { "error": {
"dynamically-registered-unknown": "在一個未知的時間", "not_granted": "訪問可能不獲批准。"
"title": "批准訪問", },
"error": { "required_for": "有待批准",
"not_granted": "訪問可能不獲批准。" "dynamically_registered": "此客戶端已被動態註冊了<span class=\"label label-info\" id=\"registrationTime\">{0}</span>次。",
}, "caution": {
"required_for": "有待批准", "title": "注意",
"dynamically_registered": "此客戶端已被動態註冊了<span class=\"label label-info\" id=\"registrationTime\">{0}</span>次。", "message": {
"caution": { "none": "它之前<span class=\"label label-important\">從未</span>被批准。",
"title": "注意", "singular": "它之前已被批准了<span class=\"label label-warning\">{0}</span>次。",
"message": { "plural": "它之前已被批准了<span class=\"label\">{0}</span>次。"
"none": "它之前<span class=\"label label-important\">從未</span>被批准。", }
"singular": "它之前已被批准了<span class=\"label label-warning\">{0}</span>次。", },
"plural": "它之前已被批准了<span class=\"label\">{0}</span>次。" "more_information": "更多資訊",
} "home_page": "主頁",
}, "policy": "政策",
"more_information": "更多資訊", "terms": "服務條款",
"home_page": "主頁", "contacts": "管理人員",
"policy": "政策", "warning": "警告",
"terms": "服務條款", "no_redirect_uri": "該客戶端沒有註冊任何重定向URI可能被使用惡意的URI。",
"contacts": "管理人員", "redirect_uri": "如果點擊批准,您將被重定向至如下頁面: <code>{0}</code>",
"warning": "警告", "pairwise": "該客戶端使用<b>pairwise</b>標識符,這使得在不同站點間關聯身份變得稍加困難。",
"no_redirect_uri": "該客戶端沒有註冊任何重定向URI可能被使用惡意的URI。", "no_scopes": "該客戶端沒有註冊任何範圍,因此允許請求系統可用的<em>any</em>(任意)範圍。請務必謹慎處理。",
"redirect_uri": "如果點擊批准,您將被重定向至如下頁面: <code>{0}</code>", "access_to": "訪問",
"pairwise": "該客戶端使用<b>pairwise</b>標識符,這使得在不同站點間關聯身份變得稍加困難。", "remember": {
"no_scopes": "該客戶端沒有註冊任何範圍,因此允許請求系統可用的<em>any</em>(任意)範圍。請務必謹慎處理。", "title": "記住這個決定",
"access_to": "訪問", "until_revoke": "記住這個決定直到我撤銷",
"remember": { "one_hour": "記住該決定一個小時",
"title": "記住這個決定", "next_time": "下次再提醒我"
"until_revoke": "記住這個決定直到我撤銷", },
"one_hour": "記住該決定一個小時", "do_authorize": "是否授權",
"next_time": "下次再提醒我" "label": {
}, "authorize": "授權",
"do_authorize": "是否授權", "deny": "拒絕"
"label": { }
"authorize": "授權", },
"deny": "拒絕" "error": {
} "title": "錯誤",
}, "header": "錯誤:",
"error": { "message": "在處理您的請求過程中發生了錯誤。伺服器日誌為:"
"title": "錯誤", },
"header": "錯誤:", "login": {
"message": "在處理您的請求過程中發生了錯誤。伺服器日誌為:" "login_with_username_and_password": "請用您的用戶名和密碼登入",
}, "username": "用戶名",
"login": { "password": "密碼",
"login_with_username_and_password": "請用您的用戶名和密碼登入", "login-button": "登入",
"username": "用戶名", "error": "登入失敗,請重試。"
"password": "密碼", }
"login-button": "登入", }
"error": "登入失敗,請重試。"
}
}

View File

@ -21,7 +21,6 @@ var ResRegClient = Backbone.Model.extend({
client_secret: null, client_secret: null,
client_name: null, client_name: null,
client_uri: null, client_uri: null,
logo_uri: null,
contacts: [], contacts: [],
tos_uri: null, tos_uri: null,
token_endpoint_auth_method: null, token_endpoint_auth_method: null,
@ -194,7 +193,6 @@ var ResRegEditView = Backbone.View.extend({
"click .btn-save": "saveClient", "click .btn-save": "saveClient",
"click .btn-cancel": "cancel", "click .btn-cancel": "cancel",
"click .btn-delete": "deleteClient", "click .btn-delete": "deleteClient",
"change #logoUri input": "previewLogo",
"change #tokenEndpointAuthMethod input:radio": "toggleClientCredentials", "change #tokenEndpointAuthMethod input:radio": "toggleClientCredentials",
"change #jwkSelector input:radio": "toggleJWKSetType" "change #jwkSelector input:radio": "toggleJWKSetType"
}, },
@ -229,16 +227,6 @@ var ResRegEditView = Backbone.View.extend({
return false; return false;
}, },
previewLogo: function() {
if ($('#logoUri input', this.el).val()) {
$('#logoPreview', this.el).empty();
$('#logoPreview', this.el).attr('src', $('#logoUri input', this.el).val());
} else {
// $('#logoBlock', this.el).hide();
$('#logoPreview', this.el).attr('src', 'resources/images/logo_placeholder.gif');
}
},
/** /**
* Set up the form based on the current state of the tokenEndpointAuthMethod * Set up the form based on the current state of the tokenEndpointAuthMethod
* parameter * parameter
@ -350,7 +338,6 @@ var ResRegEditView = Backbone.View.extend({
var attrs = { var attrs = {
client_name: $('#clientName input').val(), client_name: $('#clientName input').val(),
logo_uri: $('#logoUri input').val(),
scope: scopes, scope: scopes,
client_secret: null, // never send a client secret client_secret: null, // never send a client secret
tos_uri: $('#tosUri input').val(), tos_uri: $('#tosUri input').val(),
@ -455,7 +442,6 @@ var ResRegEditView = Backbone.View.extend({
this.listWidgetViews.push(contactView); this.listWidgetViews.push(contactView);
this.toggleClientCredentials(); this.toggleClientCredentials();
this.previewLogo();
this.toggleJWKSetType(); this.toggleJWKSetType();
// disable unsupported JOSE algorithms // disable unsupported JOSE algorithms

View File

@ -25,10 +25,6 @@
<td> <td>
<div class="media"> <div class="media">
<% if (client.logoUri) { %>
<span class="pull-left"><img class="media-object client-logo" src="api/clients/<%- client.id %>/logo"></span>
<% } %>
<div class="media-body"> <div class="media-body">
<span class="clientid-substring" title="<%- client.clientId %> (click to display client ID)"><%- client.clientName != null ? client.clientName : ( client.clientId.substr(0,8) + '...' ) %></span> <span class="clientid-substring" title="<%- client.clientId %> (click to display client ID)"><%- client.clientName != null ? client.clientName : ( client.clientId.substr(0,8) + '...' ) %></span>
</div> </div>
@ -238,20 +234,6 @@
</div> </div>
</div> </div>
<div class="control-group" id="logoUri">
<label class="control-label" data-i18n="client.client-form.logo">Logo</label>
<div class="controls">
<input placeholder="https://" value="<%-client.logoUri ? client.logoUri : ''%>" maxlength="1000" type="text" class=""/>
<p class="help-block" data-i18n="client.client-form.logo-help">URL that points to a logo image, will be displayed on approval page</p>
</div>
</div>
<div class="control-group" id="logoBlock">
<div class="controls">
<img src="resources/images/logo_placeholder.gif" alt="logo" id="logoPreview" width="275px" class="thumbnail" />
</div>
</div>
<div class="control-group" id="tosUri"> <div class="control-group" id="tosUri">
<label class="control-label" data-i18n="client.client-form.terms">Terms of Service</label> <label class="control-label" data-i18n="client.client-form.terms">Terms of Service</label>
<div class="controls"> <div class="controls">

View File

@ -154,20 +154,6 @@
</div> </div>
</div> </div>
<div class="control-group" id="logoUri">
<label class="control-label" data-i18n="client.client-form.logo">Logo</label>
<div class="controls">
<input placeholder="https://" value="<%-client.logo_uri ? client.logo_uri : ''%>" maxlength="1000" type="text" class=""/>
<p class="help-block" data-i18n="client.client-form.logo-help">URL that points to a logo image, will be displayed on approval page</p>
</div>
</div>
<div class="control-group" id="logoBlock">
<div class="controls">
<img src="resources/images/logo_placeholder.gif" alt="logo" id="logoPreview" width="275px" class="thumbnail" />
</div>
</div>
<div class="control-group" id="tosUri"> <div class="control-group" id="tosUri">
<label class="control-label" data-i18n="client.client-form.terms">Terms of Service</label> <label class="control-label" data-i18n="client.client-form.terms">Terms of Service</label>
<div class="controls"> <div class="controls">

View File

@ -146,20 +146,6 @@
</div> </div>
</div> </div>
<div class="control-group" id="logoUri">
<label class="control-label" data-i18n="client.client-form.logo">Logo</label>
<div class="controls">
<input placeholder="https://" value="<%-client.logo_uri ? client.logo_uri : ''%>" maxlength="1000" type="text" class=""/>
<p class="help-block" data-i18n="client.client-form.logo-help">URL that points to a logo image, will be displayed on approval page</p>
</div>
</div>
<div class="control-group" id="logoBlock">
<div class="controls">
<img src="resources/images/logo_placeholder.gif" alt="logo" id="logoPreview" width="275px" class="thumbnail" />
</div>
</div>
<div class="control-group" id="tosUri"> <div class="control-group" id="tosUri">
<label class="control-label" data-i18n="client.client-form.terms">Terms of Service</label> <label class="control-label" data-i18n="client.client-form.terms">Terms of Service</label>
<div class="controls"> <div class="controls">

View File

@ -20,11 +20,20 @@
*/ */
package org.mitre.oauth2.model; package org.mitre.oauth2.model;
import java.util.Date; import com.nimbusds.jose.EncryptionMethod;
import java.util.HashMap; import com.nimbusds.jose.JWEAlgorithm;
import java.util.HashSet; import com.nimbusds.jose.JWSAlgorithm;
import java.util.Map; import com.nimbusds.jose.jwk.JWKSet;
import java.util.Set; import com.nimbusds.jwt.JWT;
import org.mitre.oauth2.model.convert.JWEAlgorithmStringConverter;
import org.mitre.oauth2.model.convert.JWEEncryptionMethodStringConverter;
import org.mitre.oauth2.model.convert.JWKSetStringConverter;
import org.mitre.oauth2.model.convert.JWSAlgorithmStringConverter;
import org.mitre.oauth2.model.convert.JWTStringConverter;
import org.mitre.oauth2.model.convert.PKCEAlgorithmStringConverter;
import org.mitre.oauth2.model.convert.SimpleGrantedAuthorityStringConverter;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.oauth2.provider.ClientDetails;
import javax.persistence.Basic; import javax.persistence.Basic;
import javax.persistence.CollectionTable; import javax.persistence.CollectionTable;
@ -47,22 +56,11 @@ import javax.persistence.Table;
import javax.persistence.Temporal; import javax.persistence.Temporal;
import javax.persistence.TemporalType; import javax.persistence.TemporalType;
import javax.persistence.Transient; import javax.persistence.Transient;
import java.util.Date;
import org.mitre.oauth2.model.convert.JWEAlgorithmStringConverter; import java.util.HashMap;
import org.mitre.oauth2.model.convert.JWEEncryptionMethodStringConverter; import java.util.HashSet;
import org.mitre.oauth2.model.convert.JWKSetStringConverter; import java.util.Map;
import org.mitre.oauth2.model.convert.JWSAlgorithmStringConverter; import java.util.Set;
import org.mitre.oauth2.model.convert.JWTStringConverter;
import org.mitre.oauth2.model.convert.PKCEAlgorithmStringConverter;
import org.mitre.oauth2.model.convert.SimpleGrantedAuthorityStringConverter;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.oauth2.provider.ClientDetails;
import com.nimbusds.jose.EncryptionMethod;
import com.nimbusds.jose.JWEAlgorithm;
import com.nimbusds.jose.JWSAlgorithm;
import com.nimbusds.jose.jwk.JWKSet;
import com.nimbusds.jwt.JWT;
/** /**
* @author jricher * @author jricher
@ -91,7 +89,6 @@ public class ClientDetailsEntity implements ClientDetails {
private Set<String> redirectUris = new HashSet<>(); private Set<String> redirectUris = new HashSet<>();
private String clientName; private String clientName;
private String clientUri; private String clientUri;
private String logoUri;
private Set<String> contacts; private Set<String> contacts;
private String tosUri; private String tosUri;
private AuthMethod tokenEndpointAuthMethod = AuthMethod.SECRET_BASIC; private AuthMethod tokenEndpointAuthMethod = AuthMethod.SECRET_BASIC;
@ -488,16 +485,6 @@ public class ClientDetailsEntity implements ClientDetails {
this.contacts = contacts; this.contacts = contacts;
} }
@Basic
@Column(name="logo_uri")
public String getLogoUri() {
return logoUri;
}
public void setLogoUri(String logoUri) {
this.logoUri = logoUri;
}
@Basic @Basic
@Column(name="policy_uri") @Column(name="policy_uri")
public String getPolicyUri() { public String getPolicyUri() {

View File

@ -20,21 +20,20 @@
*/ */
package org.mitre.oauth2.model; package org.mitre.oauth2.model;
import java.util.Date;
import java.util.Map;
import java.util.Set;
import org.mitre.oauth2.model.ClientDetailsEntity.AppType;
import org.mitre.oauth2.model.ClientDetailsEntity.AuthMethod;
import org.mitre.oauth2.model.ClientDetailsEntity.SubjectType;
import org.springframework.security.core.GrantedAuthority;
import com.google.gson.JsonObject; import com.google.gson.JsonObject;
import com.nimbusds.jose.EncryptionMethod; import com.nimbusds.jose.EncryptionMethod;
import com.nimbusds.jose.JWEAlgorithm; import com.nimbusds.jose.JWEAlgorithm;
import com.nimbusds.jose.JWSAlgorithm; import com.nimbusds.jose.JWSAlgorithm;
import com.nimbusds.jose.jwk.JWKSet; import com.nimbusds.jose.jwk.JWKSet;
import com.nimbusds.jwt.JWT; import com.nimbusds.jwt.JWT;
import org.mitre.oauth2.model.ClientDetailsEntity.AppType;
import org.mitre.oauth2.model.ClientDetailsEntity.AuthMethod;
import org.mitre.oauth2.model.ClientDetailsEntity.SubjectType;
import org.springframework.security.core.GrantedAuthority;
import java.util.Date;
import java.util.Map;
import java.util.Set;
/** /**
* @author jricher * @author jricher
@ -246,14 +245,6 @@ public class RegisteredClient {
client.setContacts(contacts); client.setContacts(contacts);
} }
public String getLogoUri() {
return client.getLogoUri();
}
public void setLogoUri(String logoUri) {
client.setLogoUri(logoUri);
}
public String getPolicyUri() { public String getPolicyUri() {
return client.getPolicyUri(); return client.getPolicyUri();
} }

View File

@ -21,25 +21,6 @@
package org.mitre.openid.connect; package org.mitre.openid.connect;
import static org.mitre.util.JsonUtils.getAsArray;
import static org.mitre.util.JsonUtils.getAsDate;
import static org.mitre.util.JsonUtils.getAsJweAlgorithm;
import static org.mitre.util.JsonUtils.getAsJweEncryptionMethod;
import static org.mitre.util.JsonUtils.getAsJwsAlgorithm;
import static org.mitre.util.JsonUtils.getAsPkceAlgorithm;
import static org.mitre.util.JsonUtils.getAsString;
import static org.mitre.util.JsonUtils.getAsStringSet;
import java.text.ParseException;
import org.mitre.oauth2.model.ClientDetailsEntity;
import org.mitre.oauth2.model.ClientDetailsEntity.AppType;
import org.mitre.oauth2.model.ClientDetailsEntity.AuthMethod;
import org.mitre.oauth2.model.ClientDetailsEntity.SubjectType;
import org.mitre.oauth2.model.RegisteredClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.base.Joiner; import com.google.common.base.Joiner;
import com.google.common.base.Splitter; import com.google.common.base.Splitter;
import com.google.common.base.Strings; import com.google.common.base.Strings;
@ -50,6 +31,15 @@ import com.google.gson.JsonParser;
import com.nimbusds.jose.jwk.JWKSet; import com.nimbusds.jose.jwk.JWKSet;
import com.nimbusds.jwt.JWT; import com.nimbusds.jwt.JWT;
import com.nimbusds.jwt.JWTParser; import com.nimbusds.jwt.JWTParser;
import org.mitre.oauth2.model.ClientDetailsEntity;
import org.mitre.oauth2.model.ClientDetailsEntity.AppType;
import org.mitre.oauth2.model.ClientDetailsEntity.AuthMethod;
import org.mitre.oauth2.model.ClientDetailsEntity.SubjectType;
import org.mitre.oauth2.model.RegisteredClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.text.ParseException;
import static org.mitre.oauth2.model.RegisteredClientFields.APPLICATION_TYPE; import static org.mitre.oauth2.model.RegisteredClientFields.APPLICATION_TYPE;
import static org.mitre.oauth2.model.RegisteredClientFields.CLAIMS_REDIRECT_URIS; import static org.mitre.oauth2.model.RegisteredClientFields.CLAIMS_REDIRECT_URIS;
@ -70,7 +60,6 @@ import static org.mitre.oauth2.model.RegisteredClientFields.ID_TOKEN_SIGNED_RESP
import static org.mitre.oauth2.model.RegisteredClientFields.INITIATE_LOGIN_URI; import static org.mitre.oauth2.model.RegisteredClientFields.INITIATE_LOGIN_URI;
import static org.mitre.oauth2.model.RegisteredClientFields.JWKS; import static org.mitre.oauth2.model.RegisteredClientFields.JWKS;
import static org.mitre.oauth2.model.RegisteredClientFields.JWKS_URI; import static org.mitre.oauth2.model.RegisteredClientFields.JWKS_URI;
import static org.mitre.oauth2.model.RegisteredClientFields.LOGO_URI;
import static org.mitre.oauth2.model.RegisteredClientFields.POLICY_URI; import static org.mitre.oauth2.model.RegisteredClientFields.POLICY_URI;
import static org.mitre.oauth2.model.RegisteredClientFields.POST_LOGOUT_REDIRECT_URIS; import static org.mitre.oauth2.model.RegisteredClientFields.POST_LOGOUT_REDIRECT_URIS;
import static org.mitre.oauth2.model.RegisteredClientFields.REDIRECT_URIS; import static org.mitre.oauth2.model.RegisteredClientFields.REDIRECT_URIS;
@ -93,6 +82,14 @@ import static org.mitre.oauth2.model.RegisteredClientFields.TOS_URI;
import static org.mitre.oauth2.model.RegisteredClientFields.USERINFO_ENCRYPTED_RESPONSE_ALG; import static org.mitre.oauth2.model.RegisteredClientFields.USERINFO_ENCRYPTED_RESPONSE_ALG;
import static org.mitre.oauth2.model.RegisteredClientFields.USERINFO_ENCRYPTED_RESPONSE_ENC; import static org.mitre.oauth2.model.RegisteredClientFields.USERINFO_ENCRYPTED_RESPONSE_ENC;
import static org.mitre.oauth2.model.RegisteredClientFields.USERINFO_SIGNED_RESPONSE_ALG; import static org.mitre.oauth2.model.RegisteredClientFields.USERINFO_SIGNED_RESPONSE_ALG;
import static org.mitre.util.JsonUtils.getAsArray;
import static org.mitre.util.JsonUtils.getAsDate;
import static org.mitre.util.JsonUtils.getAsJweAlgorithm;
import static org.mitre.util.JsonUtils.getAsJweEncryptionMethod;
import static org.mitre.util.JsonUtils.getAsJwsAlgorithm;
import static org.mitre.util.JsonUtils.getAsPkceAlgorithm;
import static org.mitre.util.JsonUtils.getAsString;
import static org.mitre.util.JsonUtils.getAsStringSet;
/** /**
* Utility class to handle the parsing and serialization of ClientDetails objects. * Utility class to handle the parsing and serialization of ClientDetails objects.
@ -124,7 +121,6 @@ public class ClientDetailsEntityJsonProcessor {
c.setRedirectUris(getAsStringSet(o, REDIRECT_URIS)); c.setRedirectUris(getAsStringSet(o, REDIRECT_URIS));
c.setClientName(getAsString(o, CLIENT_NAME)); c.setClientName(getAsString(o, CLIENT_NAME));
c.setClientUri(getAsString(o, CLIENT_URI)); c.setClientUri(getAsString(o, CLIENT_URI));
c.setLogoUri(getAsString(o, LOGO_URI));
c.setContacts(getAsStringSet(o, CONTACTS)); c.setContacts(getAsStringSet(o, CONTACTS));
c.setTosUri(getAsString(o, TOS_URI)); c.setTosUri(getAsString(o, TOS_URI));
@ -301,7 +297,6 @@ public class ClientDetailsEntityJsonProcessor {
o.add(REDIRECT_URIS, getAsArray(c.getRedirectUris())); o.add(REDIRECT_URIS, getAsArray(c.getRedirectUris()));
o.addProperty(CLIENT_NAME, c.getClientName()); o.addProperty(CLIENT_NAME, c.getClientName());
o.addProperty(CLIENT_URI, c.getClientUri()); o.addProperty(CLIENT_URI, c.getClientUri());
o.addProperty(LOGO_URI, c.getLogoUri());
o.add(CONTACTS, getAsArray(c.getContacts())); o.add(CONTACTS, getAsArray(c.getContacts()));
o.addProperty(TOS_URI, c.getTosUri()); o.addProperty(TOS_URI, c.getTosUri());
o.addProperty(TOKEN_ENDPOINT_AUTH_METHOD, c.getTokenEndpointAuthMethod() != null ? c.getTokenEndpointAuthMethod().getValue() : null); o.addProperty(TOKEN_ENDPOINT_AUTH_METHOD, c.getTokenEndpointAuthMethod() != null ? c.getTokenEndpointAuthMethod().getValue() : null);

View File

@ -1,52 +0,0 @@
/*******************************************************************************
* Copyright 2018 The MIT Internet Trust Consortium
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*******************************************************************************/
package org.mitre.openid.connect.model;
/**
* @author jricher
*/
public class CachedImage {
private byte[] data;
private String contentType;
private long length;
public byte[] getData() {
return data;
}
public void setData(byte[] data) {
this.data = data;
}
public String getContentType() {
return contentType;
}
public void setContentType(String contentType) {
this.contentType = contentType;
}
public long getLength() {
return length;
}
public void setLength(long length) {
this.length = length;
}
}

View File

@ -1,34 +0,0 @@
/*******************************************************************************
* Copyright 2018 The MIT Internet Trust Consortium
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*******************************************************************************/
package org.mitre.openid.connect.service;
import org.mitre.oauth2.model.ClientDetailsEntity;
import org.mitre.openid.connect.model.CachedImage;
/**
* @author jricher
*
*/
public interface ClientLogoLoadingService {
/**
* @param client
* @return
*/
CachedImage getLogo(ClientDetailsEntity client);
}

View File

@ -1,122 +0,0 @@
/*******************************************************************************
* Copyright 2018 The MIT Internet Trust Consortium
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*******************************************************************************/
package org.mitre.openid.connect.service.impl;
import java.io.IOException;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import org.apache.commons.io.IOUtils;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.HttpClientBuilder;
import org.mitre.oauth2.model.ClientDetailsEntity;
import org.mitre.openid.connect.model.CachedImage;
import org.mitre.openid.connect.service.ClientLogoLoadingService;
import org.springframework.stereotype.Service;
import com.google.common.base.Strings;
import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;
import com.google.common.util.concurrent.UncheckedExecutionException;
/**
* @author jricher
*
*/
@Service("inMemoryClientLogoLoadingService")
public class InMemoryClientLogoLoadingService implements ClientLogoLoadingService {
private LoadingCache<ClientDetailsEntity, CachedImage> cache;
public InMemoryClientLogoLoadingService() {
this(HttpClientBuilder.create().useSystemProperties().build());
}
/**
*
*/
public InMemoryClientLogoLoadingService(HttpClient httpClient) {
cache = CacheBuilder.newBuilder()
.maximumSize(100)
.expireAfterAccess(14, TimeUnit.DAYS)
.build(new ClientLogoFetcher(httpClient));
}
/* (non-Javadoc)
* @see org.mitre.openid.connect.service.ClientLogoLoadingService#getLogo(org.mitre.oauth2.model.ClientDetailsEntity)
*/
@Override
public CachedImage getLogo(ClientDetailsEntity client) {
try {
if (client != null && !Strings.isNullOrEmpty(client.getLogoUri())) {
return cache.get(client);
} else {
return null;
}
} catch (UncheckedExecutionException | ExecutionException e) {
return null;
}
}
/**
* @author jricher
*
*/
public class ClientLogoFetcher extends CacheLoader<ClientDetailsEntity, CachedImage> {
private HttpClient httpClient;
public ClientLogoFetcher() {
this(HttpClientBuilder.create().useSystemProperties().build());
}
public ClientLogoFetcher(HttpClient httpClient) {
this.httpClient = httpClient;
}
/* (non-Javadoc)
* @see com.google.common.cache.CacheLoader#load(java.lang.Object)
*/
@Override
public CachedImage load(ClientDetailsEntity key) throws Exception {
try {
HttpResponse response = httpClient.execute(new HttpGet(key.getLogoUri()));
HttpEntity entity = response.getEntity();
CachedImage image = new CachedImage();
image.setContentType(entity.getContentType().getValue());
image.setLength(entity.getContentLength());
image.setData(IOUtils.toByteArray(entity.getContent()));
return image;
} catch (IOException e) {
throw new IllegalArgumentException("Unable to load client image.");
}
}
}
}

View File

@ -17,49 +17,6 @@
*******************************************************************************/ *******************************************************************************/
package org.mitre.openid.connect.web; package org.mitre.openid.connect.web;
import java.lang.reflect.Type;
import java.sql.SQLIntegrityConstraintViolationException;
import java.text.ParseException;
import java.util.Collection;
import javax.persistence.PersistenceException;
import org.eclipse.persistence.exceptions.DatabaseException;
import org.mitre.jwt.assertion.AssertionValidator;
import org.mitre.oauth2.model.ClientDetailsEntity;
import org.mitre.oauth2.model.ClientDetailsEntity.AppType;
import org.mitre.oauth2.model.ClientDetailsEntity.AuthMethod;
import org.mitre.oauth2.model.ClientDetailsEntity.SubjectType;
import org.mitre.oauth2.model.PKCEAlgorithm;
import org.mitre.oauth2.service.ClientDetailsEntityService;
import org.mitre.oauth2.web.AuthenticationUtilities;
import org.mitre.openid.connect.exception.ValidationException;
import org.mitre.openid.connect.model.CachedImage;
import org.mitre.openid.connect.service.ClientLogoLoadingService;
import org.mitre.openid.connect.view.ClientEntityViewForAdmins;
import org.mitre.openid.connect.view.ClientEntityViewForUsers;
import org.mitre.openid.connect.view.HttpCodeView;
import org.mitre.openid.connect.view.JsonEntityView;
import org.mitre.openid.connect.view.JsonErrorView;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.security.core.Authentication;
import org.springframework.security.oauth2.common.util.OAuth2Utils;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;
import com.google.common.base.Strings; import com.google.common.base.Strings;
import com.google.common.collect.Sets; import com.google.common.collect.Sets;
import com.google.gson.Gson; import com.google.gson.Gson;
@ -79,6 +36,43 @@ import com.nimbusds.jose.jwk.JWKSet;
import com.nimbusds.jwt.JWT; import com.nimbusds.jwt.JWT;
import com.nimbusds.jwt.JWTClaimsSet; import com.nimbusds.jwt.JWTClaimsSet;
import com.nimbusds.jwt.JWTParser; import com.nimbusds.jwt.JWTParser;
import org.eclipse.persistence.exceptions.DatabaseException;
import org.mitre.jwt.assertion.AssertionValidator;
import org.mitre.oauth2.model.ClientDetailsEntity;
import org.mitre.oauth2.model.ClientDetailsEntity.AppType;
import org.mitre.oauth2.model.ClientDetailsEntity.AuthMethod;
import org.mitre.oauth2.model.ClientDetailsEntity.SubjectType;
import org.mitre.oauth2.model.PKCEAlgorithm;
import org.mitre.oauth2.service.ClientDetailsEntityService;
import org.mitre.oauth2.web.AuthenticationUtilities;
import org.mitre.openid.connect.exception.ValidationException;
import org.mitre.openid.connect.view.ClientEntityViewForAdmins;
import org.mitre.openid.connect.view.ClientEntityViewForUsers;
import org.mitre.openid.connect.view.HttpCodeView;
import org.mitre.openid.connect.view.JsonEntityView;
import org.mitre.openid.connect.view.JsonErrorView;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.security.core.Authentication;
import org.springframework.security.oauth2.common.util.OAuth2Utils;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;
import javax.persistence.PersistenceException;
import java.lang.reflect.Type;
import java.sql.SQLIntegrityConstraintViolationException;
import java.text.ParseException;
import java.util.Collection;
import static org.mitre.oauth2.model.RegisteredClientFields.APPLICATION_TYPE; import static org.mitre.oauth2.model.RegisteredClientFields.APPLICATION_TYPE;
import static org.mitre.oauth2.model.RegisteredClientFields.CLAIMS_REDIRECT_URIS; import static org.mitre.oauth2.model.RegisteredClientFields.CLAIMS_REDIRECT_URIS;
@ -98,7 +92,6 @@ import static org.mitre.oauth2.model.RegisteredClientFields.ID_TOKEN_SIGNED_RESP
import static org.mitre.oauth2.model.RegisteredClientFields.INITIATE_LOGIN_URI; import static org.mitre.oauth2.model.RegisteredClientFields.INITIATE_LOGIN_URI;
import static org.mitre.oauth2.model.RegisteredClientFields.JWKS; import static org.mitre.oauth2.model.RegisteredClientFields.JWKS;
import static org.mitre.oauth2.model.RegisteredClientFields.JWKS_URI; import static org.mitre.oauth2.model.RegisteredClientFields.JWKS_URI;
import static org.mitre.oauth2.model.RegisteredClientFields.LOGO_URI;
import static org.mitre.oauth2.model.RegisteredClientFields.POLICY_URI; import static org.mitre.oauth2.model.RegisteredClientFields.POLICY_URI;
import static org.mitre.oauth2.model.RegisteredClientFields.POST_LOGOUT_REDIRECT_URIS; import static org.mitre.oauth2.model.RegisteredClientFields.POST_LOGOUT_REDIRECT_URIS;
import static org.mitre.oauth2.model.RegisteredClientFields.REDIRECT_URIS; import static org.mitre.oauth2.model.RegisteredClientFields.REDIRECT_URIS;
@ -133,9 +126,6 @@ public class ClientAPI {
@Autowired @Autowired
private ClientDetailsEntityService clientService; private ClientDetailsEntityService clientService;
@Autowired
private ClientLogoLoadingService clientLogoLoadingService;
@Autowired @Autowired
@Qualifier("clientAssertionValidator") @Qualifier("clientAssertionValidator")
private AssertionValidator assertionValidator; private AssertionValidator assertionValidator;
@ -506,31 +496,6 @@ public class ClientAPI {
} }
} }
/**
* Get the logo image for a client
* @param id
*/
@RequestMapping(value = "/{id}/logo", method=RequestMethod.GET, produces = { MediaType.IMAGE_GIF_VALUE, MediaType.IMAGE_JPEG_VALUE, MediaType.IMAGE_PNG_VALUE })
public ResponseEntity<byte[]> getClientLogo(@PathVariable("id") Long id, Model model) {
ClientDetailsEntity client = clientService.getClientById(id);
if (client == null) {
return new ResponseEntity<>(HttpStatus.NOT_FOUND);
} else if (Strings.isNullOrEmpty(client.getLogoUri())) {
return new ResponseEntity<>(HttpStatus.NOT_FOUND);
} else {
// get the image from cache
CachedImage image = clientLogoLoadingService.getLogo(client);
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.parseMediaType(image.getContentType()));
headers.setContentLength(image.getLength());
return new ResponseEntity<>(image.getData(), headers, HttpStatus.OK);
}
}
private ClientDetailsEntity validateSoftwareStatement(ClientDetailsEntity newClient) throws ValidationException { private ClientDetailsEntity validateSoftwareStatement(ClientDetailsEntity newClient) throws ValidationException {
if (newClient.getSoftwareStatement() != null) { if (newClient.getSoftwareStatement() != null) {
if (assertionValidator.isValid(newClient.getSoftwareStatement())) { if (assertionValidator.isValid(newClient.getSoftwareStatement())) {
@ -632,9 +597,6 @@ public class ClientAPI {
case CONTACTS: case CONTACTS:
newClient.setContacts(Sets.newHashSet(claimSet.getStringListClaim(claim))); newClient.setContacts(Sets.newHashSet(claimSet.getStringListClaim(claim)));
break; break;
case LOGO_URI:
newClient.setLogoUri(claimSet.getStringClaim(claim));
break;
case CLIENT_URI: case CLIENT_URI:
newClient.setClientUri(claimSet.getStringClaim(claim)); newClient.setClientUri(claimSet.getStringClaim(claim));
break; break;

View File

@ -17,13 +17,15 @@
*******************************************************************************/ *******************************************************************************/
package org.mitre.openid.connect.web; package org.mitre.openid.connect.web;
import java.io.UnsupportedEncodingException; import com.google.common.base.Strings;
import java.text.ParseException; import com.google.common.collect.ImmutableSet;
import java.util.Date; import com.google.common.collect.Sets;
import java.util.HashSet; import com.google.gson.JsonSyntaxException;
import java.util.Set; import com.nimbusds.jose.EncryptionMethod;
import java.util.concurrent.TimeUnit; import com.nimbusds.jose.JWEAlgorithm;
import com.nimbusds.jose.JWSAlgorithm;
import com.nimbusds.jose.jwk.JWKSet;
import com.nimbusds.jwt.JWTClaimsSet;
import org.mitre.jwt.assertion.AssertionValidator; import org.mitre.jwt.assertion.AssertionValidator;
import org.mitre.oauth2.model.ClientDetailsEntity; import org.mitre.oauth2.model.ClientDetailsEntity;
import org.mitre.oauth2.model.ClientDetailsEntity.AppType; import org.mitre.oauth2.model.ClientDetailsEntity.AppType;
@ -61,15 +63,12 @@ import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.util.UriUtils; import org.springframework.web.util.UriUtils;
import com.google.common.base.Strings; import java.io.UnsupportedEncodingException;
import com.google.common.collect.ImmutableSet; import java.text.ParseException;
import com.google.common.collect.Sets; import java.util.Date;
import com.google.gson.JsonSyntaxException; import java.util.HashSet;
import com.nimbusds.jose.EncryptionMethod; import java.util.Set;
import com.nimbusds.jose.JWEAlgorithm; import java.util.concurrent.TimeUnit;
import com.nimbusds.jose.JWSAlgorithm;
import com.nimbusds.jose.jwk.JWKSet;
import com.nimbusds.jwt.JWTClaimsSet;
import static org.mitre.oauth2.model.RegisteredClientFields.APPLICATION_TYPE; import static org.mitre.oauth2.model.RegisteredClientFields.APPLICATION_TYPE;
import static org.mitre.oauth2.model.RegisteredClientFields.CLAIMS_REDIRECT_URIS; import static org.mitre.oauth2.model.RegisteredClientFields.CLAIMS_REDIRECT_URIS;
@ -89,7 +88,6 @@ import static org.mitre.oauth2.model.RegisteredClientFields.ID_TOKEN_SIGNED_RESP
import static org.mitre.oauth2.model.RegisteredClientFields.INITIATE_LOGIN_URI; import static org.mitre.oauth2.model.RegisteredClientFields.INITIATE_LOGIN_URI;
import static org.mitre.oauth2.model.RegisteredClientFields.JWKS; import static org.mitre.oauth2.model.RegisteredClientFields.JWKS;
import static org.mitre.oauth2.model.RegisteredClientFields.JWKS_URI; import static org.mitre.oauth2.model.RegisteredClientFields.JWKS_URI;
import static org.mitre.oauth2.model.RegisteredClientFields.LOGO_URI;
import static org.mitre.oauth2.model.RegisteredClientFields.POLICY_URI; import static org.mitre.oauth2.model.RegisteredClientFields.POLICY_URI;
import static org.mitre.oauth2.model.RegisteredClientFields.POST_LOGOUT_REDIRECT_URIS; import static org.mitre.oauth2.model.RegisteredClientFields.POST_LOGOUT_REDIRECT_URIS;
import static org.mitre.oauth2.model.RegisteredClientFields.REDIRECT_URIS; import static org.mitre.oauth2.model.RegisteredClientFields.REDIRECT_URIS;
@ -712,9 +710,6 @@ public class DynamicClientRegistrationEndpoint {
case CONTACTS: case CONTACTS:
newClient.setContacts(Sets.newHashSet(claimSet.getStringListClaim(claim))); newClient.setContacts(Sets.newHashSet(claimSet.getStringListClaim(claim)));
break; break;
case LOGO_URI:
newClient.setLogoUri(claimSet.getStringClaim(claim));
break;
case CLIENT_URI: case CLIENT_URI:
newClient.setClientUri(claimSet.getStringClaim(claim)); newClient.setClientUri(claimSet.getStringClaim(claim));
break; break;

View File

@ -20,13 +20,12 @@
*/ */
package org.mitre.oauth2.model; package org.mitre.oauth2.model;
import java.util.Date;
import org.junit.Test;
import com.google.common.collect.ImmutableSet; import com.google.common.collect.ImmutableSet;
import com.nimbusds.jose.EncryptionMethod; import com.nimbusds.jose.EncryptionMethod;
import com.nimbusds.jose.JWEAlgorithm; import com.nimbusds.jose.JWEAlgorithm;
import org.junit.Test;
import java.util.Date;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals;
@ -50,7 +49,6 @@ public class ClientDetailsEntityTest {
c.setApplicationType(ClientDetailsEntity.AppType.WEB); c.setApplicationType(ClientDetailsEntity.AppType.WEB);
c.setRedirectUris(ImmutableSet.of("https://client.example.org/callback", "https://client.example.org/callback2")); c.setRedirectUris(ImmutableSet.of("https://client.example.org/callback", "https://client.example.org/callback2"));
c.setClientName("My Example"); c.setClientName("My Example");
c.setLogoUri("https://client.example.org/logo.png");
c.setSubjectType(ClientDetailsEntity.SubjectType.PAIRWISE); c.setSubjectType(ClientDetailsEntity.SubjectType.PAIRWISE);
c.setSectorIdentifierUri("https://other.example.net/file_of_redirect_uris.json"); c.setSectorIdentifierUri("https://other.example.net/file_of_redirect_uris.json");
c.setTokenEndpointAuthMethod(ClientDetailsEntity.AuthMethod.SECRET_BASIC); c.setTokenEndpointAuthMethod(ClientDetailsEntity.AuthMethod.SECRET_BASIC);
@ -67,7 +65,6 @@ public class ClientDetailsEntityTest {
assertEquals(ClientDetailsEntity.AppType.WEB, c.getApplicationType()); assertEquals(ClientDetailsEntity.AppType.WEB, c.getApplicationType());
assertEquals(ImmutableSet.of("https://client.example.org/callback", "https://client.example.org/callback2"), c.getRedirectUris()); assertEquals(ImmutableSet.of("https://client.example.org/callback", "https://client.example.org/callback2"), c.getRedirectUris());
assertEquals("My Example", c.getClientName()); assertEquals("My Example", c.getClientName());
assertEquals("https://client.example.org/logo.png", c.getLogoUri());
assertEquals(ClientDetailsEntity.SubjectType.PAIRWISE, c.getSubjectType()); assertEquals(ClientDetailsEntity.SubjectType.PAIRWISE, c.getSubjectType());
assertEquals("https://other.example.net/file_of_redirect_uris.json", c.getSectorIdentifierUri()); assertEquals("https://other.example.net/file_of_redirect_uris.json", c.getSectorIdentifierUri());
assertEquals(ClientDetailsEntity.AuthMethod.SECRET_BASIC, c.getTokenEndpointAuthMethod()); assertEquals(ClientDetailsEntity.AuthMethod.SECRET_BASIC, c.getTokenEndpointAuthMethod());

View File

@ -20,13 +20,12 @@
*/ */
package org.mitre.oauth2.model; package org.mitre.oauth2.model;
import java.sql.Date;
import org.junit.Test;
import com.google.common.collect.ImmutableSet; import com.google.common.collect.ImmutableSet;
import com.nimbusds.jose.EncryptionMethod; import com.nimbusds.jose.EncryptionMethod;
import com.nimbusds.jose.JWEAlgorithm; import com.nimbusds.jose.JWEAlgorithm;
import org.junit.Test;
import java.sql.Date;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals;
@ -54,7 +53,6 @@ public class RegisteredClientTest {
c.setApplicationType(ClientDetailsEntity.AppType.WEB); c.setApplicationType(ClientDetailsEntity.AppType.WEB);
c.setRedirectUris(ImmutableSet.of("https://client.example.org/callback", "https://client.example.org/callback2")); c.setRedirectUris(ImmutableSet.of("https://client.example.org/callback", "https://client.example.org/callback2"));
c.setClientName("My Example"); c.setClientName("My Example");
c.setLogoUri("https://client.example.org/logo.png");
c.setSubjectType(ClientDetailsEntity.SubjectType.PAIRWISE); c.setSubjectType(ClientDetailsEntity.SubjectType.PAIRWISE);
c.setSectorIdentifierUri("https://other.example.net/file_of_redirect_uris.json"); c.setSectorIdentifierUri("https://other.example.net/file_of_redirect_uris.json");
c.setTokenEndpointAuthMethod(ClientDetailsEntity.AuthMethod.SECRET_BASIC); c.setTokenEndpointAuthMethod(ClientDetailsEntity.AuthMethod.SECRET_BASIC);
@ -72,7 +70,6 @@ public class RegisteredClientTest {
assertEquals(ClientDetailsEntity.AppType.WEB, c.getApplicationType()); assertEquals(ClientDetailsEntity.AppType.WEB, c.getApplicationType());
assertEquals(ImmutableSet.of("https://client.example.org/callback", "https://client.example.org/callback2"), c.getRedirectUris()); assertEquals(ImmutableSet.of("https://client.example.org/callback", "https://client.example.org/callback2"), c.getRedirectUris());
assertEquals("My Example", c.getClientName()); assertEquals("My Example", c.getClientName());
assertEquals("https://client.example.org/logo.png", c.getLogoUri());
assertEquals(ClientDetailsEntity.SubjectType.PAIRWISE, c.getSubjectType()); assertEquals(ClientDetailsEntity.SubjectType.PAIRWISE, c.getSubjectType());
assertEquals("https://other.example.net/file_of_redirect_uris.json", c.getSectorIdentifierUri()); assertEquals("https://other.example.net/file_of_redirect_uris.json", c.getSectorIdentifierUri());
assertEquals(ClientDetailsEntity.AuthMethod.SECRET_BASIC, c.getTokenEndpointAuthMethod()); assertEquals(ClientDetailsEntity.AuthMethod.SECRET_BASIC, c.getTokenEndpointAuthMethod());
@ -95,7 +92,7 @@ public class RegisteredClientTest {
c.setApplicationType(ClientDetailsEntity.AppType.WEB); c.setApplicationType(ClientDetailsEntity.AppType.WEB);
c.setRedirectUris(ImmutableSet.of("https://client.example.org/callback", "https://client.example.org/callback2")); c.setRedirectUris(ImmutableSet.of("https://client.example.org/callback", "https://client.example.org/callback2"));
c.setClientName("My Example"); c.setClientName("My Example");
c.setLogoUri("https://client.example.org/logo.png");
c.setSubjectType(ClientDetailsEntity.SubjectType.PAIRWISE); c.setSubjectType(ClientDetailsEntity.SubjectType.PAIRWISE);
c.setSectorIdentifierUri("https://other.example.net/file_of_redirect_uris.json"); c.setSectorIdentifierUri("https://other.example.net/file_of_redirect_uris.json");
c.setTokenEndpointAuthMethod(ClientDetailsEntity.AuthMethod.SECRET_BASIC); c.setTokenEndpointAuthMethod(ClientDetailsEntity.AuthMethod.SECRET_BASIC);
@ -120,7 +117,6 @@ public class RegisteredClientTest {
assertEquals(ClientDetailsEntity.AppType.WEB, rc.getApplicationType()); assertEquals(ClientDetailsEntity.AppType.WEB, rc.getApplicationType());
assertEquals(ImmutableSet.of("https://client.example.org/callback", "https://client.example.org/callback2"), rc.getRedirectUris()); assertEquals(ImmutableSet.of("https://client.example.org/callback", "https://client.example.org/callback2"), rc.getRedirectUris());
assertEquals("My Example", rc.getClientName()); assertEquals("My Example", rc.getClientName());
assertEquals("https://client.example.org/logo.png", rc.getLogoUri());
assertEquals(ClientDetailsEntity.SubjectType.PAIRWISE, rc.getSubjectType()); assertEquals(ClientDetailsEntity.SubjectType.PAIRWISE, rc.getSubjectType());
assertEquals("https://other.example.net/file_of_redirect_uris.json", rc.getSectorIdentifierUri()); assertEquals("https://other.example.net/file_of_redirect_uris.json", rc.getSectorIdentifierUri());
assertEquals(ClientDetailsEntity.AuthMethod.SECRET_BASIC, rc.getTokenEndpointAuthMethod()); assertEquals(ClientDetailsEntity.AuthMethod.SECRET_BASIC, rc.getTokenEndpointAuthMethod());
@ -143,7 +139,7 @@ public class RegisteredClientTest {
c.setApplicationType(ClientDetailsEntity.AppType.WEB); c.setApplicationType(ClientDetailsEntity.AppType.WEB);
c.setRedirectUris(ImmutableSet.of("https://client.example.org/callback", "https://client.example.org/callback2")); c.setRedirectUris(ImmutableSet.of("https://client.example.org/callback", "https://client.example.org/callback2"));
c.setClientName("My Example"); c.setClientName("My Example");
c.setLogoUri("https://client.example.org/logo.png");
c.setSubjectType(ClientDetailsEntity.SubjectType.PAIRWISE); c.setSubjectType(ClientDetailsEntity.SubjectType.PAIRWISE);
c.setSectorIdentifierUri("https://other.example.net/file_of_redirect_uris.json"); c.setSectorIdentifierUri("https://other.example.net/file_of_redirect_uris.json");
c.setTokenEndpointAuthMethod(ClientDetailsEntity.AuthMethod.SECRET_BASIC); c.setTokenEndpointAuthMethod(ClientDetailsEntity.AuthMethod.SECRET_BASIC);
@ -164,7 +160,6 @@ public class RegisteredClientTest {
assertEquals(ClientDetailsEntity.AppType.WEB, rc.getApplicationType()); assertEquals(ClientDetailsEntity.AppType.WEB, rc.getApplicationType());
assertEquals(ImmutableSet.of("https://client.example.org/callback", "https://client.example.org/callback2"), rc.getRedirectUris()); assertEquals(ImmutableSet.of("https://client.example.org/callback", "https://client.example.org/callback2"), rc.getRedirectUris());
assertEquals("My Example", rc.getClientName()); assertEquals("My Example", rc.getClientName());
assertEquals("https://client.example.org/logo.png", rc.getLogoUri());
assertEquals(ClientDetailsEntity.SubjectType.PAIRWISE, rc.getSubjectType()); assertEquals(ClientDetailsEntity.SubjectType.PAIRWISE, rc.getSubjectType());
assertEquals("https://other.example.net/file_of_redirect_uris.json", rc.getSectorIdentifierUri()); assertEquals("https://other.example.net/file_of_redirect_uris.json", rc.getSectorIdentifierUri());
assertEquals(ClientDetailsEntity.AuthMethod.SECRET_BASIC, rc.getTokenEndpointAuthMethod()); assertEquals(ClientDetailsEntity.AuthMethod.SECRET_BASIC, rc.getTokenEndpointAuthMethod());

View File

@ -20,17 +20,16 @@
*/ */
package org.mitre.openid.connect; package org.mitre.openid.connect;
import java.sql.Date;
import org.junit.Test;
import org.mitre.oauth2.model.ClientDetailsEntity;
import org.mitre.oauth2.model.RegisteredClient;
import com.google.common.collect.ImmutableSet; import com.google.common.collect.ImmutableSet;
import com.google.gson.JsonElement; import com.google.gson.JsonElement;
import com.google.gson.JsonObject; import com.google.gson.JsonObject;
import com.nimbusds.jose.EncryptionMethod; import com.nimbusds.jose.EncryptionMethod;
import com.nimbusds.jose.JWEAlgorithm; import com.nimbusds.jose.JWEAlgorithm;
import org.junit.Test;
import org.mitre.oauth2.model.ClientDetailsEntity;
import org.mitre.oauth2.model.RegisteredClient;
import java.sql.Date;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertTrue;
@ -75,7 +74,6 @@ public class ClientDetailsEntityJsonProcessorTest {
assertEquals("My Example", c.getClientName()); assertEquals("My Example", c.getClientName());
assertEquals(ImmutableSet.of("code", "token"), c.getResponseTypes()); assertEquals(ImmutableSet.of("code", "token"), c.getResponseTypes());
assertEquals(ImmutableSet.of("authorization_code", "implicit"), c.getGrantTypes()); assertEquals(ImmutableSet.of("authorization_code", "implicit"), c.getGrantTypes());
assertEquals("https://client.example.org/logo.png", c.getLogoUri());
assertEquals(ClientDetailsEntity.SubjectType.PAIRWISE, c.getSubjectType()); assertEquals(ClientDetailsEntity.SubjectType.PAIRWISE, c.getSubjectType());
assertEquals("https://other.example.net/file_of_redirect_uris.json", c.getSectorIdentifierUri()); assertEquals("https://other.example.net/file_of_redirect_uris.json", c.getSectorIdentifierUri());
assertEquals(ClientDetailsEntity.AuthMethod.SECRET_BASIC, c.getTokenEndpointAuthMethod()); assertEquals(ClientDetailsEntity.AuthMethod.SECRET_BASIC, c.getTokenEndpointAuthMethod());
@ -137,7 +135,6 @@ public class ClientDetailsEntityJsonProcessorTest {
assertEquals("My Example", c.getClientName()); assertEquals("My Example", c.getClientName());
assertEquals(ImmutableSet.of("code", "token"), c.getResponseTypes()); assertEquals(ImmutableSet.of("code", "token"), c.getResponseTypes());
assertEquals(ImmutableSet.of("authorization_code", "implicit"), c.getGrantTypes()); assertEquals(ImmutableSet.of("authorization_code", "implicit"), c.getGrantTypes());
assertEquals("https://client.example.org/logo.png", c.getLogoUri());
assertEquals(ClientDetailsEntity.SubjectType.PAIRWISE, c.getSubjectType()); assertEquals(ClientDetailsEntity.SubjectType.PAIRWISE, c.getSubjectType());
assertEquals("https://other.example.net/file_of_redirect_uris.json", c.getSectorIdentifierUri()); assertEquals("https://other.example.net/file_of_redirect_uris.json", c.getSectorIdentifierUri());
assertEquals(ClientDetailsEntity.AuthMethod.SECRET_BASIC, c.getTokenEndpointAuthMethod()); assertEquals(ClientDetailsEntity.AuthMethod.SECRET_BASIC, c.getTokenEndpointAuthMethod());
@ -166,7 +163,6 @@ public class ClientDetailsEntityJsonProcessorTest {
c.setClientName("My Example"); c.setClientName("My Example");
c.setResponseTypes(ImmutableSet.of("code", "token")); c.setResponseTypes(ImmutableSet.of("code", "token"));
c.setGrantTypes(ImmutableSet.of("authorization_code", "implicit")); c.setGrantTypes(ImmutableSet.of("authorization_code", "implicit"));
c.setLogoUri("https://client.example.org/logo.png");
c.setSubjectType(ClientDetailsEntity.SubjectType.PAIRWISE); c.setSubjectType(ClientDetailsEntity.SubjectType.PAIRWISE);
c.setSectorIdentifierUri("https://other.example.net/file_of_redirect_uris.json"); c.setSectorIdentifierUri("https://other.example.net/file_of_redirect_uris.json");
c.setTokenEndpointAuthMethod(ClientDetailsEntity.AuthMethod.SECRET_BASIC); c.setTokenEndpointAuthMethod(ClientDetailsEntity.AuthMethod.SECRET_BASIC);
@ -194,7 +190,6 @@ public class ClientDetailsEntityJsonProcessorTest {
for (JsonElement e : j.get("grant_types").getAsJsonArray()) { for (JsonElement e : j.get("grant_types").getAsJsonArray()) {
assertTrue(ImmutableSet.of("authorization_code", "implicit").contains(e.getAsString())); assertTrue(ImmutableSet.of("authorization_code", "implicit").contains(e.getAsString()));
} }
assertEquals("https://client.example.org/logo.png", j.get("logo_uri").getAsString());
assertEquals(ClientDetailsEntity.SubjectType.PAIRWISE.getValue(), j.get("subject_type").getAsString()); assertEquals(ClientDetailsEntity.SubjectType.PAIRWISE.getValue(), j.get("subject_type").getAsString());
assertEquals("https://other.example.net/file_of_redirect_uris.json", j.get("sector_identifier_uri").getAsString()); assertEquals("https://other.example.net/file_of_redirect_uris.json", j.get("sector_identifier_uri").getAsString());
assertEquals(ClientDetailsEntity.AuthMethod.SECRET_BASIC.getValue(), j.get("token_endpoint_auth_method").getAsString()); assertEquals(ClientDetailsEntity.AuthMethod.SECRET_BASIC.getValue(), j.get("token_endpoint_auth_method").getAsString());