Использование онлайн-аккаунтов для аутентификации на моем сервере
В моем приложении Ubuntu QML я пытаюсь использовать сетевые учетные записи для аутентификации на моем сервере. Я немного сбит с толку относительно того, как мне следует поступить так. В конечном итоге я хочу, чтобы пользователь мог войти в систему с помощью своих учетных записей Facebook/ Google/ Ubuntu. Прочитав немного об OpenID и OAuth, я думаю, что я должен использовать один из них для этого.
Пока что в моем приложении я использую учетную запись пользователя Ubuntu One для аутентификации следующим образом:
import QtQuick 2.0
import Ubuntu.Components 1.1
import Ubuntu.Components.ListItems 1.0 as ListItem
import Ubuntu.OnlineAccounts 0.1
import Ubuntu.OnlineAccounts.Client 0.1
import "../common"
Page {
id: root
title: "Authenticate"
AccountService {
id: accountService
onAuthenticated: {
console.log("Reply: " + JSON.stringify(reply))
}
}
AccountServiceModel {
id: accountsModel
provider: "ubuntuone"
}
function useFirstAccountToAutheticate() {
accountService.objectHandle = accountsModel.get(0, "accountServiceHandle")
accountService.authenticate({})
}
Button {
anchors {
left: parent.left
right: parent.right
bottom: parent.bottom
}
text: i18n.tr("Authenticate using Ubuntu One")
onTriggered: {
if (accountsModel.count > 0) {
useFirstAccountToAutheticate()
}
else {
setup.exec()
}
}
}
Setup {
id: setup
providerId: "ubuntuone"
onFinished: {
useFirstAccountToAutheticate()
}
}
}
После успешной аутентификации я получаю:
Reply: {"Secret":"consumer_key=XXXX&consumer_secret=XXXX&created=DATE&name=NAME&token=XXXX&token_secret=XXXX&updated=DATE"}
(XXXX, DATE и NAME не являются реальными значениями)
Я подумал о том, чтобы отправить токен на сервер и поговорить с Ubuntu One API (если такая вещь существует, я не смог ее найти) для аутентификации пользователя. Было бы замечательно, если бы кто-то мог сказать мне, нахожусь ли я на правильном пути, или я должен делать что-то по-другому, потому что я застрял.
Кроме того, я использую компонент Setup в своем QML, чтобы создать одну учетную запись Ubuntu на тот случай, если у пользователя ее еще нет. Кажется, это работает для меня на рабочем столе Utopic, но не работает на моем телефоне Ubuntu. Я предполагаю, что мне нужно установить applicationId, но для этого мне нужно создать XML-файл.application и установить его в каталог, к которому я не думаю, что у меня есть доступ, так как мое приложение ограничено.
Любая помощь приветствуется
2 ответа
Я могу ответить только на вторую часть вопроса (о файле.application), потому что я не знаком со службами, предлагаемыми учетной записью U1.
Вы правы в том, что вам нужно .application
файл, и вам на самом деле также нужен .service
файл также. К счастью, их также можно отправлять вместе с закрытыми приложениями, поставляемыми в виде пакета "клик". Ваш manifest.json
Файл должен содержать что-то вроде этого:
{
...
"name": "com.example.package",
"hooks": {
"my-app": {
"account-application": "my-app.application",
"account-service": "my-app.service",
"apparmor": "my-app.json",
"desktop": "my-app.desktop"
}
},
...
}
Когда пакет click будет установлен, .application
а также .service
файлы обрабатываются и устанавливаются в ~/.local/share/accounts/
и их имена (и, следовательно, идентификаторы) изменяются на <package-name>_<application-name>.{service,application}
, что в приведенном выше примере приведет к com.example.package_my-app.{service,application}
,
Просто для полноты, я показываю пример того, как эти файлы могут выглядеть:
мой-app.application
<?xml version="1.0" encoding="UTF-8" ?>
<application>
<service-types>
<service-type id="com.example.package_my-app">
<description>Login into XXX using your U1 account</description>
</service-type>
</services-types>
</application>
а также
мой-app.service
<?xml version="1.0" encoding="UTF-8"?>
<service>
<type>com.example.package_my-app</type>
<name>U1 for XXX</name>
<provider>ubuntuone</provider>
</service>
Вам нужно будет предоставить реализацию OAuth на вашем сервере и на вашем веб-сайте, чтобы позволить пользователю проходить аутентификацию в вашем сервисе через любые другие сервисы через OpenID (или любой другой механизм общей аутентификации, который они предоставляют). Затем вы предоставите плагин для сетевых учетных записей в пакете клиентского приложения, который позволит пользователю войти на ваш сайт через механизм OAuth. Токен OAuth, полученный в результате этого, будет храниться локально, и ваше клиентское приложение будет использовать его для аутентификации на вашем сервере для любых коммуникаций API или просто для входа и перенаправления на зарегистрированную версию вашего веб-сайта, если он веб-приложение.