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/"
}
}
|
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).
- 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.
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.
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.
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.