使用在线账户对我的服务器进行身份验证

使用在线账户对我的服务器进行身份验证

在我的 Ubuntu QML 应用中,我尝试使用在线帐户来向我的服务器进行身份验证。我有点困惑我应该怎么做。最终,我希望用户能够使用他们的 facebook/google/ubuntu one 帐户登录。在阅读了一些有关 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 通信(如果存在这样的东西,我一直找不到它)以对用户进行身份验证。如果有人能告诉我我是否走在正确的轨道上,或者我是否应该做一些不同的事情,因为我有点卡住了,那就太好了。

此外,我正在使用 QML 中的 Setup 组件创建一个 ubuntu one 帐户,以防用户还没有帐户。这似乎在我的 Utopic 桌面上有效,但在我的 Ubuntu 手机上不起作用。我想我需要设置 applicationId,但为此我需要创建一个 .application xml 文件并将其安装在一个目录中,由于我的应用程序受到限制,我认为我无法访问该目录。

任何帮助都值得赞赏

答案1

我只能回答问题的第二部分(关于 .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/,并且它们的名称(以及 ID)将更改为<package-name>_<application-name>.{service,application},在上面的示例中将导致com.example.package_my-app.{service,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>

我的应用服务

<?xml version="1.0" encoding="UTF-8"?>
<service>
  <type>com.example.package_my-app</type>
  <name>U1 for XXX</name>
  <provider>ubuntuone</provider>
</service>

答案2

您需要在您的服务器上提供 OAuth 实现,并在您的网站上允许用户通过 OpenID(或他们提供的任何共享身份验证机制)通过任何其他服务向您的服务进行身份验证。然后,您将提供一个插件来在线账户在您的客户端应用程序包中,这将允许用户通过 OAuth 机制登录到您的网站。由此给出的 OAuth 令牌将存储在本地,您的客户端应用程序将使用该令牌向您的服务器进行身份验证以进行任何 API 通信,或者仅用于登录并重定向到您网站的登录版本(如果它是 Web 应用程序)。

相关内容