aproxy33

command module
v0.0.0-...-e8b5f56 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Aug 30, 2015 License: MIT Imports: 10 Imported by: 0

README

aproxy33

Это прокси-сервис к API FreeFeed-а, добавляющий к нему OAuth2-атворизацию. Здесь представлена только серверная часть и сам прокси, клиентская часть должна общаться с сервером по REST-протоколу.

Компиляция: go get github.com/davidmz/aproxy33

Запуск: aproxy33 -c config.json

Сервис состоит из двух функциональных частей: менеджера OAuth2-данных и прокси. Менеджер управляет списком пользователей, приложениями и авторизационными токенами, а также самим процессом OAuth2-авторизации. Прокси проксирует запросы к FreeFeed API, преобразуя OAuth2-авторизацию в авторизацию по FreeFeed-токену.

API менеджера

Все API-методы принимают в качестве тела запроса JSON-объект и возвращают тоже JSON-объект.

Возвращаемый объект имеет формат: {"status": "…", "data": …}. Значения поля "status":

  • "ok" — запрос выполнен успешно, в поле "data" находится результат. HTTP-код ответа 200.
  • "error" — запрос не может быть выполнен, причина в самом запросе. В поле "data" находится строка с описанием ошибки. HTTP-код ответа 4xx.
  • "fail" — запрос не удалось выполнить, причина на стороне сервера. В поле "data" находится строка с описанием ошибки. HTTP-код ответа 5xx.

Большинство методов API требует авторизации. Это не OAuth2-авторизация, а локальная авторизация для данного сервиса. Авторизация осуществляется передачей HTTP-заголовка Authorization: X-AProxy TOKEN, где TOKEN — токен, полученный API-методом POST /aprox/auth.

TODO Добавить возможность авторизоваться по FreeFeed-токену.

Авторизация на сервере

Метод принимает логин и пароль от FreeFeed-а и возвращает токен для авторизации на сервисе и время его жизни.

POST /aprox/auth
Auth: Not required
Request:
{
	"username": "frf_username",
	"password": "frf_password"
}
Response:
{
	"token": "…",
	"username": "…",
	"ttl": 12345
}

Обновление токена

Клиент должен сам следить за обновлением токена. Следующий метод возвращает новый токен, если к нему обратиться с авторизацией действующим токеном.

POST /aprox/auth-refresh
Auth: Required
Request: (empty)
Response:
{
	"token": "…",
	"username": "…",
	"ttl": 12345
}

Список приложений пользователя

Метод возвращает список приложений пользователя (для которых пользователь является владельцем).

GET /aprox/apps
Auth: Required
Request: (empty)
Response:
[
	{
		"key": "…",			 // идентификатор приложения
		"secret": "…",		 // секрет приложения
		"date": "…",		 // время создания
		"title": "…",		 // название
		"description": "…",  // описание
		"domains": ["…", …]  // список доменов, с которых разрешена авторизация
	},
	…
]

Создание приложения

POST /aprox/apps
Auth: Required
Request:
{
	"title": "…",
	"description": "…",
	"domains": ["…", …]
}
Response:
{
	"key": "…",
	"secret": "…"
}

Изменение приложения

PUT /aprox/apps/{key}
Auth: Required
Request:
{
	"title": "…",
	"description": "…",
	"domains": ["…", …]
}
Response:
null

Удаление приложения

DELETE /aprox/apps/{key}
Auth: Required
Request: (empty)
Response:
null

Публичная информация о приложении

GET /aprox/apps/{key}/info
Auth: Not required
Request: (empty)
Response:
{
	"app": 		{
		"key": "…",
		"date": "…",
		"title": "…",
		"description": "…",
		"domains": ["…", …]
	},
	"api": {
		"api_method": "title",
		…
	}
}

Этот метод доступен без авторизации.

Метод возвращает информацию о приложении а также хэш из доступных методов API и их человекопонятных названий. "api_method" имеет вид "METHOD{SPACE}URI_MASK", например: "POST /v1/users", "GET /v1/users/*" или "POST /v1/groups/*/subscribers/*/admin". Звёздочкой заменяются участки URI, которые могут изменяться.

Получение списка токенов

Метод возвращает список OAuth2-токенов пользователя.

GET /aprox/tokens
Auth: Required
Request: (empty)
Response:
[
	{
		"id": 123,			// ID токена (числовой)
		"date": "…",		// время создания
		"perms": {			// методы API, доступные токену и их названия
			"api_method": "title",
			…
		},
		"app": {				 // информация о приложении
			"title": "…",		 // название
			"description": "…",  // описание
			"owner": "…",  	     // frf-username владельца приложения
			"domains": ["…", …]  // список доменов, с которых разрешена авторизация
		}
	},
	…
]

Удаление токена

DELETE /aprox/tokens/{id}
Auth: Required
Request: (empty)
Response:
null

Получение авторизационного OAuth2-кода

Этот метод используется в процессе создания OAuth2-токена. Получив запрос, фронтенд должен спросить у юзера, хочет ли он авторизовать данное приложение, и если да, то обратиться за кодом авторизации:

POST /aprox/oauth-code
Auth: Required
Request:
{
	"app_key": "…",				// приложение, которое просит авторизации
	"redirect_uri": "…", 		// redirect_uri из запроса
	"perms": ["api_method", …]	// методы API, с которыми хочет работать приложение
}
Response:
"auth_code"

При запросе кода приложение должно запросить список методов, с которыми оно будет работать. Это делается с помощью стандартного OAuth2-параметра "scope", который должен содержать разделённый пробелами список методов API. В этом списке пробел между HTTP-методом и URI заменяется нижним подчёркиванием. Пример: "POST_/v1/posts PUT_/v1/posts/* DELETE_/v1/posts/*" — приложение запрашивает права на создание, редактирование и удаление постов. Подчёркивание используется только для совместимости с OAuth2-протоколом, фронтенд должен разобрать "scope", заменить подчёркивания обратно на пробелы и передать список в "POST /aprox/oauth-code" в параметре "perms".

Получив код (или отказ) фронтенд должен сам сформировать правильный URL для возврата.

Получение авторизационного OAuth2-токена по коду

Этот метод реализует требования протокола OAuth2 (https://tools.ietf.org/html/rfc6749#section-4.1.3), поэтому у него не такой формат вызова, как у остальных:

POST /oauth/token
Auth: Not required
Request: application/x-www-form-urlencoded
	grant_type
	code
	redirect_uri
	client_id
Response: (https://tools.ietf.org/html/rfc6749#section-5.1)
{
	"access_token": "…",		// авторизационный токен
	"token_type":   "bearer",
	"username": "…"				// frf-username пользователя, которому принадлежит токен
}

Формат ответа в случае ошибки также отличается и соответствует https://tools.ietf.org/html/rfc6749#section-5.2

API прокси

Для образения к API FreeFeed-а нужно использовать URI, начинающиеся с "/frf/". Например, для обращения к методу "POST /v1/posts", надо сделать запрос к прокси "POST /frf/v1/posts".

При запросе следует использовать ранее полученный авторизационный токен посредством HTTP-заголовка Authorization: Bearer TOKEN. Если данный API-метод разрешён для этого токена, прокси преобразует его в токен FreeFeed-а и выполнит запрос.

Отдельные методы API FreeFeed-а не требуют авторизации, в этом случае заголовок "Authorization" можно не указывать — метод будет вызван анонимно.

Documentation

The Go Gopher

There is no documentation for this package.

Directories

Path Synopsis

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL