Я пишу систему создания пользователя для приложения iOS и веб-приложения (т.е. пользователь может быть создан из мобильного приложения или веб-интерфейса) с помощью Ruby on Rails. Я не заинтересован в использовании такой системы, как Devise.
Я не делал этого через пару лет, поэтому просто хочу убедиться, что мои идеи актуальны и имеют смысл.
Шаги/предположения
- Мы будем управлять состоянием между нашим сервером и клиентами через настраиваемое поле HTTP, такое как "X-auth_token".
- Их можно создать либо с помощью учетных данных электронной почты или паролей, либо через facebook.
В случае входа в систему по электронной почте пользователь просто разместит следующий json:
{
user:{
email:'[email protected]',
password:'testpassword',
}
}
Я буду использовать Rails has_secure_password для хэш-значений.
и вернет
{
user:{
id:23,
auth_token:'md5value',
}
}
Для Интернета мы передадим auth_token как значение cookie. Для приложения iOS auth_token будет передаваться как пользовательское поле заголовка HTTP, такое как "X-auth_token"
- В случае входа в facebook они будут использовать FacebookSDK, получить разрешенные разрешения от FB и отправить
{
user: {
is_facebook_login: true,
fb_email: '[email protected]',
fb_auth_token: 'abigvaluefromFB'
}
}
На сервере мы гарантируем, что они передадут действительные учетные данные fb_auth_token вызов facebook с помощью
def self.verify_facebook fb_auth_token
result = Net::HTTP.get(URI.parse("https://graph.facebook.com/me?access_token=#{fb_auth_token}"))
obj=JSON.parse(result)
obj["email"]
end
и подтверждение того, что fb_email, отправленная в исходном запросе, соответствует сообщению электронной почты, предоставленному обратно в facebook.
Здесь шаги с соответствующей диаграммой:
ШАГОВ
- oauth запрос в facebook, запрос электронной почты ТОЛЬКО
- пользователь одобряет, токен электронной почты и токен аутентификации возвращаются
- отправить auth_token на наш сервер; если клиент facebook auth'd, установите флаг, чтобы только войти в систему через facebook
- проверить с помощью facebook точный токен.
Не волнуйтесь прямо сейчас, если они меняют электронную почту в facebook, тяжелая удача. Если они заходят через Facebook, а затем хотят войти в систему по электронной почте /pwd, вам не повезло.
на нашем конце мы создадим auth_token (строку MD5) и отправим его обратно клиенту, который теперь управляет аутентификацией. С этого момента мы отправим пользовательский HTTP-заголовок X-auth_token
Мы ответим на
{
user:{
id:23,
auth_token:'md5value',
}
}
и приложение iOS будет записывать auth_token в цепочку ключей через https://github.com/kishikawakatsumi/KeychainAccess
Является ли приведенный выше сценарий разумным для создания пользователя?