Creating an OAuth 2.0 auth recipe#
This tutorial shows how operators of a channel with OAuth 2.0 can create a conda package
that pre-configures channel_settings for their own channel. Once their users install
the package, they can authenticate with a single command:
conda install example-oauth2-config
conda auth login https://repo.example.com
This simplifies OAuth 2.0 authentication and authorization without requiring users to configure each option themselves. Do not put client secrets or access tokens in this configuration package.
The channel_settings format#
conda-auth reads OAuth 2.0 configuration from the channel_settings key in the
conda configuration (condarc). The package we’ll create will end up with a
conda configuration file with the following fields:
channel_settings:
- channel: https://repo.example.com # URL of your protected channel
auth: oauth2 # tells conda-auth to use OAuth 2.0
oauth_client_id: <your-public-client-id> # required, issued by your IdP
# Optional, defaults to the channel URL if omitted.
# Set this if your IdP lives at a different host than the channel.
oauth_issuer_url: https://idp.example.com
# Optional, defaults to "auto".
# "auto" : tries browser login first, falls back to device-code
# "auth-code" : browser login with PKCE (requires a desktop environment)
# "device-code" : headless login for SSH / CI environments
oauth_flow: device-code
# Optional, list of OAuth scopes to request.
oauth_scopes:
- profile
# Optional, only needed for auth-code flow.
# oauth_redirect_uri: http://localhost:8765/callback
Creating the conda recipe#
Directory layout#
example-oauth2-config/
|-- recipe.yaml
`-- example-oauth2-config.yaml # the channel_settings condarc
example-oauth2-config.yaml#
Write your channel_settings block here (see the format above):
channel_settings:
- channel: https://repo.example.com
auth: oauth2
oauth_client_id: xxxxxxxxxxxxxxxxxxxxxx
oauth_issuer_url: https://idp.example.com
oauth_flow: device-code
oauth_scopes:
- openid
recipe.yaml#
package:
name: example-oauth2-config
version: 1.0.0
build:
number: 0
noarch: generic
script: |
mkdir -p "${PREFIX}/condarc.d"
cp example-oauth2-config.yaml \
"${PREFIX}/condarc.d/example-oauth2-config.yaml"
requirements:
run:
- conda-auth
about:
summary: conda-auth configuration for repo.example.com
license: MIT
The target directory $PREFIX/condarc.d/ is the standard
per-environment condarc merge location. conda automatically merges all
*.yaml files in that directory into the effective configuration for the
active environment.
Note
The run dependency on conda-auth ensures that the plugin is installed
alongside your config package.
You should always install this package to the base environment so it’s available across the installation:
conda install --name base example-oauth2-config
Testing locally#
Build the package and install it into a test environment:
# Build
rattler-build build --recipe example-oauth2-config/recipe.yaml
# Install into the base environment (required for conda plugins)
conda install --name base --use-local example-oauth2-config
# Verify the settings were merged
conda config --show channel_settings
You should see your channel_settings entry in the output. Then test the
full login flow:
conda auth login https://repo.example.com
If the configuration is correct, the OAuth 2.0 flow starts immediately with no additional flags required.
To clean up:
conda auth logout https://repo.example.com
conda remove --name base example-oauth2-config
End-user experience#
Once you have published your package, your users only need two commands:
# 1. Install conda-auth and your config package
conda install --name base example-oauth2-config
# 2. Log in with no OAuth flags required
conda auth login https://repo.example.com
conda-auth reads the channel_settings from the installed config and
initiates the OAuth 2.0 flow automatically. After a successful login, all
subsequent conda install or conda search commands against
https://repo.example.com are authenticated transparently.