From 2417fc9154ac371fcba33d4d0007ff90cc6ae41b Mon Sep 17 00:00:00 2001 From: Eric Chiang Date: Tue, 8 Nov 2016 11:51:47 -0800 Subject: [PATCH 1/2] Documentation/logos: add logos --- Documentation/logos/dex-glyph-bw.png | Bin 0 -> 8174 bytes Documentation/logos/dex-glyph-bw.svg | 20 ++++++++ Documentation/logos/dex-glyph-color.png | Bin 0 -> 10415 bytes Documentation/logos/dex-glyph-color.svg | 20 ++++++++ Documentation/logos/dex-glyph-white.png | Bin 0 -> 10505 bytes Documentation/logos/dex-glyph-white.svg | 22 +++++++++ Documentation/logos/dex-horizontal-color.png | Bin 0 -> 24829 bytes Documentation/logos/dex-horizontal-color.svg | 47 +++++++++++++++++++ Documentation/logos/dex-horizontal-white.png | Bin 0 -> 24387 bytes Documentation/logos/dex-horizontal-white.svg | 47 +++++++++++++++++++ 10 files changed, 156 insertions(+) create mode 100644 Documentation/logos/dex-glyph-bw.png create mode 100644 Documentation/logos/dex-glyph-bw.svg create mode 100644 Documentation/logos/dex-glyph-color.png create mode 100644 Documentation/logos/dex-glyph-color.svg create mode 100644 Documentation/logos/dex-glyph-white.png create mode 100644 Documentation/logos/dex-glyph-white.svg create mode 100644 Documentation/logos/dex-horizontal-color.png create mode 100644 Documentation/logos/dex-horizontal-color.svg create mode 100644 Documentation/logos/dex-horizontal-white.png create mode 100644 Documentation/logos/dex-horizontal-white.svg diff --git a/Documentation/logos/dex-glyph-bw.png b/Documentation/logos/dex-glyph-bw.png new file mode 100644 index 0000000000000000000000000000000000000000..0934cbb715435353158fec86b9b774e91fbf2e5b GIT binary patch literal 8174 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 literal 0 HcmV?d00001 diff --git a/Documentation/logos/dex-glyph-bw.svg b/Documentation/logos/dex-glyph-bw.svg new file mode 100644 index 00000000..57e0695f --- /dev/null +++ b/Documentation/logos/dex-glyph-bw.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + diff --git a/Documentation/logos/dex-glyph-color.png b/Documentation/logos/dex-glyph-color.png new file mode 100644 index 0000000000000000000000000000000000000000..bcd5f21bfdcd445325d013080c1c5bf339de11ae GIT binary patch literal 10415 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 + + + + + + + + + + diff --git a/Documentation/logos/dex-glyph-white.png b/Documentation/logos/dex-glyph-white.png new file mode 100644 index 0000000000000000000000000000000000000000..0a7215c9ac2eabc42141dc7f018436cecafebb36 GIT binary patch literal 10505 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 HU1I(R03ZXh literal 0 HcmV?d00001 diff --git a/Documentation/logos/dex-glyph-white.svg b/Documentation/logos/dex-glyph-white.svg new file mode 100644 index 00000000..29481366 --- /dev/null +++ b/Documentation/logos/dex-glyph-white.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + diff --git a/Documentation/logos/dex-horizontal-color.png b/Documentation/logos/dex-horizontal-color.png new file mode 100644 index 0000000000000000000000000000000000000000..98a85a9643f76fae3ab4dc90a92c91a003263cf9 GIT binary patch literal 24829 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 bB!~dCT&iV1Utq6v`$R2uJ+&$oo5=qIA$OJ1 literal 0 HcmV?d00001 diff --git a/Documentation/logos/dex-horizontal-color.svg b/Documentation/logos/dex-horizontal-color.svg new file mode 100644 index 00000000..4f8ca6b5 --- /dev/null +++ b/Documentation/logos/dex-horizontal-color.svg @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + diff --git a/Documentation/logos/dex-horizontal-white.png b/Documentation/logos/dex-horizontal-white.png new file mode 100644 index 0000000000000000000000000000000000000000..8f072508f9efe14977e5e518e8e6b99473b4810c GIT binary patch literal 24387 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 + + + + + + + + + + + + + + + + + From a52e324f6859ae248d4a3491e805f3c23dafb682 Mon Sep 17 00:00:00 2001 From: Eric Chiang Date: Tue, 8 Nov 2016 11:51:59 -0800 Subject: [PATCH 2/2] *: readme updates for v2 --- Documentation/api.md | 2 +- Documentation/getting-started.md | 47 ++++++++++++++++++++ README.md | 73 +++++++++----------------------- examples/config-dev.yaml | 28 ++++++------ 4 files changed, 84 insertions(+), 66 deletions(-) create mode 100644 Documentation/getting-started.md diff --git a/Documentation/api.md b/Documentation/api.md index a7a5612b..5171b5e1 100644 --- a/Documentation/api.md +++ b/Documentation/api.md @@ -107,7 +107,7 @@ Between v1 and v2, dex switched from REST to gRPC. This largely stemmed from pro Many arguments _against_ gRPC cite short term convenience rather than production use cases. Though this is a recognized shortcoming, dex already implements many features for developer convenience. For instance, users who wish to manually edit clients during testing can use the `staticClients` config field instead of the API. [grpc]: http://www.grpc.io/ -[api-proto]: https://github.com/coreos/dex/blob/v2.0.0-alpha.5/api/api.proto +[api-proto]: ../api/api.proto [protoc]: https://github.com/google/protobuf/releases [protoc-gen-go]: https://github.com/golang/protobuf [google-apis]: https://github.com/google/apis-client-generator diff --git a/Documentation/getting-started.md b/Documentation/getting-started.md new file mode 100644 index 00000000..25cac5ab --- /dev/null +++ b/Documentation/getting-started.md @@ -0,0 +1,47 @@ +# Getting started + +## Building the dex binary + +Dex requires a Go installation and a GOPATH configured. For setting up a Go workspace, refer to the [official documentation][go-setup]. Clone it down the correct place, and simply type `make` to compile the dex binary. + +``` +$ git clone https://github.com/coreos/dex.git $GOPATH/src/github.com/coreos/dex +$ cd $GOPATH/src/github.com/coreos/dex +$ make +``` + +## Configuration + +Dex exclusively pulls configuration options from a config file. Use the [example config][example-config] file found in the `examples/` directory to start an instance of dex with an in-memory data store and a set of predefined OAuth2 clients. + +``` +./bin/dex serve examples/config-dev.yaml +``` + +The [example config][example-config] file documents many of the configuration options through inline comments. For extra config options, look at that file. + +## Running a client + +Dex operates like most other OAuth2 providers. Users are redirected from a client app to dex to login. Dex ships with an example client app (also built with the `make` command), for testing and demos. + +By default, the example client is configured with the same OAuth2 credentials defined in `examples/config-dev.yaml` to talk to dex. Running the example app will cause it to query dex's [discovery endpoint][oidc-discovery] and determine the OAuth2 endpoints. + +``` +./bin/example-app +``` + +Login to dex through the example app using the following steps. + +1. Navigate to the example app in your browser at http://localhost:5555/ in your browser. +2. Hit "login" on the example app to be redirected to dex. +3. Choose the "Login with Email" and enter "admin@example.com" and "password" +4. Approve the example app's request. +5. See the resulting token the example app claims from dex. + +## Further reading + +Check out the Documentation directory for further reading on setting up different storages, interacting with the dex API, intros for OpenID Connect, and logging in through other identity providers such as Google, GitHub, or LDAP. + +[go-setup]: https://golang.org/doc/install +[example-config]: ../examples/config-dev.yaml +[oidc-discovery]: https://openid.net/specs/openid-connect-discovery-1_0-17.html#ProviderMetadata diff --git a/README.md b/README.md index f9ae424e..c7ec586b 100644 --- a/README.md +++ b/README.md @@ -1,65 +1,32 @@ # dex - A federated OpenID Connect provider -![Caution image](Documentation/img/caution.png) +[![GoDoc](https://godoc.org/github.com/coreos/dex?status.svg)](https://godoc.org/github.com/coreos/dex) -__This is an experimental version of dex that is likely to change in -incompatible ways.__ +![logo](Documentation/logos/dex-horizontal-color.png) -dex is an OAuth2 server that presents clients with a low overhead framework for -identifying users while leveraging existing identity services such as Google -Accounts, FreeIPA, GitHub, etc, for actual authentication. dex sits between your -applications and an identity service, providing a backend agnostic flavor of -OAuth2 called [OpenID Connect](https://openid.net/connect/), a spec will allows -dex to support: +Dex is an OpenID Connect server that allows users to login through upstream identity providers. Clients use a standards-based OAuth2 flow to login users, while the actual authentication is performed by established user management systems such as Google, GitHub, FreeIPA, etc. -* Short-lived, signed tokens with predefined fields (such as email) issued on -behalf of users. -* Well known discovery of OAuth2 endpoints. +[OpenID Connect][openid-connect] is a flavor of OAuth that builds on top of OAuth2 using the JOSE standards. This allows dex to provide: + +* Short-lived, signed tokens with standard fields (such as email) issued on behalf of users. +* "well-known" discovery of OAuth2 endpoints. * OAuth2 mechanisms such as refresh tokens and revocation for long term access. * Automatic signing key rotation. -Any system which can query dex can cryptographically verify a users identity -based on these tokens, allowing authentication events to be passed between -backend services. +Standards-based token responses allows applications to interact with any OpenID Connect server instead of writing backend specific "access_token" dances. Systems that can already consume ID Tokens issued by dex include: -One such application that consumes OpenID Connect tokens is the [Kubernetes]( -http://kubernetes.io/) API server, allowing dex to provide identity for any -Kubernetes clusters. +* [Kubernetes][kubernetes] +* [Amazon STS][amazon-sts] -## Getting started +## Documentation -dex requires a Go installation and a GOPATH configured. Clone it down the -correct place, and simply type `make` to compile dex. +* [Getting started](Documentation/getting-started.md) +* [Storage options](Documentation/storage.md) +* [Intro to OpenID Connect](Documentation/openid-connect.md) +* [gRPC API](Documentation/api.md) +* Identity provider logins (coming soon!) +* Client libraries (coming soon!) -``` -git clone https://github.com/coreos/dex.git $GOPATH/src/github.com/coreos/dex -cd $GOPATH/src/github.com/coreos/dex -git checkout dev -make -``` - -dex is a single, scalable binary that pulls all configuration from a config -file (no command line flags at the moment). Use one of the config files defined -in the `examples` folder to start up dex with an in-memory data store. - -``` -./bin/dex serve examples/config-dev.yaml -``` - -dex allows OAuth2 clients to be defined statically through the config file. In -another window, run the `example-app` (an OAuth2 client). By default this is -configured to use the client ID and secret defined in the config file. - -``` -./bin/example-app -``` - -Then to interact with dex, like any other OAuth2 provider, you must first visit -a client app, then be prompted to login through dex. This can be achieved using -the following steps: - -1. Navigate to http://localhost:5555/ in your browser. -2. Hit "login" on the example app to be redirected to dex. -3. Choose the "Login with Email" and enter "admin@example.com" and "password" -4. Approve the example app's request. -5. See the resulting token the example app claims from dex. +[openid-connect]: https://openid.net/connect/ +[kubernetes]: http://kubernetes.io/docs/admin/authentication/#openid-connect-tokens +[amazon-sts]: https://docs.aws.amazon.com/STS/latest/APIReference/Welcome.html diff --git a/examples/config-dev.yaml b/examples/config-dev.yaml index 134f2766..5a37db81 100644 --- a/examples/config-dev.yaml +++ b/examples/config-dev.yaml @@ -1,29 +1,38 @@ # The base path of dex and the external name of the OpenID Connect service. -# Clients use this value to do discovery. +# This is the canonical URL that all clients MUST use to refer to dex. If a +# path is provided, dex's HTTP service will listen at a non-root URL. issuer: http://127.0.0.1:5556/dex # The storage configuration determines where dex stores its state. Supported # options include SQL flavors and Kubernetes third party resources. +# +# See the storage document at Documentation/storage.md for further information. storage: type: sqlite3 config: file: examples/dex.db -# Configuration for the +# Configuration for the HTTP endpoints. web: http: 127.0.0.1:5556 - # HTTPS options are also supported: + # Uncomment for HTTPS options. # https: 127.0.0.1:5554 # tlsCert: /etc/dex/tls.crt # tlsKey: /etc/dex/tls.key -# Uncomment this block to enable the gRPC API. +# Uncomment this block to enable the gRPC API. This values MUST be different +# from the HTTP endpoints. # grpc: # addr: 127.0.0.1:5557 # tlsCert: /etc/dex/grpc.crt # tlsKey: /etc/dex/grpc.key # tlsClientCA: /etc/dex/client.crt +# Uncomment this block to enable configuration for the expiration time durations. +# expiry: +# signingKeys: "6h" +# idTokens: "24h" + # Instead of reading from an external storage, use this list of clients. # # If this option isn't choosen clients may be added through the gRPC API. @@ -43,12 +52,12 @@ connectors: # name: Google # config: # issuer: https://accounts.google.com -# # Config values starting with a "$" will read from the environment. +# # Connector config values starting with a "$" will read from the environment. # clientID: $GOOGLE_CLIENT_ID # clientSecret: $GOOGLE_CLIENT_SECRET -# redirectURI: http://127.0.0.1:5556/dex/callback/google +# redirectURI: http://127.0.0.1:5556/dex/google -# Let dex keep a list of passwords which can be used to login the user +# Let dex keep a list of passwords which can be used to login to dex. enablePasswordDB: true # A static list of passwords to login the end user. By identifying here, dex @@ -61,8 +70,3 @@ staticPasswords: hash: "$2a$10$33EMT0cVYVlPy6WAMCLsceLYjWhuHpbz5yuZxu/GAFj03J9Lytjuy" username: "admin" userID: "08a8684b-db88-4b73-90a9-3cd1661f5466" - -# Uncomment this block to enable configuration for the expiration time durations. -# expiry: -# signingKeys: "6h" -# idTokens: "24h"