You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
gitea/templates/user/auth
Marcell Mars a3881ffa3d
Enhancing Gitea OAuth2 Provider with Granular Scopes for Resource Access (#32573)
Resolve #31609

This PR was initiated following my personal research to find the
lightest possible Single Sign-On solution for self-hosted setups. The
existing solutions often seemed too enterprise-oriented, involving many
moving parts and services, demanding significant resources while
promising planetary-scale capabilities. Others were adequate in
supporting basic OAuth2 flows but lacked proper user management
features, such as a change password UI.

Gitea hits the sweet spot for me, provided it supports more granular
access permissions for resources under users who accept the OAuth2
application.

This PR aims to introduce granularity in handling user resources as
nonintrusively and simply as possible. It allows third parties to inform
users about their intent to not ask for the full access and instead
request a specific, reduced scope. If the provided scopes are **only**
the typical ones for OIDC/OAuth2—`openid`, `profile`, `email`, and
`groups`—everything remains unchanged (currently full access to user's
resources). Additionally, this PR supports processing scopes already
introduced with [personal
tokens](https://docs.gitea.com/development/oauth2-provider#scopes) (e.g.
`read:user`, `write:issue`, `read:group`, `write:repository`...)

Personal tokens define scopes around specific resources: user info,
repositories, issues, packages, organizations, notifications,
miscellaneous, admin, and activitypub, with access delineated by read
and/or write permissions.

The initial case I wanted to address was to have Gitea act as an OAuth2
Identity Provider. To achieve that, with this PR, I would only add
`openid public-only` to provide access token to the third party to
authenticate the Gitea's user but no further access to the API and users
resources.

Another example: if a third party wanted to interact solely with Issues,
it would need to add `read:user` (for authorization) and
`read:issue`/`write:issue` to manage Issues.

My approach is based on my understanding of how scopes can be utilized,
supported by examples like [Sample Use Cases: Scopes and
Claims](https://auth0.com/docs/get-started/apis/scopes/sample-use-cases-scopes-and-claims)
on auth0.com.

I renamed `CheckOAuthAccessToken` to `GetOAuthAccessTokenScopeAndUserID`
so now it returns AccessTokenScope and user's ID. In the case of
additional scopes in `userIDFromToken` the default `all` would be
reduced to whatever was asked via those scopes. The main difference is
the opportunity to reduce the permissions from `all`, as is currently
the case, to what is provided by the additional scopes described above.

Screenshots:

![Screenshot_20241121_121405](https://github.com/user-attachments/assets/29deaed7-4333-4b02-8898-b822e6f2463e)

![Screenshot_20241121_120211](https://github.com/user-attachments/assets/7a4a4ef7-409c-4116-9d5f-2fe00eb37167)

![Screenshot_20241121_120119](https://github.com/user-attachments/assets/aa52c1a2-212d-4e64-bcdf-7122cee49eb6)

![Screenshot_20241121_120018](https://github.com/user-attachments/assets/9eac318c-e381-4ea9-9e2c-3a3f60319e47)
---------

Co-authored-by: wxiaoguang <wxiaoguang@gmail.com>
3 months ago
..
activate.tmpl Move all login and account creation page labels to be above inputs (#29432) 12 months ago
activate_prompt.tmpl Refactor "user/active" related logic (#29390) 1 year ago
captcha.tmpl Refactor login page (#31530) 8 months ago
change_passwd.tmpl Add main landmark to templates and adjust titles (#22670) 2 years ago
change_passwd_inner.tmpl Move all login and account creation page labels to be above inputs (#29432) 12 months ago
finalize_openid.tmpl Remove unnecessary "Str2html" modifier from templates (#29319) 1 year ago
forgot_passwd.tmpl Move all login and account creation page labels to be above inputs (#29432) 12 months ago
grant.tmpl Enhancing Gitea OAuth2 Provider with Granular Scopes for Resource Access (#32573) 3 months ago
grant_error.tmpl Always use `ctx.Locale.Tr` inside templates (#27231) 1 year ago
link_account.tmpl Improve oauth2 client "preferred username field" logic and the error handling (#30622) 10 months ago
oauth_container.tmpl Refactor login page (#31530) 8 months ago
oidc_wellknown.tmpl Refactor more code in templates (#29236) 1 year ago
prohibit_login.tmpl Move all login and account creation page labels to be above inputs (#29432) 12 months ago
reset_passwd.tmpl Remove unnecessary ".Link" usages (#29929) 11 months ago
signin.tmpl Refactor login page (#31530) 8 months ago
signin_inner.tmpl Set manual `tabindex`es on login page (#31689) 5 months ago
signin_openid.tmpl Refactor login page (#31530) 8 months ago
signup.tmpl Refactor login page (#31530) 8 months ago
signup_inner.tmpl Refactor login page (#31530) 8 months ago
signup_openid_connect.tmpl Always use `ctx.Locale.Tr` inside templates (#27231) 1 year ago
signup_openid_navbar.tmpl Introduce `.secondary-nav` and handle `.page-content` spacing universally (#29982) 11 months ago
signup_openid_register.tmpl Move all login and account creation page labels to be above inputs (#29432) 12 months ago
twofa.tmpl Move all login and account creation page labels to be above inputs (#29432) 12 months ago
twofa_scratch.tmpl Move all login and account creation page labels to be above inputs (#29432) 12 months ago
webauthn.tmpl Migrate margin and padding helpers to tailwind (#30043) 11 months ago
webauthn_error.tmpl Migrate `gt-hidden` to `tw-hidden` (#30046) 11 months ago