Merge pull request 'Add a step-by-step how-to for the Gitea and GitHub tokens' (#63) from howto-access-tokens into main
TirSystem/github-action: Sync GitHub mirror metadata / sync-metadata (push) Successful in 3s
Reviewed-on: #63
@@ -325,6 +325,9 @@ Both tokens go in `.env` (never in `config.env`, never in a remote URL). The
|
|||||||
script sends them only in a request header, through a private temporary file,
|
script sends them only in a request header, through a private temporary file,
|
||||||
and never prints them.
|
and never prints them.
|
||||||
|
|
||||||
|
New to this? [How to create the access tokens](howto/create-access-tokens.md)
|
||||||
|
walks through both, step by step, with pictures.
|
||||||
|
|
||||||
### GitHub token (`GITHUB_PAT`, only when you choose GitHub)
|
### GitHub token (`GITHUB_PAT`, only when you choose GitHub)
|
||||||
|
|
||||||
The same token has two jobs: it creates the repository, and it is the
|
The same token has two jobs: it creates the repository, and it is the
|
||||||
|
|||||||
@@ -0,0 +1,236 @@
|
|||||||
|
# How to create the access tokens RepoFoundry needs
|
||||||
|
|
||||||
|
RepoFoundry talks to two hosts and needs one token for each:
|
||||||
|
|
||||||
|
| Token | Key | Needed | Type |
|
||||||
|
| --- | --- | --- | --- |
|
||||||
|
| Gitea access token | `GITEA_TOKEN` | always | an access token with scopes |
|
||||||
|
| GitHub personal access token | `GITHUB_PAT` | only when you choose GitHub | a **classic** personal access token (PAT) |
|
||||||
|
|
||||||
|
This guide shows both, step by step. The red numbers in each picture match the
|
||||||
|
numbered steps next to it.
|
||||||
|
|
||||||
|
> **About the pictures.** They are drawings of the pages, not screenshots, so
|
||||||
|
> that they show no account data. Names, colors and the position of a control
|
||||||
|
> can differ a little in your version of Gitea or GitHub. The words in bold in
|
||||||
|
> the steps are the labels to look for. A new token is shown as dots in the
|
||||||
|
> pictures; on your screen you see its real value.
|
||||||
|
|
||||||
|
The full list of what each token may do is in
|
||||||
|
[Token permissions](../README.md#token-permissions) in the README. This guide
|
||||||
|
is the click-by-click version of it.
|
||||||
|
|
||||||
|
Contents:
|
||||||
|
|
||||||
|
1. [Create a Gitea access token](#1-create-a-gitea-access-token)
|
||||||
|
2. [Create a GitHub personal access token (classic)](#2-create-a-github-personal-access-token-classic)
|
||||||
|
3. [Give the tokens to RepoFoundry](#3-give-the-tokens-to-repofoundry)
|
||||||
|
4. [Keep the tokens safe](#4-keep-the-tokens-safe)
|
||||||
|
5. [If something goes wrong](#5-if-something-goes-wrong)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1. Create a Gitea access token
|
||||||
|
|
||||||
|
The examples use `https://git.tirsystem.com`. If your Gitea runs elsewhere, use
|
||||||
|
the address you set as `GITEA_URL` in `config.env`.
|
||||||
|
|
||||||
|
### Step 1. Open your settings
|
||||||
|
|
||||||
|
Sign in to Gitea. Click your **avatar** in the top-right corner (1), then
|
||||||
|
choose **Settings** (2).
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
### Step 2. Open "Applications"
|
||||||
|
|
||||||
|
In the menu on the left, click **Applications** (1).
|
||||||
|
|
||||||
|
You can also go straight there: `<your Gitea address>/user/settings/applications`.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
### Step 3. Fill in the token form
|
||||||
|
|
||||||
|
Scroll to **Generate New Token** and fill it in:
|
||||||
|
|
||||||
|
1. **Token Name:** a name you will recognise later, for example `RepoFoundry`.
|
||||||
|
2. **Repository and Organization Access:** choose **All (public, private, and
|
||||||
|
limited)**. A token that is limited to **Public only** cannot see private
|
||||||
|
repositories or organizations, so creating a private project would fail.
|
||||||
|
3. **Select permissions:** set these three to **Read and Write** and leave
|
||||||
|
every other line at **No Access**:
|
||||||
|
|
||||||
|
| Permission | Level | Why RepoFoundry needs it |
|
||||||
|
| --- | --- | --- |
|
||||||
|
| `organization` | Read and Write | look up the owner and your rights in it, create repositories in an organization |
|
||||||
|
| `repository` | Read and Write | create the repository and manage its push mirror |
|
||||||
|
| `user` | Read and Write | read which account the token belongs to, and create a repository under **your own** account |
|
||||||
|
|
||||||
|
4. Click **Generate Token**.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
> **Only creating projects in organizations?** Then `user` can stay at **Read**.
|
||||||
|
> `Read and Write` on `user` is needed only to create a repository under your
|
||||||
|
> own account; without it Gitea answers `required=[write:user]`.
|
||||||
|
|
||||||
|
### Step 4. Copy the token now
|
||||||
|
|
||||||
|
Gitea shows the new token **once**, in a green message at the top of the page
|
||||||
|
(1). Copy it (use the copy button if your version has one, or select the text
|
||||||
|
and press Ctrl+C, Cmd+C on a Mac) and keep it for
|
||||||
|
[step 3 of this guide](#3-give-the-tokens-to-repofoundry). The new token is now
|
||||||
|
in the list below it (2), with its permissions, but the list never shows its
|
||||||
|
value again.
|
||||||
|
|
||||||
|
If you lose the value, delete that token and generate a new one.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2. Create a GitHub personal access token (classic)
|
||||||
|
|
||||||
|
Skip this part when you will not create a GitHub repository (`USE_GITHUB=no` or
|
||||||
|
answering no when asked). `GITHUB_PAT` is then not needed.
|
||||||
|
|
||||||
|
Use a **classic** token. RepoFoundry has not been tested with fine-grained
|
||||||
|
tokens, because GitHub documents no fine-grained permission for creating a
|
||||||
|
repository.
|
||||||
|
|
||||||
|
### Step 1. Open your settings
|
||||||
|
|
||||||
|
Sign in to GitHub. Click your **profile picture** in the top-right corner (1),
|
||||||
|
then **Settings** (2).
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
### Step 2. Open "Developer settings"
|
||||||
|
|
||||||
|
In the left sidebar, scroll to the bottom and click **Developer settings** (1).
|
||||||
|
It is the last entry.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
### Step 3. Choose "Tokens (classic)"
|
||||||
|
|
||||||
|
1. In the left sidebar, open **Personal access tokens** and click **Tokens
|
||||||
|
(classic)** (1).
|
||||||
|
2. Click **Generate new token** (2).
|
||||||
|
3. In the menu that opens, choose **Generate new token (classic)** (3). Not
|
||||||
|
the first entry, which is the fine-grained kind.
|
||||||
|
|
||||||
|
GitHub may ask you to confirm your password or a two-factor code. Do that
|
||||||
|
yourself; nobody else should type it.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
> Direct address: `https://github.com/settings/tokens/new`
|
||||||
|
|
||||||
|
### Step 4. Fill in the form
|
||||||
|
|
||||||
|
1. **Note:** a name you will recognise later, for example `RepoFoundry`.
|
||||||
|
2. **Expiration:** pick a date. A shorter life limits the damage if the token
|
||||||
|
leaks; you then create a new token when it ends.
|
||||||
|
3. **Select scopes:** tick the scopes below and nothing else.
|
||||||
|
|
||||||
|
| Scope | Tick it when | Why |
|
||||||
|
| --- | --- | --- |
|
||||||
|
| `repo` | always (private or public projects) | creates the repository, and is the password Gitea uses to push the mirror |
|
||||||
|
| `public_repo` instead of `repo` | **only** public projects | enough to create and push a public repository; ticking `repo` already includes it |
|
||||||
|
| `read:org` | only if the script says you do not belong to your organization | lets the script check your membership of an organization owner |
|
||||||
|
|
||||||
|
Ticking `repo` also ticks its five sub-scopes (`repo:status`,
|
||||||
|
`repo_deployment`, `public_repo`, `repo:invite`, `security_events`); that is
|
||||||
|
expected. Leave `workflow`, `write:packages` and the rest unticked.
|
||||||
|
|
||||||
|
4. Scroll down and click **Generate token** (4).
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
> **`read:org` and `admin:org`.** The README records that the check worked with
|
||||||
|
> a token that had `repo` and `admin:org`, and that `read:org` alone is
|
||||||
|
> untested. Try `read:org` first. `admin:org` gives far more power than
|
||||||
|
> RepoFoundry needs, so use it only if `read:org` is not enough.
|
||||||
|
|
||||||
|
### Step 5. Copy the token now
|
||||||
|
|
||||||
|
GitHub shows the token **once**, in a green box at the top (1). Click the copy
|
||||||
|
icon next to it. It starts with `ghp_`. Keep it for
|
||||||
|
[step 3 of this guide](#3-give-the-tokens-to-repofoundry).
|
||||||
|
|
||||||
|
If the owner of the new repository is an organization that uses SAML single
|
||||||
|
sign-on, the token must also be authorised for that organization: in the token
|
||||||
|
list click **Configure SSO** (2) next to the token and then **Authorize**
|
||||||
|
for the organization.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3. Give the tokens to RepoFoundry
|
||||||
|
|
||||||
|
Choose one way. Both keep the token out of `config.env` (a token there is
|
||||||
|
rejected).
|
||||||
|
|
||||||
|
**Option A: type it when asked (nothing is stored).** Do nothing in advance.
|
||||||
|
RepoFoundry asks for `Gitea access token` at the start, and for
|
||||||
|
`GitHub personal access token` and `GitHub account name` once you choose
|
||||||
|
GitHub. What you type is not shown on the screen. Paste only the token, with no
|
||||||
|
spaces, no line break and no quote marks.
|
||||||
|
|
||||||
|
**Option B: keep them in `.env` (convenient, plain text on disk).** In the
|
||||||
|
RepoFoundry folder:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cp .env.example .env
|
||||||
|
chmod 600 .env # Linux and macOS: only you can read it
|
||||||
|
```
|
||||||
|
|
||||||
|
Open `.env` and fill in the values; replace the text in angle brackets and
|
||||||
|
remove the brackets:
|
||||||
|
|
||||||
|
```text
|
||||||
|
GITEA_TOKEN=<the Gitea token>
|
||||||
|
GITHUB_PAT=<the GitHub token>
|
||||||
|
GITHUB_USER=<your GitHub account name>
|
||||||
|
```
|
||||||
|
|
||||||
|
`GITHUB_PAT` and `GITHUB_USER` are needed only when you create a GitHub
|
||||||
|
repository. Git ignores `.env`. Never commit it, send it, or paste it into a
|
||||||
|
chat or an issue.
|
||||||
|
|
||||||
|
Then check the setup with a dry run, which only reads from the hosts and
|
||||||
|
creates nothing:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
src/create-project.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4. Keep the tokens safe
|
||||||
|
|
||||||
|
- A token is a password. Anyone who has it can do what it allows.
|
||||||
|
- Give each token only the access in this guide, and an expiration date.
|
||||||
|
- Do not paste a token in a command line, a URL, a commit, an issue or a chat.
|
||||||
|
- If a token may have leaked, delete it at once and make a new one:
|
||||||
|
- Gitea: **Settings**, **Applications**, then **Delete** on that token.
|
||||||
|
- GitHub: **Settings**, **Developer settings**, **Personal access tokens**,
|
||||||
|
**Tokens (classic)**, then **Delete** on that token.
|
||||||
|
- When a token expires, create a new one the same way and replace it in `.env`.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 5. If something goes wrong
|
||||||
|
|
||||||
|
| What you see | Likely cause | What to do |
|
||||||
|
| --- | --- | --- |
|
||||||
|
| `authentication failed: the token is missing, expired or invalid` | the token was mistyped, has expired or was deleted | create a new token and use it |
|
||||||
|
| `the token is valid but not allowed to do this (check its scopes)` | a permission is missing | Gitea: set `organization`, `repository` and `user` to **Read and Write**. GitHub: tick `repo` |
|
||||||
|
| Gitea answers `required=[write:user]` | the project is being created under your own account | set `user` to **Read and Write** |
|
||||||
|
| `Gitea owner '...' is neither your account (...) nor an organization the token can see` | the token is limited to **Public only**, or the owner name is wrong | make the token **All (public, private, and limited)**, or fix the owner |
|
||||||
|
| `GitHub owner '...' is neither your account (...) nor an organization you belong to (or the token lacks the read:org scope)` | the token cannot see the organization | tick `read:org`, and authorise the token for the organization if it uses single sign-on |
|
||||||
|
| the pasted token is refused again and again | spaces, a line break or quote marks came with the paste | copy it again and paste only the token |
|
||||||
|
| `GITHUB_USER is '...' but the token belongs to '...'` | a warning: the name in `.env` is not the account of the token | no action needed; RepoFoundry uses the account the token belongs to |
|
||||||
|
After Width: | Height: | Size: 6.7 KiB |
|
After Width: | Height: | Size: 7.5 KiB |
|
After Width: | Height: | Size: 14 KiB |
|
After Width: | Height: | Size: 6.5 KiB |
|
After Width: | Height: | Size: 5.6 KiB |
|
After Width: | Height: | Size: 6.1 KiB |
|
After Width: | Height: | Size: 7.1 KiB |
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 6.1 KiB |