programing

인증을 위해 Facebook을 사용하는 웹 사이트 용 REST API

nasanasas 2020. 9. 22. 08:17
반응형

인증을 위해 Facebook을 사용하는 웹 사이트 용 REST API


우리는 사이트 에 로그인하고 자신을 인증 하는 유일한 방법이 Facebook을 사용하는 웹 사이트를 가지고 있습니다 (제가 선택한 것이 아닙니다). Facebook으로 처음 로그인하면 계정이 자동으로 생성됩니다.

이제 우리 사이트를위한 iPhone 애플리케이션과 다른 사람들이 우리 서비스를 사용할 수 있도록 공개 API를 만들고 싶습니다.

이 질문은 앱 / API에서 웹 사이트를 인증하는 방법에 관한 것이며 두 부분으로 나뉩니다.

  1. API에서 Facebook OAuth 만 인증 방법으로 사용하는 웹 사이트로 REST 인증을 처리하는 올바른 방법은 무엇입니까?

    REST API에 대한 표준 인증 방법을 많이 읽고 연구했습니다. 사용자에 대한 자격 증명이 없기 때문에 HTTPS를 통한 기본 인증 과 같은 방법을 사용할 수 없습니다 . 이와 같은 것은 API를 사용하여 애플리케이션을 인증하기위한 것 같습니다.

    현재 제가 생각할 수있는 가장 좋은 방법은 API에서 / authorize 엔드 포인트에 도달하고 Facebook OAuth로 리디렉션 한 다음 사이트로 다시 리디렉션하고 API 사용자가 후속 인증에 사용할 수있는 '토큰'을 제공하는 것입니다. 요청.

  2. 우리가 만든 공식 애플리케이션의 경우 반드시 동일한 방식으로 공용 API를 사용할 필요는 없습니다. 웹 사이트와 대화하고 사용자를 인증하는 가장 좋은 방법은 무엇입니까?

API (공개) 키와 비밀 (개인) 키를 사용하여 API를 사용하는 타사 애플리케이션을 인증하는 방법을 이해합니다 (생각합니다). 그러나 앱을 사용하는 사용자를 인증 할 때 사용자를 인증해야하는 유일한 방법이 Facebook 일 때 어떻게해야할지 혼란 스럽습니다.

매우 분명한 것을 놓치고 있거나 공개 REST API가 어떻게 작동해야하는지 완전히 이해하지 못하는 것 같아서 조언과 도움을 주시면 감사하겠습니다.


업데이트 : 아래 참조

저도이 질문에 대해 열심히 생각하고 있습니다. 아직 완전히 명확하지는 않지만 여기에 제가 생각하고있는 경로가 있습니다. 내 사용자 가 Facebook 연결 로만 인증 하는 REST API를 만들고 있습니다.

클라이언트에서 :

  1. Facebook API를 사용하여 로그인하고 OAUTH2 코드를받습니다.
  2. 이 코드를 액세스 토큰으로 교환하십시오.
  3. 내 사용자 지정 API에 대한 모든 호출에 Facebook 사용자 ID와 액세스 토큰을 포함합니다.

API에서 (사용자 인증이 필요한 모든 방법에 대해) :

  1. 위의 액세스 토큰을 사용하여 / me Facebook 그래프에 요청합니다.
  2. 반환 된 Facebook 사용자 ID가 위에서 내 API로 전달 된 사용자 ID와 일치하는지 확인합니다.
  3. 액세스 토큰이 만료 된 경우 추가 통신이 필요합니다.

아직 테스트하지 않았습니다. 어떻게 들리나요?

--- 업데이트 : 2014 년 7 월 27 일 질문에 답하기 위해 ---

위의 교환은 로그인시 한 번만 사용합니다. 어떤 사용자가 로그인하고 있는지 확인한 후 고유 한 액세스 토큰을 만들고 해당 토큰은 앞으로 그 시점부터 사용됩니다. 새 흐름은 다음과 같습니다.

클라이언트에서 :

  1. Facebook API를 사용하여 로그인하고 OAUTH2 코드를받습니다.
  2. 이 코드를 액세스 토큰으로 교환하십시오.
  3. Facebook 토큰을 매개 변수로 포함하여 API 에서 액세스 토큰 요청

