Использование онлайн-аккаунтов для аутентификации на моем сервере

В моем приложении 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 или просто для входа и перенаправления на зарегистрированную версию вашего веб-сайта, если он веб-приложение.

Другие вопросы по тегам