{"id":18153231,"url":"https://github.com/thallyta-castro-cv/algafood-auth","last_synced_at":"2026-05-19T07:34:25.676Z","repository":{"id":258733481,"uuid":"872166212","full_name":"thallyta-castro-cv/algafood-auth","owner":"thallyta-castro-cv","description":"Este é um Authorization Server desenvolvido com Spring Security OAuth2, usando Java 17 e Spring Boot 2.7.4. Ele é parte de uma aplicação maior, o projeto AlgaFood API, que atua como Resource Server. Este projeto tem o objetivo didático de entender o funcionamento da autenticação e autorização com OAuth2 em um cenário legado.","archived":false,"fork":false,"pushed_at":"2024-11-22T17:13:13.000Z","size":544,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-02-13T06:33:02.648Z","etag":null,"topics":["spring","spring-authorization-server","spring-security"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/thallyta-castro-cv.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-10-14T00:10:22.000Z","updated_at":"2024-11-22T17:13:18.000Z","dependencies_parsed_at":"2024-12-20T12:45:02.428Z","dependency_job_id":"b88de314-0981-4de5-ba23-779dbfd215c1","html_url":"https://github.com/thallyta-castro-cv/algafood-auth","commit_stats":null,"previous_names":["thallyta-castro-cv/algafood-auth"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thallyta-castro-cv%2Falgafood-auth","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thallyta-castro-cv%2Falgafood-auth/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thallyta-castro-cv%2Falgafood-auth/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thallyta-castro-cv%2Falgafood-auth/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/thallyta-castro-cv","download_url":"https://codeload.github.com/thallyta-castro-cv/algafood-auth/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247574097,"owners_count":20960495,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["spring","spring-authorization-server","spring-security"],"created_at":"2024-11-02T03:06:05.261Z","updated_at":"2025-09-23T20:55:40.293Z","avatar_url":"https://github.com/thallyta-castro-cv.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Authorization Server - AlgaFood API\n\nEste é um **Authorization Server** desenvolvido com **Spring Security OAuth2**, usando **Java 17** e **Spring Boot 2.7.4**. Ele é parte de uma aplicação maior, o projeto **AlgaFood API**, que atua como **Resource Server**. Este projeto tem o objetivo didático de entender o funcionamento da **autenticação** e **autorização** com OAuth2 em um cenário legado, já que o Spring mudou recentemente a abordagem para o gerenciamento de Authorization Servers.\n\n## Objetivo\n\nO projeto tem como principal objetivo:\n\n- Prover um Authorization Server que emite tokens OAuth2 para proteger APIs da AlgaFood.\n- Servir como uma referência para **gerenciamento de Authorization Server** em projetos legados que ainda utilizam **Spring Security OAuth2**.\n- Auxiliar no entendimento do fluxo de autenticação e autorização com **OAuth2**.\n- Facilitar a transição futura para as novas versões do Spring Authorization Server.\n\n## Tecnologias Utilizadas\n\n- **Java 17**\n- **Spring Boot 2.7.4**\n- **Spring Security OAuth2**\n- **JWT (JSON Web Tokens)** para autenticação e autorização\n- **Maven** como ferramenta de build\n\n## Estrutura do Projeto\n\nO projeto é composto pelos seguintes módulos:\n\n1. **Authorization Server**: Responsável pela emissão e validação dos tokens.\n2. **Resource Server (AlgaFood API)**: Uma API protegida que utiliza os tokens gerados pelo Authorization Server.\n\n## Funcionalidades\n\n- **Autenticação**: Gera tokens de acesso (Access Tokens) baseados no protocolo OAuth2.\n- **Autorização**: Protege recursos utilizando escopos e roles associadas ao token.\n- **Suporte a múltiplos Grant Types**:\n  - Authorization Code\n  - Password Credentials (somente para fins de teste)\n  - Client Credentials\n- **Armazenamento de Tokens**: Armazena os tokens em memória, mas pode ser facilmente configurado para armazenar tokens em um banco de dados externo.\n\n## Fluxo de Autenticação\n\n1. O cliente (ex: uma aplicação frontend) faz uma requisição para o **Authorization Server** solicitando um token de acesso.\n2. O **Authorization Server** autentica o cliente e emite um **Access Token**.\n3. O cliente utiliza esse **Access Token** para acessar recursos protegidos na **AlgaFood API** (Resource Server).\n4. A **AlgaFood API** valida o token e, se for válido, permite o acesso ao recurso solicitado.\n\n## Como Executar o Projeto\n\n### Pré-requisitos\n\n- **Java 17**\n- **Maven**\n\n### Passos para execução:\n\n1. Instale as dependências e execute o projeto:\n\n   ```bash\n   mvn clean install\n   mvn spring-boot:run\n   ```\n2. A aplicação será iniciada em http://localhost:8081.\n\n## Endpoints Disponíveis\n\n### 1. Password Flow\n![Password Flow](./password_flow.png)\nO **Password Flow** permite que um cliente obtenha um token de acesso usando as credenciais do usuário (login e senha). Este fluxo é ideal para clientes que podem confiar nas credenciais do usuário, como uma aplicação web.\n\n- **Endpoint**: `/oauth/token`\n- **Método**: `POST`\n- **Parâmetros**:\n  - `grant_type`: `password`\n  - `username`: O nome de usuário do usuário.\n  - `password`: A senha do usuário.\n  - `client_id`: O ID do cliente registrado no servidor de autorização.\n  - `client_secret`: O segredo do cliente.\n\n#### Exemplo de requisição (Postman):\n```bash\nPOST /oauth/token\nContent-Type: application/x-www-form-urlencoded\n\ngrant_type=password\nusername=\u003cseu_username\u003e\npassword=\u003csua_senha\u003e\nclient_id=algafood-web\nclient_secret=web123\n```\n#### Resposta:\nUm token JWT que pode ser usado para acessar recursos protegidos.\n\n### 2. Refresh Token\n![Refresh token](./refresh-token.png)\nO **Refresh Token Flow** permite que o cliente obtenha um novo token de acesso sem a necessidade de re-autenticar o usuário. Esse fluxo é utilizado quando o token de acesso atual expira.\n\n- **Endpoint**: `/oauth/token`\n- **Método**: `POST`\n- **Parâmetros**:\n  - `grant_type`: `refresh_token`\n  - `refresh_token`: O refresh token que foi retornado anteriormente.\n  - `client_id`: O ID do cliente.\n  - `client_secret`: O segredo do cliente.\n\n#### Exemplo de requisição (Postman):\n```bash\nPOST /oauth/token\nContent-Type: application/x-www-form-urlencoded\n\ngrant_type=refresh_token\nrefresh_token=\u003cseu_refresh_token\u003e\nclient_id=algafood-web\nclient_secret=web123\n```\n\n#### Resposta:\nUm novo token JWT válido por um período de tempo.\n\n### 3. Client Credentials Flow\n![Client Credentials](./client_credentials.png)\nO Client Credentials Flow permite que o cliente obtenha um token de acesso usando suas próprias credenciais (sem a necessidade de um usuário final). Esse fluxo é ideal para comunicação entre servidores ou para acesso a APIs que não exigem interação do usuário.\n\n**Endpoint:** `/oauth/token`  \n**Método:** `POST`  \n\n#### Parâmetros:\n- `grant_type`: client_credentials\n- `client_id`: O ID do cliente registrado no servidor de autorização.\n- `client_secret`: O segredo do cliente.\n\n#### Exemplo de requisição (Postman):\n```bash\nPOST /oauth/token\nContent-Type: application/x-www-form-urlencoded\n\ngrant_type=client_credentials\nclient_id=faturamento\nclient_secret=faturamento123\n```\n\n#### Resposta:\nUm token JWT que pode ser usado para acessar recursos protegidos.\n\n### 4. Authorization Code Grant Type\n![Authorization Code](./authorization_code.png)\n\nO Authorization Code Grant Type é utilizado para obter um token de acesso através de um código de autorização. Esse fluxo é geralmente usado por aplicações web que podem armazenar um cliente secreto de maneira segura.\n\n#### Passos\n\n1. O usuário é redirecionado para a página de login do servidor de autorização.\n2. O usuário se autentica e dá permissão ao cliente.\n3. O servidor de autorização redireciona o usuário de volta para a aplicação cliente, com um **código de autorização** na URL.\n4. A aplicação cliente troca o código de autorização por um **token de acesso**.\n\n#### 1. Solicitação do Código de Autorização\n\nO primeiro passo é redirecionar o usuário para o servidor de autorização. A URL da solicitação terá a seguinte estrutura:\n\n`GET /oauth/authorize`\n\n**Parâmetros:**\n- `response_type`: `code`\n- `client_id`: O ID do cliente registrado no servidor de autorização.\n- `redirect_uri`: O URI para onde o usuário será redirecionado após a autorização.\n- `state`: Um valor opcional para prevenir ataques de falsificação de solicitação entre sites (CSRF).\n\n**Exemplo de URL:**\n```\nhttp://localhost:8081/oauth/authorize?response_type=code\u0026client_id=foodanalytics\u0026redirect_uri=http://aplicacao-cliente\u0026state=abc\n```\n\n#### 2. Troca do Código de Autorização por um Token de Acesso\n\nApós o usuário autorizar o acesso, ele será redirecionado para o URI especificado com um parâmetro `code`. Agora, o cliente precisa enviar uma solicitação `POST` para trocar o código de autorização por um token de acesso.\n\n**Endpoint:** `/oauth/token`  \n**Método:** `POST`\n\n**Parâmetros:**\n- `grant_type`: `authorization_code`\n- `code`: O código de autorização que foi retornado no redirecionamento.\n- `redirect_uri`: O mesmo `redirect_uri` usado na solicitação do código de autorização.\n- `client_id`: O ID do cliente.\n- `client_secret`: O segredo do cliente.\n\n**Exemplo de requisição (Postman):**\n```\nPOST /oauth/token\nContent-Type: application/x-www-form-urlencoded\n\ngrant_type=authorization_code\ncode=\u003cseu_codigo_de_autorizacao\u003e\nredirect_uri=[https://seu-app.com/callback](http://aplicacao-cliente)\nclient_id=foodanalytics\nclient_secret=food123\n```\n\n### 5. Implicit Grant Type\n![Implicit Grant Type](./implicit_grant_type.png)\n\nO **Implicit Grant Type** é utilizado principalmente por aplicações de front-end, como aplicações web em JavaScript ou aplicativos móveis, onde o cliente não pode manter um segredo com segurança. Esse fluxo fornece diretamente um token de acesso sem a necessidade de trocar um código de autorização.\n\n#### Passos\n\n1. O cliente redireciona o usuário para o servidor de autorização.\n2. O usuário se autentica e autoriza o cliente.\n3. O servidor de autorização redireciona o usuário de volta para o cliente, fornecendo diretamente o **token de acesso** na URL de redirecionamento.\n\n#### 1. Solicitação do Token de Acesso\n\nPara iniciar o fluxo, o cliente redireciona o usuário para o servidor de autorização com a seguinte URL:\n\n`GET /oauth/authorize`\n\nParâmetros:\n- `response_type`: `token`\n- `client_id`: O ID do cliente registrado no servidor de autorização.\n- `redirect_uri`: O URI para onde o usuário será redirecionado após a autorização.\n- `scope`: Os escopos que o cliente está solicitando.\n- `state`: Um valor opcional para prevenir ataques de falsificação de solicitação entre sites (CSRF).\n\nExemplo de URL:\n\n`http://localhost:8081/oauth/authorize?response_type=token\u0026client_id=webadmin\u0026redirect_uri=http://aplicacao_cliente\u0026scope=read%20write\u0026state=abc123`\n\n#### 2. Recebendo o Token de Acesso\n\nApós o usuário autorizar o acesso, o servidor de autorização redireciona o usuário de volta ao `redirect_uri` com o token de acesso incluído no fragmento da URL.\n\nExemplo de URL de redirecionamento:\n\n`http://aplicacao_cliente/#access_token=O9oWwomIWTg2EK1QRC95Mtj_gr4\u0026token_type=bearer\u0026state=abc123\u0026expires_in=43199`\n\n\nO fragmento da URL conterá o seguinte:\n- `access_token`: O token JWT que pode ser usado para acessar recursos protegidos.\n- `token_type`: O tipo de token, geralmente \"bearer\".\n- `expires_in`: O tempo em segundos até o token expirar.\n- `scope`: Os escopos autorizados.\n\n#### 3. Utilizando o Token de Acesso\n\nAgora, o cliente pode usar o token de acesso para fazer requisições a recursos protegidos da API, adicionando o token no cabeçalho `Authorization`.\n\nExemplo de requisição (Postman):\n\n```bash\nGET /kitchens\nAuthorization: Bearer \u003cseu_access_token\u003e\n```\n\n# Autor\n\u003cb\u003eThallyta Macedo Carvalho de Castro\u003c/b\u003e\n\nLinkedin: https://www.linkedin.com/in/thallyta-castro/\n\nMedium: https://medium.com/@thallyta-castro-cv\n\nemail: thallytacastro.dev@gmail.com\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fthallyta-castro-cv%2Falgafood-auth","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fthallyta-castro-cv%2Falgafood-auth","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fthallyta-castro-cv%2Falgafood-auth/lists"}