# OpenID Connect SDK (client and server) for Go [](https://github.com/semantic-release/semantic-release) [](https://github.com/zitadel/oidc/actions) [](https://pkg.go.dev/github.com/zitadel/oidc/v3) [](https://github.com/zitadel/oidc/blob/master/LICENSE) [](https://github.com/zitadel/oidc/releases) [](https://goreportcard.com/report/github.com/zitadel/oidc/v3) [](https://codecov.io/gh/zitadel/oidc) [](https://openid.net/certification/) ## What Is It This project is an easy-to-use client (RP) and server (OP) implementation for the `OIDC` (OpenID Connect) standard written for `Go`. The RP is certified for the [basic](https://www.certification.openid.net/plan-detail.html?public=true&plan=uoprP0OO8Z4Qo) and [config](https://www.certification.openid.net/plan-detail.html?public=true&plan=AYSdLbzmWbu9X) profile. Whenever possible we tried to reuse / extend existing packages like `OAuth2 for Go`. ## Basic Overview The most important packages of the library:
/pkg /client clients using the OP for retrieving, exchanging and verifying tokens /rp definition and implementation of an OIDC Relying Party (client) /rs definition and implementation of an OAuth Resource Server (API) /op definition and implementation of an OIDC OpenID Provider (server) /oidc definitions shared by clients and server /example /client/api example of an api / resource server implementation using token introspection /client/app web app / RP demonstrating authorization code flow using various authentication methods (code, PKCE, JWT profile) /client/github example of the extended OAuth2 library, providing an HTTP client with a reuse token source /client/service demonstration of JWT Profile Authorization Grant /server examples of an OpenID Provider implementations (including dynamic) with some very basic login UI### Semver This package uses [semver](https://semver.org/) for [releases](https://github.com/zitadel/oidc/releases). Major releases ship breaking changes. Starting with the `v2` to `v3` increment we provide an [upgrade guide](UPGRADING.md) to ease migration to a newer version. ## How To Use It Check the `/example` folder where example code for different scenarios is located. ```bash # start oidc op server # oidc discovery http://localhost:9998/.well-known/openid-configuration go run github.com/zitadel/oidc/v3/example/server # start oidc web client (in a new terminal) CLIENT_ID=web CLIENT_SECRET=secret ISSUER=http://localhost:9998/ SCOPES="openid profile" PORT=9999 go run github.com/zitadel/oidc/v3/example/client/app ``` - open http://localhost:9999/login in your browser - you will be redirected to op server and the login UI - login with user `test-user@localhost` and password `verysecure` - the OP will redirect you to the client app, which displays the user info for the dynamic issuer, just start it with: ```bash go run github.com/zitadel/oidc/v3/example/server/dynamic ``` the oidc web client above will still work, but if you add `oidc.local` (pointing to 127.0.0.1) in your hosts file you can also start it with: ```bash CLIENT_ID=web CLIENT_SECRET=secret ISSUER=http://oidc.local:9998/ SCOPES="openid profile" PORT=9999 go run github.com/zitadel/oidc/v3/example/client/app ``` > Note: Usernames are suffixed with the hostname (`test-user@localhost` or `test-user@oidc.local`) ### Server configuration Example server allows extra configuration using environment variables and could be used for end to end testing of your services. | Name | Format | Description | | ------------ | -------------------------------- | ------------------------------------- | | PORT | Number between 1 and 65535 | OIDC listen port | | REDIRECT_URI | Comma-separated URIs | List of allowed redirect URIs | | USERS_FILE | Path to json in local filesystem | Users with their data and credentials | Here is json equivalent for one of the default users ```json { "id2": { "ID": "id2", "Username": "test-user2", "Password": "verysecure", "FirstName": "Test", "LastName": "User2", "Email": "test-user2@zitadel.ch", "EmailVerified": true, "Phone": "", "PhoneVerified": false, "PreferredLanguage": "DE", "IsAdmin": false } } ``` ## Features | | Relying party | OpenID Provider | Specification | | -------------------- | ------------- | --------------- | -------------------------------------------- | | Code Flow | yes | yes | OpenID Connect Core 1.0, [Section 3.1][1] | | Implicit Flow | no[^1] | yes | OpenID Connect Core 1.0, [Section 3.2][2] | | Hybrid Flow | no | not yet | OpenID Connect Core 1.0, [Section 3.3][3] | | Client Credentials | yes | yes | OpenID Connect Core 1.0, [Section 9][4] | | Refresh Token | yes | yes | OpenID Connect Core 1.0, [Section 12][5] | | Discovery | yes | yes | OpenID Connect [Discovery][6] 1.0 | | JWT Profile | yes | yes | [RFC 7523][7] | | PKCE | yes | yes | [RFC 7636][8] | | Token Exchange | yes | yes | [RFC 8693][9] | | Device Authorization | yes | yes | [RFC 8628][10] | | mTLS | not yet | not yet | [RFC 8705][11] | | Back-Channel Logout | not yet | yes | OpenID Connect [Back-Channel Logout][12] 1.0 | [1]: https://openid.net/specs/openid-connect-core-1_0.html#CodeFlowAuth "3.1. Authentication using the Authorization Code Flow" [2]: https://openid.net/specs/openid-connect-core-1_0.html#ImplicitFlowAuth "3.2. Authentication using the Implicit Flow" [3]: https://openid.net/specs/openid-connect-core-1_0.html#HybridFlowAuth "3.3. Authentication using the Hybrid Flow" [4]: https://openid.net/specs/openid-connect-core-1_0.html#ClientAuthentication "9. Client Authentication" [5]: https://openid.net/specs/openid-connect-core-1_0.html#RefreshTokens "12. Using Refresh Tokens" [6]: https://openid.net/specs/openid-connect-discovery-1_0.html "OpenID Connect Discovery 1.0 incorporating errata set 1" [7]: https://www.rfc-editor.org/rfc/rfc7523.html "JSON Web Token (JWT) Profile for OAuth 2.0 Client Authentication and Authorization Grants" [8]: https://www.rfc-editor.org/rfc/rfc7636.html "Proof Key for Code Exchange by OAuth Public Clients" [9]: https://www.rfc-editor.org/rfc/rfc8693.html "OAuth 2.0 Token Exchange" [10]: https://www.rfc-editor.org/rfc/rfc8628.html "OAuth 2.0 Device Authorization Grant" [11]: https://www.rfc-editor.org/rfc/rfc8705.html "OAuth 2.0 Mutual-TLS Client Authentication and Certificate-Bound Access Tokens" [12]: https://openid.net/specs/openid-connect-backchannel-1_0.html "OpenID Connect Back-Channel Logout 1.0 incorporating errata set 1" ## Contributors