Dados obtidos após a autenticação

No último passo do SSO a aplicação cliente fará uma solicitação dos dados do usuário ao Passaporte Web para autenticar o usuário localmente.

O retorno desta solicitação é uma mensagem JSON, contendo os dados do usuário e algumas informações adicionais. Um exemplo destes dados é mostrado abaixo:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
{
    "uuid": "1e73dad8-fefe-4b3a-a1a1-7149633748f2",
    "email": "j.silva@test.com",
    "is_active": true,
    "first_name": "José",
    "last_name": "da Silva",
    "nickname": "",
    "gender": "-",
    "birth_date": null,
    "language": null,
    "timezone": null,
    "country": null,
    "send_myfreecomm_news": false,
    "send_partner_news": false,
    "update_info_url": "https://sandbox.app.passaporteweb.com.br/accounts/api/identities/1e73dad8-fefe-4b3a-a1a1-7149633748f2/profile/",
    "one_time_password_url": "https://sandbox.app.passaporteweb.com.br/accounts/api/identities/1e73dad8-fefe-4b3a-a1a1-7149633748f2/one-time-password/",
    "notifications": {
        "count": 18,
        "list": "https://sandbox.app.passaporteweb.com.br/notifications/api/"
    },
    "accounts": [
        {
            "plan_slug": "plus",
            "name": "Pessoal",
            "roles": ["owner"],
            "url": "https://sandbox.app.passaporteweb.com.br/organizations/api/accounts/e823f8e7-962c-9a9a-b63f-6cf439686159/",
            "notifications": "https://sandbox.app.passaporteweb.com.br/notifications/api/accounts/e823f8e7-962c-9a9a-b63f-6cf439686159/",
            "expiration": "2011-09-30 00:00:00",
            "external_id": null,
            "uuid": "e823f8e7-962c-9a9a-b63f-6cf439686159"
        },
        {
            "plan_slug": "max",
            "name": "Myfreecomm",
            "roles": ["owner"],
            "url": "https://sandbox.app.passaporteweb.com.br/organizations/api/accounts/b39bad59-94af-7b7b-995a-04967b454c7a/",
            "notifications": "https://sandbox.app.passaporteweb.com.br/notifications/api/accounts/b39bad59-94af-7b7b-995a-04967b454c7a/",
            "expiration": "2012-12-12 00:00:00",
            "external_id": null,
            "uuid": "b39bad59-94af-7b7b-995a-04967b454c7a"
        }
    ],
    "services": {
        "myfinance": "https://sandbox.app.passaporteweb.com.br/accounts/api/service-info/1e73dad8-fefe-4b3a-a1a1-7149633748f2/myfinance/",
        "identity_client": "https://sandbox.app.passaporteweb.com.br/accounts/api/service-info/1e73dad8-fefe-4b3a-a1a1-7149633748f2/identity_client/"
    }
}

Informações do usuário

Os dados que identificam o usuário autenticado estão compreendidos entre as linhas 2 e 14 neste exemplo.

  • O atributo uuid identifica um usuário do Passaporte Web. Este atributo deve ser a chave utilizada para localizar um usuário nas aplicações cliente.
  • O atributo email contém o email relacionado a este usuário. Não o utilize como chave para localização de usuários pois uma das funcionalidades previstas para o Passaporte Web é a troca de email de um usuário.
  • O atributo is_active sinaliza se este Passaporte Web foi ativado. A ativação é utilizada para validar o email fornecido durante o cadastro, portanto pode ser desejável que a aplicação não permita o acesso de usuários inativos, porém esta crítica é deixada a cargo da aplicação cliente.
  • Todos os outros atributos do usuário são opcionais (inclusive first_name e last_name).

Perfil e notificações e verificação em duas etapas

  • O atributo update_info_url contém a url para manipulação dos dados de perfil deste usuário. Estas operações de manipulação estão descritas na documentação sobre o Perfil.
  • O atributo notifications contém a contagem de notificações não lidas deste usuário e a url para obter estas notificações. Para mais informações consulte a documentação da API de Notificações para usuários.
  • O atributo one_time_password_url contém a url para verificação se este usuário utiliza a verificação em duas etapas e para validar seus códigos de acesso. Para mais informações consulte a documentação da API de Validação de um One Time Password associado a um usuário.

