9

के साथ फ़ायरबेस एथ को एकीकृत करें क्या कोई Google क्लाउड एंडपॉइंट में फ़ायरबेस टॉकन को सत्यापित करने के लिए (कुछ नमूना कोड के साथ) निर्दिष्ट कर सकता है? हाल ही में पूछे जाने वाले प्रश्न में यह स्पष्ट नहीं है (How to integrate firebase authentication with google app engine endpoints)Google ऐप इंजन क्लाउड एंडपॉइंट्स

एंड्रॉइंट में Google प्रमाणीकरण उपयोगकर्ता पैरामीटर को एंडपॉइंट में जोड़कर स्वचालित रूप से किया जाता है।

@ApiMethod(name = "endpoint.addUser", httpMethod = HttpMethod.POST) 
     public ResultObject addUser(HttpServletRequest request, User pUser) throws OAuthRequestException { 
    String token = request.getHeader("Authorization"); 
    String graphUrl = "https://graph.facebook.com/v2.6/me?fields=id,name,email&access_token=" + token; 

    URL u = new URL(g); 
    URLConnection c = u.openConnection(); 
    BufferedReader in = new BufferedReader(new InputStreamReader(c.getInputStream())); 
    String inputLine; 
    StringBuffer b = new StringBuffer(); 
    while ((inputLine = in.readLine()) != null){ 
      b.append(inputLine + "\n");    
    } 
    in.close(); 
    graph = b.toString(); 
    JSONObject json = new JSONObject(graph); 

    facebookId = json.getString("id"); 
    email = json.getString("email"); 
    //... 
} 

firebase टोकन फेसबुक निशानी के रूप में के रूप में आसान के सत्यापन है: फेसबुक टोकन इस तरह फेसबुक ग्राफ एपीआई के साथ एक बादल endpoint में सत्यापित किया जा सकता? क्या फ़ायरबेस टोकन से ईमेल पुनर्प्राप्त करना संभव है?

+0

मैं फ़ायरबेस के बारे में बिल्कुल जवाब नहीं दे सकता, लेकिन मैं कहूंगा कि यह लेख को एकीकृत करने का सही तरीका नहीं है। आपको इसके बजाय 'com.google.api.server.spi.config.Authenticator 'लागू करना चाहिए। फिर अपनी एनोटेशन में 'प्रमाणीकरणकर्ता' निर्दिष्ट करें। मेरा मानना ​​है कि फायरबेस एथ टोकन जेडब्ल्यूटी हैं इसलिए उन्हें सत्यापित करने के लिए अनुरोध भेजने की आवश्यकता नहीं है। – saiyr

+0

हां वह कोरक है। अंतिम कार्यान्वयन में आप प्रमाणीकरणकर्ता का उपयोग करेंगे। मैं केवल प्रदर्शन के लिए कोड शामिल करना चाहता था। – SmilingM

+0

फ़ायरबेस के लिए कारण है कि मैं टोकन को सत्यापित करना चाहता हूं, कि मेरे पास पहले से ही एक चल रहा ऐप इंजन एंडपॉइंट है। अब मैं क्लाइंट में फायरबेस एथ का उपयोग करना चाहता हूं और क्लाउड एंडपॉइंट के खिलाफ प्रमाणित करना चाहता हूं। मैं अभी के लिए फायरबेस रीयलटाइम डेटाबेस में माइग्रेट नहीं करना चाहता हूं। – SmilingM

उत्तर

2

जहां तक ​​मैं प्रलेखन को समझता हूं ऐसा लगता है कि आपको अपने अनुरोध में उपयोगकर्ता टोकन जोड़ने की आवश्यकता है, उदाहरण के लिए हेडर के रूप में। फिर आपको फ़ायरबेस व्यवस्थापक एसडीके के खिलाफ इस टोकन को सत्यापित करने की आवश्यकता है, और इस तरह आपको उपयोगकर्ता आईडी मिल जाएगी।

@ApiMethod(name = "someApiCall", httpMethod = ApiMethod.HttpMethod.POST) 
public YourResponse someApiCall(YourRequestObject body, HttpServletRequest httpRequest) { 
    String userToken = httpRequest.getHeader("USER_TOKEN_HEADER"); 

    Task<FirebaseToken> authTask = FirebaseAuth.getInstance().verifyIdToken(userToken) 
     .addOnSuccessListener(new OnSuccessListener<FirebaseToken>() { 
      @Override 
      public void onSuccess(FirebaseToken firebaseToken) { 
      } 
     }); 

    try { 
     Tasks.await(authTask); 
    } catch (ExecutionException e) { 
    } catch (InterruptedException e) { 
    } 

    FirebaseToken result = authTask.getResult(); 
    String userId = result.getUid(); 

    return new YourResponse(); 
} 

मैं पर मेरे कोड आधारित:

public class CustomAuthenticator implements Authenticator { 
    private static final Logger LOG = Logger.getLogger(CustomAuthenticator.class.getName()); 
    private static final String COOKIE_FIREBASE_TOKEN = "firebase_token"; 

    static { 
     LOG.info("CustomAuthenticator: initializing"); 
     InputStream serviceAccountResourceStream = CustomAuthenticator.class.getResourceAsStream("/serviceAccountKey.json"); 
     FirebaseOptions options = new FirebaseOptions.Builder() 
       .setServiceAccount(serviceAccountResourceStream) 
       .build(); 

     FirebaseApp.initializeApp(options); 
     LOG.info("CustomAuthenticator: initialized"); 
    } 

    @Override 
    public User authenticate(HttpServletRequest httpServletRequest) { 
     User user = null; 
     if (httpServletRequest.getCookies() != null) { 
      for (Cookie cookie : httpServletRequest.getCookies()) { 
       if (cookie.getName().equals(COOKIE_FIREBASE_TOKEN)) { 
        FirebaseToken firebaseToken = FirebaseAuth.getInstance().verifyIdToken(cookie.getValue()).getResult(); 
        user = new User(firebaseToken.getUid(), firebaseToken.getEmail()); 
       } 
      } 
     } 
     return user; 
    } 
} 

अपने एपीआई कार्यान्वयन में, करने के लिए मत भूलना:

https://firebase.google.com/docs/auth/admin/verify-id-tokens

How do I secure my Google Cloud Endpoints APIs with Firebase token verification?

1

आप एक CustomAuthenticator उपयोग कर सकते हैं अपने कस्टम प्रमाणीकरण सक्षम करें :

@Api(name = "exampleWithAuth", 
     version = "v1", 
     ... 
     auth = @ApiAuth(allowCookieAuth = AnnotationBoolean.TRUE), // This is needed to process your cookie for the token 
     authenticators = {CustomAuthenticator.class} // Declare your custom authenticator 
) 
public class ExampleWithAuthEndpoint { 

    @ApiMethod(httpMethod = "GET", path = "example") 
    public Example getExample(User user /* Add User to enable API authentication */) { 
     if (user != null) { 
      // Do something 
     } 
     return null; 
    } 
} 

अब जब आप अपने एपीआई फोन, बस कुकी firebase_token आपके अनुरोध को बढ़ाते हैं।

मुझे आशा है कि इससे मदद मिलेगी।

+0

हे निको, क्या यह दृष्टिकोण हमारी एपीआई धीमा कर सकता है क्योंकि हम एक और अतिरिक्त कॉल कर रहे हैं? – Ajeet

संबंधित मुद्दे