Objetivo: permitir que um usuário se autentique com o Facebook em um aplicativo iOS que exija acesso a um serviço da Web protegido em execução.
Pressupostos: existe um sistema de autenticação (e registro) nativo para os usuários que optam por não usar o Facebook para fazer login.
Detalhes:
- Suponha que queremos oferecer a opção de um usuário entrar no Facebook sem criar uma conta / credencial separada para o nosso sistema.
- Como suportamos nosso próprio mecanismo de autenticação nativo (nome de usuário e senha), temos nossos próprios IDs de usuário e emitimos um token de autenticação que é usado para interações subseqüentes após a validação inicial da credencial.
Estou surpreso que o Facebook não tenha as melhores práticas para isso na documentação dos desenvolvedores. Toda a documentação existente está assumindo que você está criando a autenticação do FB em um site ou um aplicativo móvel autônomo sem serviço que exija autenticação.
Aqui estão meus pensamentos iniciais sobre como isso seria projetado, mas quero validação sobre se está correto.
- Cliente abre o login do Facebook no iOS
- O usuário da interface do usuário faz login com credenciais do Facebook e obtém o token de acesso
- O aplicativo iOS passa o token de acesso ao nosso servidor
Nosso servidor conversa com a API gráfica do FB usando o token de acesso para (a) validar o token e (b) obter o ID do usuário do FB para esse token de acesso.
Por exemplo, nosso servidor chamaria https://graph.facebook.com/me/?access_token=XYZ, que retornaria informações de perfil em um objeto JSON
Supondo que seja válido, nosso servidor extrai o ID do usuário do objeto JSON e verifica se o usuário já possui uma conta. Nesse caso, emitimos nosso próprio tíquete de autenticação ao cliente para usar nessa sessão. Se o usuário não tiver uma conta, criamos uma nova com o ID do usuário do Facebook, atribuímos nosso próprio UserID e emitimos nosso tíquete de autenticação.
- O cliente passa o tíquete de autenticação novamente nas interações subseqüentes que precisam de autenticação.
Parece a abordagem certa para mim, mas não tenho certeza se estou perdendo algo insanamente básico e seguindo o caminho errado (complicado).
Respostas:
Eu mesmo lidei com isso, e aqui está a parte que me mordeu:
Na sua etapa 5 ... É possível que um usuário se registre em uma conta com você totalmente separado do ID do Facebook, certo? Em outra ocasião, eles acessam o Facebook ... E você acabou de criar uma segunda conta e perder a primeira.
É necessário que haja uma maneira de fazer login no seu serviço da Web, faça login no facebook e capture a associação entre o ID do facebook e a conta local.
Além disso, seu plano parece sólido.
Atualização : o Facebook adicionou um documento descrevendo esse cenário AQUI
fonte
Use https para transmitir o token de autenticação ao seu servidor, conforme declarado pelo Facebook
fonte
Um problema que vejo com essa estratégia é que alguém pode fornecer um token de acesso obtido para um aplicativo do facebook diferente. Até onde eu sei, não há como verificar se o token de acesso é para o seu aplicativo, então você continuará usando-o.
Não parece muito prejudicial, no entanto. Geralmente, as pessoas / aplicativos tentam proteger os tokens de acesso, em vez de compartilhá-los.
Uma possível exploração disso seria, para alguém criar seu próprio site ou aplicativo móvel, obter tokens de acesso para seus usuários e tentar autenticá-los usando sua API. Se isso for bem-sucedido (o usuário tem uma conta no Facebook em seu site), o site malicioso poderá usar sua API representando o usuário.
É um tiro no escuro, mas acho que poderia funcionar.
Editar: Parece que existe uma maneira de validar o token de acesso, afinal. Veja a resposta de @Daaniel na pergunta Obtenha o ID do aplicativo no token de acesso do usuário (ou verifique o aplicativo de origem para um token) .
fonte
appsecret_proof
deve evitar isso (ver aqui )appsecret_proof
ajuda aqui? Tanto quanto eu entendo, serve para provar ao Facebook que o servidor conhece a chave secreta. No entanto, ivant estava se referindo a um aplicativo mal-intencionado que obtinha tokens e os enviava para sua API. O servidor pode verificar o ID do aplicativo, mas ele pode ser facilmente falsificado por um aplicativo mal-intencionado. Então ... como alguém poderia mitigar isso?https://graph.facebook.com/app/?access_token=[user_access_token]
que retorna o ID de aplicativo e, em seguida, comparando os ids de aplicativossua solução funciona totalmente.
Talvez uma alternativa: por que não receber o e-mail do cliente a partir da solicitação inicial de serviço social e enviar para o seu serviço web? O serviço da Web pode apenas armazenar o email, e talvez um provedor social também. Entendo que seu serviço da web não poderá validar a origem do email, mas não existe uma relação de alta confiança entre o serviço da web e o cliente? Se houver, parece que você pode depender do e-mail vindo do lugar certo. Alguém, por favor, deixe-me saber que coisa óbvia que estou perdendo, que torna a abordagem por e-mail boba ...
fonte