Contas

O atributo accounts contém a lista de contas às quais este usuário possui acesso na aplicação cliente. Caso a aplicação não utilize contas ou o usuário não possua conta na aplicação, seu conteúdo será uma lista vazia.

Contas expiradas são ignoradas por padrão. Para que elas também sejam consideradas utilize o parâmetro include_expired_accounts, durante a solicitação dos dados do usuário, de forma similar à descrita na operação de LEITURA DOS DADOS DO USUÁRIO

Os dados contidos em cada conta são:

  • uuid: Identificador global desta conta. Este deve ser a chave utilizada para localizar uma conta nas aplicações cliente
  • name: Nome da conta.
  • expiration: Data de expiração desta conta. Caso a conta não possua data de expiração seu valor será null.
  • plan_slug: Identificador de um plano na aplicação cliente.
  • roles: Lista de papéis do usuário na conta. Caso este usuário seja o responsável por esta conta seu papel será owner, caso contrário seu papel será user. A aplicação cliente pode criar papéis adicionais utilizando a operação PUT /organizations/api/accounts/:uuid/members/:member_uuid/.
  • url: Url para a api de manipulação desta conta. Pra mais informações consulte a API de Gerência de contas.
  • notifications: Url para a api de manipulação das notificações desta conta. Pra mais informações consulte a API de Notificações para contas.
  • external_id: Atributo utilizado para relacionar uma conta do Passaporte Web a um objeto na aplicação cliente. Seu valor padrão é null.

Serviços

O atributo services contém a lista de serviços associados a este usuário. Esta associação é utilizada nos seguintes cenários:

  • Quando o usuário escolhe a opção “Permitir sempre” na tela de “Autorização de Acesso” do processo de SSO;
  • Quando duas aplicações querem compartilhar algum conjunto de informações sobre o usuário, como por exemplo um conjunto de permissões na aplicação, ou uma lista de urls de api para troca de dados.

Para mais informações consulte a API de Serviços do usuário.

Utilizando estes dados na sua aplicação

O trecho de código abaixo exemplifica a manipulação dos dados obtidos para atualizar os dados do usuário autenticado e das accounts às quais ele tem acesso.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# Transformando o json com os dados do usuário em um dicionário (similar a um hash ou hashmap em outras linguagens)
user_data = json.loads(response_content)

# Buscando por um usuário com o uuid obtido ou criando um novo usuário
try:
    user = User.objects.get(uuid=user_data['uuid'])
except User.DoesNotExist:
    user = User(uuid=user_data['uuid'])

# Atualizando os dados básicos deste usuário e salvando estas alterações
user.email = user_data['email']
user.first_name = user_data['first_name']
user.last_name = user_data['last_name']
user.save()


# Atualizando as accounts às quais o usuário tem acesso
for account_data in user_data['accounts']:
    uuid = account_data['uuid']
    name = account_data['name']
    plan_slug = account_data['plan_slug']
    url = account_data['url']
    expiration = account_data['expiration']
    roles = account_data['roles']

    try:
        account = Account.objects.get(uuid=uuid)
    except Account.DoesNotExist:
        account = Account(uuid=uuid)

    account.name = name
    account.plan_slug = plan_slug
    account.url = url

    # Datas não são são serializaveis em json, portanto devemos manipula-las separadamente
    if expiration:
        account.expiration = datetime.strptime(expiration, '%Y-%m-%d %H:%M:%S')

    # Uma account pode ter mais de um membro, portanto o objeto local que a representa deve suportar este comportamento
    account.add_member(user, roles)

    account.save()


# Removendo as accounts às quais o usuário não possui mais acesso
for account_data in user_data['accounts']:
    uuid = account_data['uuid']

    try:
        account = Account.objects.get(uuid=uuid)
    except:
        continue

    if account.has_member(user):
        account.remove_member(user)
        account.save()

O exemplo acima utiliza objetos chamados User e Account, que seriam representações locais do usuário e de uma account na aplicação cliente, funcionando como um cache dos dados armazenados no Passaporte Web.