API에서

  1. 액세스 토큰 요청을받습니다.
  2. facebook 액세스 토큰을 사용하여 / me Facebook 그래프에 요청합니다.
  3. Facebook 사용자가 존재하고 내 데이터베이스의 사용자와 일치하는지 확인
  4. 나만의 액세스 토큰을 만들고 저장 한 다음이 시점부터 사용할 클라이언트에 반환합니다.

이것은 기본적으로 Chris의 업데이트 된 답변과 유사한 JWT (JSON Web Tokens)를 사용하여 구현 한 것입니다. Facebook JS SDK와 JWT를 사용했습니다.

여기에 내 구현이 있습니다.

  1. 클라이언트 : Facebook JS SDK를 사용하여 로그인하고 액세스 토큰을받습니다.

  2. 클라이언트 :/verify-access-token 엔드 포인트 를 호출하여 내 API에서 JWT를 요청 합니다.

  3. MyAPI : 액세스 토큰을 수신 /me하고 Facebook API의 끝점을 호출하여 확인합니다 .

  4. MyAPI: If access token is valid, finds the user from database, logs in the user if exist. Create a JWT with required fields as payload, set an expiry, sign with the secret key and send back to the client.

  5. Client: Stores the JWT in local storage.

  6. Client: Sends the token (the JWT from step 5) along with the request for the next API call.

  7. MyAPI: validate the token with the secret key, if token is valid, exchange the token for a new one, send it back to the client along with the API response. (No external API calls for verification of the token here after) [if the token is invalid/expired request client to authenticate again and repeat from 1]

  8. Client Replaces the stored token with the new one and use it for the next API call. Once the token expiry is met, the token expires revoking access to API.

Every token is used once.

Read more answers about security and JWT

How secure is JWT

If you can decode JWT how are they secure?

JSON Web Tokens (JWT) as user identification and authentication tokens


I am trying to answer the same question and have been going through a lot of reading recently...

I won't have "the" answer but things are getting a little clearer for me. Have you read the comments in the article you mentioned? I found them really interesting and helpful.

As a result, and in the light of how things have evolved since the first article has been written, here's what I think I'll do:

  • HTTPS everywhere — this allows you to forget about HMAC, signing, nonce, ...

  • Use OAuth2:

    • When authentication requests come from my own apps/website, use this 'trick' (or a variation of it) described in a reply to the article mentioned before.

    • In my case, I have two types of users: those with classic login/password credentials and those who have signed up with Facebook Connect.
      So I'd provide a regular login form with a "Login with Facebook" button. If the user logs in with his "classic" credentials, I'd just send these to my OAuth2 endpoint with a grant_type=password.
      If he chooses to log in via Facebook, I think that would be a two-steps process:

      • First, use Facebook iOS SDK to open an FBSession
      • When that's done and the app is given back control, there should be a way to get a Facebook ID for that user. I'd send this ID alone to my OAuth2 endpoint with an extension grant understood by my server as "using an FB User ID".

Please note that I am still heavily researching on all this stuff, so that might not be a perfect answer... maybe not even a correct one! But I think that would make for a good starting point. The idea of using an "extension grant" for the Facebook authentication might involve having to register it to do things properly? I'm not quite sure.

Anyway, I hope I was able to help you even a bit, and that at least it can start a discussion to find the best solution to this problem :)

Update
The Facebook login is not a solution as pointed in the comments: anybody could send an arbitrary user ID and log in as this user on the API.

What about doing it like this:

  • Show a login form with a "Facebook login" button
  • If this login method is chosen, act kinda like the Facebook SDK: open a web page from your authentication server, which will initiate the Facebook login.
  • Once the user has logged in, Facebook will use your redirect URL to confirm; make that URL point to another endpoint of your authentication server (possibly with an extra parameter indicating the call came from an app?)
  • When the authentication endpoint is hit, the authentication can securely identify the user, retain its FB User ID/FB Session and return an access token to your app using a custom URL scheme, just like the Facebook SDK would do

Looks better?

참고URL : https://stackoverflow.com/questions/12065492/rest-api-for-website-which-uses-facebook-for-authentication

반응형