Skip to content

Add jwt auth filter config proto#530

Merged
htuch merged 28 commits intoenvoyproxy:masterfrom
qiwzhang:jwt_config
Mar 21, 2018
Merged

Add jwt auth filter config proto#530
htuch merged 28 commits intoenvoyproxy:masterfrom
qiwzhang:jwt_config

Conversation

@qiwzhang
Copy link
Contributor

@qiwzhang qiwzhang commented Mar 8, 2018

This is the first step to upstream Istio JWT auth filter to Envoy.

Istio JWT auth filter is here [https://github.com/istio/proxy/tree/master/src/envoy/http/jwt_auth]

The issue to upstream to envoy is: envoyproxy/envoy#2514

@qiwzhang
Copy link
Contributor Author

qiwzhang commented Mar 8, 2018

@kyessenov @mattklein123 who should review this?

@qiwzhang
Copy link
Contributor Author

qiwzhang commented Mar 8, 2018

I will fix the test later.


syntax = "proto3";

package Envoy.Http.JwtAuth.Config;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please follow Envoy API Style Guide, specifically package == path, no _ in package name.

// bookstore_web.apps.googleusercontent.com
// jwks_uri: https://example.com/.well-known/jwks.json
//
message JWT {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No acronym.

repeated string jwt_params = 8;

// This field is specific for Envoy proxy implementation.
// It is the cluster name in the Envoy config for the jwks_uri.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What is cluster and what is for?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated

}

// Determines how to apply auth policies for individual requests.
message Config {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The term seems too generic. It doesn't seem to mean anything.

// This message defines a pattern to match a HTTP request.
// A pattern is matched only if both http_method and path_match are matched.
message HttpPattern {
// Define a HTTP method.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What empty means?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated

// 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
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think we need to restate the top-level LICENSE or attribute copyright here.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Removed

//
// Example,
//
// issuer: https://example.com
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Have you look at the docs output to see how this YAML renders? Should you use RST YAML directives? https://thomas-cokelaer.info/tutorials/sphinx/rest_syntax.html#code-block-directive

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Try to follow it. Not sure how to view the generated doc output

string http_method = 1;

// Defines a path match
oneof path_match {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you reuse the RouteMatch protos in https://github.com/envoyproxy/data-plane-api/blob/master/envoy/api/v2/route/route.proto? Seems at the code level it should be possible to refactor/share to make this easy to implement and consistent.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated to use HeaderMatcher

@qiwzhang
Copy link
Contributor Author

qiwzhang commented Mar 8, 2018

@diemtvu, @lei-tang, @lizan Could you help to review it?

@lei-tang
Copy link

lei-tang commented Mar 8, 2018

@qiwzhang Yes, I will review it now.

Copy link

@diemtvu diemtvu left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just curious, what does v2 mean here? I don't know the naming convention, but found it a bit confusing as there is no v1 previously.

@kyessenov
Copy link
Contributor

@diemtvu v2 was chosen to indicate the base version since the entire xDS as proto started from v2. Here it should mean that the filter config is versioned at v2. It would be confusing to explain v1 since for xDS v1 means REST/JSON-based config.

string jwks_uri = 3;

// If false, remove the JWT and do not forward to the backend.
bool forward_jwt = 4;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this "true" by default? In proto3, "false" is a better choice for a default bool value.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

no, default is false. default is not to forward already verified token to backend.

load("//bazel:api_build_system.bzl", "api_proto_library")

api_proto_library(
name = "jwt_auth",
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Consider renaming "jwt_auth" to "jwt_authn" if it is for authentication.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done

string jwks_uri_cluster = 7;
}

// This is the Envoy filter config for JSON Web Token authentication.
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For better cohesion, consider decoupling Envoy filter config from JWT authentication config.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The filer is to do JWT authentication, so its config will be the JWT authentication config.

@qiwzhang
Copy link
Contributor Author

qiwzhang commented Mar 9, 2018

@htuch could you approve this? Code porting need this proto file.

// - bookstore_android.apps.googleusercontent.com
// bookstore_web.apps.googleusercontent.com
// jwks_uri: https://example.com/.well-known/jwks.json
//
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: might be worth adding not-implemented-hide to indicate that this is not yet implemented in Envoy.
See, for example: https://github.com/envoyproxy/data-plane-api/blob/master/envoy/config/filter/accesslog/v2/accesslog.proto#L30

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done

// For example::
//
// headers:
// name: :method
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this should be:

headers:
- name: :method

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done

@qiwzhang
Copy link
Contributor Author

qiwzhang commented Mar 9, 2018

Send email to envoy-user group: https://groups.google.com/forum/#!topic/envoy-dev/stCUfEITnqE

//
// x-goog-iap-jwt-assertion: <JWT>.
//
repeated string jwt_headers = 6;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

for header, you might need a message here like:

message JwtHeader {
  string header_name = 1;
  string header_value_prefix = 2;
}

For example, authorization header will come with prefix Bearer, while x-google-iap-jwt-assertion won't.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done


// This is the Envoy filter config for JSON Web Token authentication.
// [#not-implemented-hide:]
message JSONWebTokenAuthentication {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Document what the format of header that the filter will add after authentication.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done

// <https://openid.net/specs/openid-connect-discovery-1_0.html#ProviderMetadata>`_
//
// Example: https://www.googleapis.com/oauth2/v1/certs
string jwks_uri = 3;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

use google.protobuf.BoolValue

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done

// If the request includes a JWT, it must match one of the JWT listed
// here with the same issuer.
//
repeated JSONWebToken jwts = 2;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: why this tag is 2?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done

// - name: :path
// regex_match: /.*
//
repeated envoy.api.v2.route.HeaderMatcher headers = 6;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: headers = 1

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done

// exact_match: /healthz
//
repeated HttpMatcher bypass_jwt = 3;
}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You might need an action here (or in JSONWebToken) to define what the filter do when it cannot verify a JWT or a JWT doesn't exists.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done

Copy link
Member

@htuch htuch left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

To build docs to inspect output, run ./ci/run_envoy_docker.sh './ci/do_ci.sh bazel.docs'.

// jwks_uri: https://example.com/.well-known/jwks.json
//
// [#not-implemented-hide:]
message JSONWebToken {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Prefer JsonWebToken to match other capitalization in API.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done

// <https://tools.ietf.org/html/rfc7519#section-4.1.3>`_. that are allowed to
// access. A JWT containing any of these audiences will be accepted.
//
// Example::
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated

//
repeated string audiences = 2;

// URL of the provider's public key set to validate signature of the
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should this be URL of the provider's public key. Set to validate signature of the...?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks. Updated

// It is the cluster name in the Envoy "cluster_manager" config section.
// In order for Envoy to call "jwks_uri", its host has to be specified
// as a "cluster" in the config for each jwks_uri.
string jwks_uri_cluster = 4;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This seems strange. Yes, Envoy needs a cluster to call out to, but in that case, jwks_uri should just be the path suffix, the host part of the URL isn't used?

Also, how is this supposed to be used normally? Are we going to be calling out to a dedicated internal server for jwks_uri, or is this arbitrary Internet callout?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Arbitrary Internet callout

I like to keep pks_uri so that it not only specify the path, also specify protocol, such as http or https

cluster only specify port: unusually is tcp://x.x.x.x:443

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

While cluster does know whether it is a SSL or not (tls_context), we still need protocol and hostname from jwks_uri for :scheme and :authority header.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One should use gwks_uri with discovery service to find the cluster. I don't think the JWT itself should have this information. URI can contain arbitrary amount of information, such as base?cluster=xxx

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

To me, this is a pretty weird situation, where we might not want to specify a fixed cluster if it's arbitrary Internet callout. It's similar to what's done for the gRPC service https://github.com/envoyproxy/data-plane-api/blob/master/envoy/api/v2/core/grpc_service.proto#L32, where we have a cluster-less URI and the library just connects directly. We probably would need to make use of the pending cluster late binding support in envoyproxy/envoy#2740, but we could create a dynamic cluster on-the-fly to use for this URI. @mattklein123 also for thoughts.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We will implemented this in phases. In phase 1, before Envoy supports Lazy config loading or dynamic cluster, a dedicated jwks cluster is required. It can be appended in the jwks_uri as "JWKS_URI?cluster=name". So this field is removed.
In the phase2, if lazy config loading is supported, this requirement is removed.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I strongly disagree with the idea to include ?cluster= in to jwks_uri, jwks_uri can be a arbitrary URI (including query parameter), the cluster is really just envoy term, so it has to be a separate field and has nothing to do with jwks_uri.

Also in the case that control-plane handles OIDC discovery, jwks_uri is coming directly from the discovery document, while cluster is generated by control-plane, please do not mix them.

@htuch this is just like a EnvoyGrpc message, (i.e. cluster name). if we want a general EnvoyHttp alike message in core that is a different issue.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think we should have an EnvoyHttp source or the like. This is a weird hack in the API IMHO, we shouldn't do it as is.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is somewhat related to envoyproxy/envoy#1606. I agree with @htuch that we should add an EnvoyHttp message to allow for generic callout. For now that message can just have a static cluster option, but we can enhance it later to do completely independent DNS resolution/caching and generic calls.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@qiwzhang Can you add an EnvoyHttp message into envoy core?

string jwks_uri_cluster = 4;

// Duration after which the cached public key should be expired. The
// system wide default is applied if no duration is explicitly
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Where does the system wide default come from?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

will update to
hard-coded default of 5 minutes

google.protobuf.Duration public_key_cache_duration = 5;

// If false, the JWT is removed in the request after a success verification.
// Set it true, if don't want it to be removed.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Specify what the default behavior is.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done

google.protobuf.BoolValue forward_jwt = 6;

// If true, the request is allowed if the JWT verification fails
// Default is not allowed.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Then this should just be a bool

// For example, if config is::
//
// jwt_params:
// jwt_token
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This isn't YAML list syntax.

// The value prefix. The value format is "prefix<token>"
// For example, for "Authorization: Bearer <token>",
// value_prefix="Bearer " with a space at the end.
string value_prefix = 2;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this always what you want, or would you prefer regex? No strong opinion, just curious.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Usually we want the whole value. Only "Authorization: Bearer " has a "Bearer " prefix. regex is over-kill.

// - name: :path
// regex_match: /.*
//
repeated envoy.api.v2.route.HeaderMatcher headers = 1;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you comment (in this PR review) on why this was preferred over RouteMatch?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Initially I felt that RouteMatch is too complicated, especially its "runtime" field, it may not apply here.

Well, I look it over again. I changed my mind, we could just use it directly. Will update


// URL of the provider's public key set to validate signature of the
// JWT. See `OpenID
// URL of the provider's public key server. The public key is used to validate
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

jwks stands for Json Web Key Set: https://tools.ietf.org/html/rfc7517#appendix-A

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated the comment. Thanks

@wora
Copy link
Contributor

wora commented Mar 10, 2018

I think we should document the higher level design somewhere, either in README.md in the same directory or at the top of the proto file.

As an Envoy filter, I would like to see a clear contract here:

  • What information it consumes from Envoy?
  • What information it produces to Envoy and/or to the backend?
  • What external dependency it adds to Envoy?

For example, jwt_params is for the filter. For Envoy, it means this filter wants to see these headers. I think we should clarify how this filter interacts with Envoy and backend. What the filter does internally is less important.


syntax = "proto3";

package envoy.config.filter.http.jwt_authn.v2;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No "_" in package name please.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@wora this is necessary if the path has underscore for consistency and some Go stuff.

// jwks_uri: https://example.com/.well-known/jwks.json
//
// [#not-implemented-hide:]
message JsonWebToken {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think Jwt is better just like Url. Nobody spells out Universal Resource Locator these days.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done

// It is the cluster name in the Envoy "cluster_manager" config section.
// In order for Envoy to call "jwks_uri", its host has to be specified
// as a "cluster" in the config for each jwks_uri.
string jwks_uri_cluster = 4;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One should use gwks_uri with discovery service to find the cluster. I don't think the JWT itself should have this information. URI can contain arbitrary amount of information, such as base?cluster=xxx

// If false, the JWT is removed in the request after a success verification.
// Set it true, if don't want it to be removed.
// Default value is false which is to remove JWT.
google.protobuf.BoolValue forward_jwt = 6;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If default is false, just use bool.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done


// If true, the request is allowed if the JWT verification fails.
// Default value is false; JWT verification failed request will be rejected.
google.protobuf.BoolValue allow_failed_jwt = 7;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If default is false, use bool.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done

// If the request includes a JWT, it must match one of the JWT listed
// here with the same issuer.
//
repeated JsonWebToken jwts = 1;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is not really a JWT, it is more like JwtRule.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done

@qiwzhang
Copy link
Contributor Author

A README.md is added to document the high level design.

load("//bazel:api_build_system.bzl", "api_proto_library")

api_proto_library(
name = "jwt_authn",
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

jwt_authz .. not authn

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

it should be authn. "authz" is for authorization. This proxy is only for token verification, it is authentication, it is "authn".

@rshriram
Copy link
Member

Hi level comment: This is great.. We need to propagate this context as part of the trace headers, as that makes it very easy to transport these custom headers across hops.
Adding these as trace metadata is insufficient as its bound to get dropped in the next hop. If we want this to propagate all the way to the last hop in the request chain, this probably needs to be part of the trace ID.

Thoughts?


## HTTP header to pass sucessfully verified JWT

If a JWT has been suceessfully verified, its payload will be passed to the backend in the new HTTP header "sec-istio-auth-userinfo". Its value is base64 encoded JSON.
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this istio specific? We should use more generic location. On a related note, is this possible to config the output location (or not output at all)?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good point. I will add such config for each JWT.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This documentation is still Istio specific.

qiwzhang added 15 commits March 20, 2018 01:16
Signed-off-by: Wayne Zhang <qiwzhang@google.com>
Signed-off-by: Wayne Zhang <qiwzhang@google.com>
Signed-off-by: Wayne Zhang <qiwzhang@google.com>
Signed-off-by: Wayne Zhang <qiwzhang@google.com>
Signed-off-by: Wayne Zhang <qiwzhang@google.com>
Signed-off-by: Wayne Zhang <qiwzhang@google.com>
Signed-off-by: Wayne Zhang <qiwzhang@google.com>
Signed-off-by: Wayne Zhang <qiwzhang@google.com>
Signed-off-by: Wayne Zhang <qiwzhang@google.com>
Signed-off-by: Wayne Zhang <qiwzhang@google.com>
Signed-off-by: Wayne Zhang <qiwzhang@google.com>
Signed-off-by: Wayne Zhang <qiwzhang@google.com>
Signed-off-by: Wayne Zhang <qiwzhang@google.com>
Signed-off-by: Wayne Zhang <qiwzhang@google.com>
Signed-off-by: Wayne Zhang <qiwzhang@google.com>
Signed-off-by: Wayne Zhang <qiwzhang@google.com>
Signed-off-by: Wayne Zhang <qiwzhang@google.com>
Signed-off-by: Wayne Zhang <qiwzhang@google.com>
//
// If it is not specified, the payload will not be forwarded. If multiple JWT payloads needed to
// be forwarded, distinct header names are required.
string forward_payload_header = 8;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Still waiting for this one to be made clearer, I still can't get clear in my head what the above sentence means given this is a singleton. If it's confusing me (and admittedly, I'm not an expert in this area), I think it will confuse others, so can you try and re-express this to reduce the chance of this?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

How about this?

Signed-off-by: Wayne Zhang <qiwzhang@google.com>
Signed-off-by: Wayne Zhang <qiwzhang@google.com>
Copy link
Member

@htuch htuch left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Awesome, thanks for your patience @qiwzhang.

Copy link
Member

@lizan lizan left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM, thanks!

// .. code-block:: yaml
//
// local_jwks:
// - inline_string: "ACADADADADA"
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

really last nit: make this realistic?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It is too big to put a good jwks here

@htuch
Copy link
Member

htuch commented Mar 21, 2018

I'm going to merge to allow @qiwzhang to make forward progress. Since this is v2alpha, any additional feedback can go into following PRs.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

9 participants