Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[#80] GitHub authorization #285

Open
wants to merge 23 commits into
base: main
Choose a base branch
from
Open

[#80] GitHub authorization #285

wants to merge 23 commits into from

Conversation

d1z3d
Copy link
Contributor

@d1z3d d1z3d commented Jul 29, 2024

No description provided.

@d1z3d
Copy link
Contributor Author

d1z3d commented Jul 29, 2024

@fey @Malcom1986 Hey!
I added authorization through GitHub. The link to the site is https://hexlet-correction-ac3h.onrender.com
I haven't figured out how to proceed with pr 159, so I created a new one.

@fey
Copy link
Collaborator

fey commented Jul 30, 2024

@d1z3d
good, but i cant open https://hexlet-correction-ac3h.onrender.com/
Can you check is it work?

@d1z3d
Copy link
Contributor Author

d1z3d commented Jul 30, 2024

@fey I redeployed a last commit. Now it works
image

@fey
Copy link
Collaborator

fey commented Jul 31, 2024

Still cant enter to deployed demo

@fey
Copy link
Collaborator

fey commented Jul 31, 2024

@d1z3d please add instruction to readme how to setup Github login

@fey fey requested a review from Malcom1986 July 31, 2024 10:38
@d1z3d
Copy link
Contributor Author

d1z3d commented Jul 31, 2024

@fey i deployed to another service - https://d1z3d-hexlet-correction.onrender.com. Try it, please.
Okey, I'll add the instruction.

@fey
Copy link
Collaborator

fey commented Aug 1, 2024

@d1z3d cant load demo :C

Please add inctruction, we ll check auth on local

README.md Outdated
@@ -25,6 +25,23 @@ To build the final jar:
make build
```

### How to add a OAuth2 app for local development
Before starting local development, you must create an OAuth application and add clientID and clientSecret to application.yaml:
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This file is in Git, so changing it may cause us to accidentally run the changed file. Let's think about how we can avoid this. But in general, it could be that for local development we just set the right values, but for projection we set different values - will this work?

Copy link
Contributor Author

@d1z3d d1z3d Aug 3, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@fey Hey!

This file is in Git, so changing it may cause us to accidentally run the changed file. Let's think about how we can avoid this

To be honest, i dont get what do you mean. If you mean that other people will have to solve conflicts while pushing new changes from their own branches because files will be a different. So they can do merge it before push. I done it before i open the pr. To avoid this I can add a custom exception while building project to be done the check and don't change a README file. Will this option work for you?

But in general, it could be that for local development we just set the right values, but for projection we set different values - will this work?

I added 2 instructions: to local delopment and to deploy the project. A Dockerfile uses the production profile. See application-prod.yaml

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

See, usually the files that need to be changed for local development are not versioned. These are different configuration files, settings that are specific to the environment and to the developer. For example, it could be the Github settings with which the connection is made. Then let's think about it, maybe just create a Github application for authorization locally.

Copy link
Contributor Author

@d1z3d d1z3d Aug 6, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@fey Hey!

I added a OAuth app for dev. Fixed README
It looks like:

Снимок экрана 2024-08-07 в 00 35 45 Снимок экрана 2024-08-07 в 00 35 57 Снимок экрана 2024-08-07 в 00 36 17 Снимок экрана 2024-08-07 в 00 37 13 Снимок экрана 2024-08-07 в 00 37 34 Снимок экрана 2024-08-07 в 00 37 44

@fey
Copy link
Collaborator

fey commented Aug 13, 2024

@d1z3d it only works for login, not for registration? I want to log in via Github, no accounts. But it won't let me in. No error handling.

In other services, we register a user if a user from Github is not registered on the service.
image
image

@d1z3d
Copy link
Contributor Author

d1z3d commented Aug 13, 2024

@fey hey!
I'll fix redirection. It works for registration. If you have no public email you will get this problem. You cannot sign in or up without public email.

@fey
Copy link
Collaborator

fey commented Aug 13, 2024

@d1z3d yea, i dont have public email. may be should be ssomething to fix that. Because i can register account with github on other services (can you try sicp, cv?)

@d1z3d
Copy link
Contributor Author

d1z3d commented Aug 13, 2024

I done that when I had a token from GitHub. With that I took private emails. I couldn't do it without the token.
Can you give advice how can I do that? Scopes don't affect on it.

@d1z3d
Copy link
Contributor Author

d1z3d commented Aug 13, 2024

I got private emails without public email but I used some custom requests for it via GitHub token. I will send changes while few days

@d1z3d
Copy link
Contributor Author

d1z3d commented Aug 17, 2024

@fey hey!
I fixed the redirection and added alert for login page. Can you check it? While you check I will read about how to test oauth2.
I saw an issue that names can be empty. I added TODO.

@Malcom1986
Copy link
Collaborator

@d1z3d
Hello! Is the work finished here? Or will there be tests here too? I can’t open the demo application, please check

@d1z3d d1z3d reopened this Aug 26, 2024
@d1z3d
Copy link
Contributor Author

d1z3d commented Aug 26, 2024

Hey!

@fey, I add link on signup page.

@Malcom1986, I done with this issue. I read about testing oauth2 but I don't know how I can test it. I mean I can mock all requests to authenticate but I don't see reasons.

@fey
Copy link
Collaborator

fey commented Aug 26, 2024

@Malcom1986
Copy link
Collaborator

@d1z3d Приветствую, Андрей! Попробовал локально поднять приложение. Что-то не совсем коррекно работает. Регистрация через гитхаб проходит успешно. Потом выхожу из аккаунта и пытаюсь зайти через гитхаб. Ссылка на странице входа ведет опять на регистрацию

@Malcom1986
Copy link
Collaborator

Кстати при повторной регистрации получается 500 ошибка и не понятно что произошло. Нужно сообщить, что такой пользователь уже существует

@fey
Copy link
Collaborator

fey commented Aug 27, 2024

Кстати при повторной регистрации получается 500 ошибка и не понятно что произошло. Нужно сообщить, что такой пользователь уже существует

По идее логика входа должна быть такой

  1. Создаем пользователя, Если его нет. Логиним, прописываем фио, ник с Гитхаба, почту. Пароль - хз (вероятно сами генерируем)
  2. Если пользователь есть - логиним его

@d1z3d
Copy link
Contributor Author

d1z3d commented Aug 27, 2024

@Malcom1986 Максим, проблему понял. Я изменил логику для повторного входа. Т.е. если пользователь входит повторно, то сделал обновление данных УЗ. Видимо нужно достать пользователя по ID и уже менять его. Но по комментарию @fey Николая понял, что делать этого не нужно. Скорректирую обратно. Нужно было спросить прежде, чем делать) Попробовал локально с проверкой существующего пользователя. Проблемы при повторном входе не возникло. Сбросил кеш. Смог войти успешно снова.

Также уберу handler при неуспешной аутентификации. Он не отработал. Попробую добавить кастомный фильтр для отлова ошибок при регистрации.

@fey Николай, изучу тесты и добавлю по аналогии.

@d1z3d
Copy link
Contributor Author

d1z3d commented Sep 2, 2024

@Malcom1986, @fey, Максим, Николай, здравствуйте!
Внес правки, но вот с тестами беда. Не понимаю как сделать правильно.

@Malcom1986
Copy link
Collaborator

Автогенерирумые фалы типа AccountMapperImpl.java попали как-то в репозиторий. Они же должны быть в диретории build и соответственно не пушитья в репозиторий

@Malcom1986
Copy link
Collaborator

А вот такую статью смотрели по тестам? https://www.baeldung.com/spring-oauth-testing-access-control

@d1z3d
Copy link
Contributor Author

d1z3d commented Sep 8, 2024

А вот такую статью смотрели по тестам? https://www.baeldung.com/spring-oauth-testing-access-control

@Malcom1986 Максим, добрый день!
Нет, теперь я понял, что нужно делать. Спасибо!

@d1z3d
Copy link
Contributor Author

d1z3d commented Sep 8, 2024

@Malcom1986, Максим, внес правки. Автогенерируемые файлы создаются в "../src/main/generated/**". Я добавил правило для игнорирования файлов в .gitignore.

@fey, Николай, хотел бы подсветить сразу потенциальную проблему. В данном проекте есть функционал по изменению email-а. Это будет создавать проблемы.
Кейс:

  1. Пользователь вошел на hexlet-correction с помощью социальной сети. В данном случае, это GitHub.
  2. Пользователь изменил на GitHub свой email.
  3. Он пробует войти повторно на hexlet-correction.
  4. У пользователя будет ошибка при входе, потому что будет выполнен поиск пользователя по email и его не будет, т.к. email будет новым, а username останется прежним. Возникнет ошибка с contraint-ами, потому что username уникальный.

Также это актуально, если пользователь поменяет email на hexlet-correction, но не на GitHub. При этом пользователь не сможет войти под своей учеткой, потому что не знает пароль.

В первом случае, проблему можно решить, если добавить еще проверку по username и обновлять данные. Но username также можно скорректировать. В общем и целом, это должен быть id пользователя, потому что он уже не поменяется. Этого поля не хватает.
Во втором случае, можно редиректить на страницу с изменением пароля, но это плохой клиентский путь, потому что клиенту нужно догадаться зачем ему это нужно сделать. Следовательно, нужно добавить какое-то описание.

@fey
Copy link
Collaborator

fey commented Sep 9, 2024

@d1z3d а как на hexlet-cv, code-basics работает?

@d1z3d
Copy link
Contributor Author

d1z3d commented Sep 9, 2024

@d1z3d а как на hexlet-cv, code-basics работает?

Сравнивал как раз с hexlet-cv. У меня нет возможности скорректировать email. image

@fey
Copy link
Collaborator

fey commented Sep 9, 2024

@d1z3d а можете посмотреть. как в самом Хекслете? ru.hexlet.io

@fey
Copy link
Collaborator

fey commented Sep 9, 2024

@d1z3d Посмотрите, предоставляет ли Github какие-то дополнительные данные, которые нельзя подменить?
https://docs.github.com/en/rest/users/users?apiVersion=2022-11-28#get-the-authenticated-user - например. Там есть ID. Давайте записывать ID пользователя.

{
  "login": "fey",
  "id": 697178,
  "node_id": "MDQ6VXNlcjY5NzE3OA==",
  "avatar_url": "https://avatars.githubusercontent.com/u/697178?v=4",
  "gravatar_id": "",
  "url": "https://api.github.com/users/fey",
  "html_url": "https://github.com/fey",
  "followers_url": "https://api.github.com/users/fey/followers",
  "following_url": "https://api.github.com/users/fey/following{/other_user}",
  "gists_url": "https://api.github.com/users/fey/gists{/gist_id}",
  "starred_url": "https://api.github.com/users/fey/starred{/owner}{/repo}",
  "subscriptions_url": "https://api.github.com/users/fey/subscriptions",
  "organizations_url": "https://api.github.com/users/fey/orgs",
  "repos_url": "https://api.github.com/users/fey/repos",
  "events_url": "https://api.github.com/users/fey/events{/privacy}",
  "received_events_url": "https://api.github.com/users/fey/received_events",
  "type": "User",
  "site_admin": false,
  "name": "Nikolay Gagarinov",
  "company": "@Hexlet",
  "blog": "https://go.redav.online/22dba39c7f71c491",
  "location": null,
  "email": null,
  "hireable": null,
  "bio": "У тебя не будет багов, если ты не пишешь код.",
  "twitter_username": null,
:

@fey
Copy link
Collaborator

fey commented Sep 9, 2024

@d1z3d Я поспрашивал у разработчиков Хекслета:

в случае когда акки связаны аутентификация происходит не по емейлам, а по самому акку.
емейл с гитхаба берётся только если на хекслете он не найден. В таком случае на хекслете будет зарегистрированн новый акк с данными с гитхаб

@d1z3d
Copy link
Contributor Author

d1z3d commented Sep 9, 2024

Про то, что не хватает id пользователя - я имел в виду, что его не хватает в таблице бд для его сохранения. Из гитхаба он приходит.

@d1z3d
Copy link
Contributor Author

d1z3d commented Sep 9, 2024

@d1z3d Я поспрашивал у разработчиков Хекслета:


в случае когда акки связаны аутентификация происходит не по емейлам, а по самому акку.

емейл с гитхаба берётся только если на хекслете он не найден. В таком случае на хекслете будет зарегистрированн новый акк с данными с гитхаб

Ок, теперь мне нужно это осознать)

@fey
Copy link
Collaborator

fey commented Sep 9, 2024

@d1z3d я себе так это представляю)
имеем таблицу аккаунтов, которая связана с юзерами. Когда гость жмет на вход через Github, то проверяем, есть ли связанный аккаунт с пользователем. Если нет, то создаем пользователя + аккаунт с этой привязкой.
Если у нас пользователь уже существует, то создаем аккаунт + привязываем пользователя к нему (проверяем по емейлу).

@d1z3d
Copy link
Contributor Author

d1z3d commented Sep 16, 2024

@d1z3d я себе так это представляю) имеем таблицу аккаунтов, которая связана с юзерами. Когда гость жмет на вход через Github, то проверяем, есть ли связанный аккаунт с пользователем. Если нет, то создаем пользователя + аккаунт с этой привязкой. Если у нас пользователь уже существует, то создаем аккаунт + привязываем пользователя к нему (проверяем по емейлу).

Ок. Продолжу работу после 23 сентября.

@fey fey linked an issue Sep 24, 2024 that may be closed by this pull request
@d1z3d
Copy link
Contributor Author

d1z3d commented Oct 12, 2024

Продолжил дальше заниматься задачей

@d1z3d
Copy link
Contributor Author

d1z3d commented Oct 12, 2024

@fey, добрый день!
Добавил создание таблицы, проверку пользователя по ID из Github-а, обновление email (с учетом констрейта), username (с учетом констрейта), фамилию и имени

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Connect authentication via social networks
3 participants