Usando contas on-line para autenticar no meu servidor

1

No meu aplicativo Ubuntu QML, estou tentando usar contas online para autenticar no meu servidor. Estou um pouco confuso sobre como devo fazer isso. Em última análise, quero que o usuário possa fazer login com suas contas do facebook / google / ubuntu. Depois de ler um pouco sobre OpenID e OAuth, acho que deveria estar usando um deles para isso.
Até agora, no meu aplicativo, estou usando a conta do usuário do Ubuntu One para autenticar assim:

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()
        }
    }
}

Após a autenticação bem-sucedida, recebo:

Reply: {"Secret":"consumer_key=XXXX&consumer_secret=XXXX&created=DATE&name=NAME&token=XXXX&token_secret=XXXX&updated=DATE"}

(XXXX, DATE e NAME não são valores reais)
O que eu pensei em fazer é enviar o token para o servidor e conversar com o Ubuntu One API (se tal coisa existe, eu não fui capaz de encontrá-lo) para autenticar o usuário. Seria ótimo se alguém pudesse me dizer se estou no caminho certo ou se deveria estar fazendo algo diferente, porque estou meio que preso.

Além disso, estou usando o componente Setup no meu QML para criar uma conta do Ubuntu no caso de o usuário ainda não ter uma. Isso parece funcionar para mim no meu desktop Utopic, mas não funciona no meu telefone Ubuntu. Eu acho que preciso definir o applicationId, mas para isso eu preciso criar um arquivo xml .application e instalá-lo em um diretório que eu não acho que eu tenho acesso como o meu aplicativo está confinado.

Qualquer ajuda é apreciada

    
por meta221 09.10.2014 / 10:50

2 respostas

3

Eu só posso responder à segunda parte da questão (sobre o arquivo .application), porque não estou familiarizado com os serviços oferecidos pela conta U1.

Você está correto, pois precisa de um arquivo .application e, na verdade, também precisa de um arquivo .service . Felizmente, é possível enviá-los também com aplicativos confinados enviados em um pacote de cliques. Seu arquivo manifest.json deve conter algo ao longo destas linhas:

{
  ...
  "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"
    }
  },
  ...
}

Quando o pacote de cliques é instalado, os arquivos .application e .service são processados e instalados em ~/.local/share/accounts/ e seus nomes (e, portanto, IDs) são alterados para <package-name>_<application-name>.{service,application} , o que no exemplo acima resultaria em com.example.package_my-app.{service,application} .

Apenas para completar, estou mostrando um exemplo de como esses arquivos podem ser:

my-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>

e

my-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>
    
por mardy 13.10.2014 / 09:50
0

Você precisará fornecer uma implementação OAuth em seu servidor, e em seu site, permitir que o usuário se autentique em seu serviço através de qualquer um desses outros serviços através de OpenID (ou qualquer mecanismo de autenticação compartilhada que eles forneçam). Em seguida, você forneceria um plug-in para Contas on-line no pacote do aplicativo cliente, o que permitiria que o usuário efetuasse login em seu site por meio do mecanismo OAuth. O token OAuth fornecido como resultado disso seria armazenado localmente, e seu aplicativo cliente usaria isso para autenticar em seu servidor para qualquer comunicação da API ou apenas para fazer login e redirecionar para a versão conectada do seu site, se for uma webapp.

    
por dobey 05.03.2015 / 15:54