2014-12-11 2 views
3

TL : DR : EDIT 1에서 읽습니다.모바일 앱용 OAuth가있는 Grails Rest API

인증을 구현하는 방법, 특히 모바일 앱에서 사용할 나머지 API에 대한 OAuth에 대한 해결책을 찾으려고합니다.

나는 발견이 인기 플러그인 (봄 보안 나머지) :

http://alvarosanchez.github.io/grails-spring-security-rest/docs/guide/single.html#oauth1

그러나 문제는 그것이 콜백 URL을 필요로하므로이, 자바 스크립트 프론트 엔드 애플리케이션을 위해 설계된 것입니다 내 프론트 엔드에 생성 된 토큰을 전달합니다 (다이어그램에서 볼 수있는 것처럼).

모바일 응용 프로그램의 경우 어떻게합니까? 이 플러그인을 구현할 수있는 다른 플러그인이나 디자인이 있습니까? Grails 나 Spring에서 stateless OAuth에 대한 플러그인이나 튜토리얼이별로 없다는 것을 알게되었지만 사용하는 모바일 앱은 많습니다.

여기에 사용하는 경우의 예입니다 :

  • 사용자가 모바일 앱을 엽니 다.
  • 사용자가 모바일 앱에서 Facebook으로 로그인합니다.
  • 사용자가 api/orders에 요청을 보내면 주문 만 반환합니다.

누가이 부분에서 OAuth 부분을 처리해야합니까? 플러그인에 표시된 다이어그램의 흐름은 모바일 앱에서 작동하지 않으므로 모바일 앱이 Facebook에 인증을 받아 토큰 스토어를 가져 와서 웹 앱에 전달해야합니까?

정확한 디자인/흐름이이 경우에 무엇인지, 그리고 플러그인 또는 Grails를 사용하여 구현하는 방법을 알고 싶습니다.

편집 : 올바른 흐름입니까? 그렇다면

Mobile App OAuth + Auth to backend with external provider UML Sequence Diagram

, Grails는이를 구현하는 표준 방법은 무엇입니까?

EDIT 2 : 이제 흐름을 이해 했으므로 로그인 부분을 Spring 보안 나머지 플러그인 (이미 다른 모든 항목을 처리하고 있음)과 통합해야합니다. 는 여기에 내가 플러그인과 통합 할 코드입니다하지만 플러그인에서 수정하는 경우 또는 모르는 :

// api/auth/fb 
def auth(){ 

    //Extract fb_access_token 
    String fbAccessToken = request.JSON.?fb_access_token 

    //Call https://graph.facebook.com/me?access_token=fbAccessToken 
    def userInfo = facebookService. ... (fbAcessToken) //Method to use in the plugin 

    //Verify if the userInfo contains an error/doesn't contain a fbId 
    if(userInfo.getFbId() == null){ 
     respond unauthorized() // 401, Invalid access token 
    } 
    //Verify if this token is for our app 
    else if(userInfo.getAppSecret() != System.env.getParameter("appSecret")){ 
     respond unauthorized() //401, token not for this app 
    } 
    //Register or login 
    else{ 
     User user = User.findByFbId(userInfo.getFbId()) 
     if(user == null){ 
      facebookService.registerUser(userInfo) //Custom method implemented in the service 
     } 
     else{ 
      FbToken fbToken = new FbToken(userInfo.getToken(), userInfo.getExpiration()) 
      user.setFbAccessToken(fbToken) 
     } 

     //Login the user with spring security and let it handle the rest (token creation => storage => http answer) 

    } 

} 
+0

이 작업을 수행하는 데 운이 좋았습니까? – OsaSoft

답변

1

에 따라 우리가 페이스 북의 해결 방법 Grails의 나머지 플러그인과 연결하는 것입니다.

  1. 클라이언트가 facebook에 요청하여 fb uid를 가져옵니다.
  2. 클라이언트는 FB 이메일 등의 세부 정보와 함께 서버에 uid를 보내, 등 등
    • 서버 FB의 UID 및 를 수신 (인증 후 페이스 북에서 가져온 무엇이든) 재 인증 다음으로 사용자를 찾으려고 페이스 북와 fbuid 데이터베이스에있는이 fbuid.
    • 사용자가 이메일을 사용하여 로그인 한 사용자가 다시 토큰을 반환 한 경우
    • 사용자를 찾지 못하면 사용자를 등록하고 로그인하여 응답으로 토큰을 다시 보내십시오.
  3. 클라이언트는 두 번째 단계에서 반환 된 토큰으로 모든 후속 호출을 수행합니다.
+0

FB UID가 올바른지 어떻게 확인합니까? 사용자 등록 또는 로그인하기 전에 페이스 북 API를 호출하여 확인합니까? – Yanis26

+0

성공하면 FB가 uid를 반환해야 클라이언트에서 페이스 북 API를 호출합니다. – mehmood

+0

감사합니다. 이 흐름으로 작업하기 위해 스프링 보안 플러그인을 어떻게 수정했는지 빠르게 알려주실 수 있습니까? (특히 로그인 부분). 그리고 fb와 통신하기 위해 추천 할 플러그인이 있습니까? 내가 인증 (또는 심지어 웹 앱 ...)으로 웹 앱을 만드는 것은 이번이 처음입니다. – Yanis26