Skip to content

Latest commit

 

History

History

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 
 
 
 
 
 
 

README.md

2026-02-27

Youtube-запись от 2026-02-27: https://youtu.be/FeAi2kqFKAk

OAuth 2.0 — путь к dashboard'у

Warning

Хватит делать метеостанции Пора ходить в Интернет за своими данными

Как пройти через кордоны?

Сначала все были равны

flowchart LR
app(приложение):::green
server(сервер):::red

app ==> |Слышь, дай данные?| server

server ==> |На!| app

classDef red fill:#D65D0E,stroke:#D65D0E,color:#F6F0D8;
classDef green fill:#9A9A00,stroke:#9A9A00,color:#F6F0D8;

Loading

Потом появились верительные грамоты

sequenceDiagram
participant app
participant server

app ->> server: Я от Васи. Дай данные?
activate server
Note right of server: читает записку от Васи
server ->> app: На!
deactivate server

Loading

А с ними — и отказы

sequenceDiagram
participant app
participant server

app ->> server: Я от Васи. Дай данные?
activate server
Note right of server: читает записку от Васи

alt грамота ОК
	server -->> app: 🙂 На!
else что-то не так
	server -->> app: 👹 Не положено 
end

deactivate server

Loading

Какие проблемы?

У приложения
  1. Где взять верительную грамоту простому рабочему парню приложению с окраины?
    1. Честно получить у Васи.
    2. Сфабриковать из подручных материалов.
    3. Украсть.
У сервера
  1. Откуда мне знать, что грамота от Васи?
  2. Я что, всех Вась должен помнить?
  3. Мало ли что Вася им понаразрешал пять лет назад…
  4. Вот пустишь их в сарай переночевать, а они корову уведут.
  5. Почему вообще я?!

Tip

Ааааа, милицияааааа!!!

И тут приходит Главный Проверяльщик Документов и всех строит

  • Я буду за вас проверять документы.
  • И выдавать тоже.
  • И знать, кому что положено, буду тоже я.
  • С владельцем данных я тоже договорюсь.
  • Защита от злодеев — моё дело, не беспокойтесь.
  • И всем придётся общаться по моим правилам.

Что ж, начинаем договариваться вчетвером

sequenceDiagram
participant app
participant server
participant auth
participant owner

Loading

[!INFO] Четыре — это уже много

  • Это интроверты, не надо их сразу мучительно нетворкать
  • У всех свои дела, особенно у владельца
  • Злодеи так и рыщут, надо осторожней

Note

Проблеме не первое столетие Задолго до компьютеров были: общие знакомые — верительные грамоты — подорожные — доверенности — векселя — ордера — мандаты — паспорта — визы — пропуска — талоны — …

Пьеса «Авторизация маленькой железки»

Сцена первая: 🐱 app, 😈 auth и 🐰 owner

sequenceDiagram
autonumber
participant 🐱
participant 😈
participant 🐰

🐱 ->> +😈: Это 🐱, я от 🐰! Дай 🔖 талончик, мне на сервер надо

Note right of 😈: …знаю я этого 🐱,<br/>сам он с 🐰 не разберётся,<br/>придётся мне самому
😈 -->> 🐱: Пусть 🐰 ко мне зайдёт, вот 🍀 пропуск
activate 😈
🐱 ->> +🐰: Сходи к 😈, ладно? Вот 🍀 пропуск
Note right of 🐰: Да где мой<br/>телефон-то…
loop 🐱 дёргает 😈
🐱 ->> 😈: Ну чего, 🐰 дошёл? Разрешил?
end
🐰 -->> -😈: Это 🐰, вот мой 🍀 пропуск. И вот что 🐱 можно
deactivate 😈
😈 -->> -🐱: 🐰 разрешил наконец, вот твой 🔖 талончик на разное


Loading

Сцена вторая: 🐱 app, 👻 server и 😈 auth

sequenceDiagram
autonumber
participant 🐱
participant 👻
participant 😈

🐱 ->> +👻: Это 🐱, вот мой 🔖, хочу 🍏
👻 ->> +😈: Пришёл тут один, показал 🔖, просит 🍏 — можно?
😈 -->> -👻: Да
👻 -->> -🐱: Вот тебе 🍏

Loading

Диктатушки-диктата, мы играем за 🐱 кота app

Узнаем, куда нам отправлять 🐰 owner'а

POST-запрос на параметры авторизации силами клиента — серверу авторизации. URL: https://oauth2.googleapis.com/device/code Параметры: client_idscope client_id берём из переменной среды GOOGLE_CLIENT_ID

tail -4 params.txt — посмотрим на хвост ответа (ключ не увидим)

[!CAUTION] Складывать ключ в незашифрованный файл — плохая идея Разговор о том, куда его девать после получения — впереди

Возвращается всегда JSON

Отправляем 🐰 owner'а куда надо

  • Выберем JSON-библиотеку из целого мешка
  • Прочтём файл и покажем из него то, что нужно показать

А потом?

  1. В цикле POST-запрос уже на токен — серверу авторизации
  2. И дальше GET-запросы серверу ресурсов — с ключом в заголовке и параметрами собственно запроса
  • curl_slist — тип списка
  • curl_slist_append() — добавляем заголовок в список
  • CURLOPT_HTTPHEADER — сюда кидаем список заголовков

[!INFO] Пригодятся для Google и не только