2016-05-24 12 views
0

Googleのクライアントサイドアプリは、以前はGoogle Sign-Inを使用していました。カスタム認証ツールを使用しているときにAppEngineエンドポイントのクライアントIDを検証する

Googleアカウントの代わりにユーザーの電話番号を唯一のIDとして使用する予定であるため、カスタム認証に移行します。しかし、カスタムオーセンティケータを実装した後、クライアントIDはチェックされず、どこからでもAPIコールを行うことができます。

クライアント側でGoogleログインのみが使用されていた場合、クライアントIDが検証されていて、認証されていないクライアントからAPI呼び出しを行うことができませんでした。

カスタムオーセンティケータの使用中にクライアントIDを確認するにはどうすればよいですか?

カスタム認証用

@Api(name = "apiSubscriber", 
     clientIds = { 
     Constants.webClientId, 
     Constants.androidClientId, 
     Constants.iOSClientId 
     }, 

     authenticators = {com.google.api.server.spi.auth.EndpointsAuthenticator.class, 
     CustomAuth.class}, 
     audiences = {Constants.androidAudience}, 
    ) 

    public class ApiSubscriber { 

      @ApiMethod 
      public Subscriber getSubscriberData(User user){ 

       if(user!=null){ 
       //fetches subscriber data 
       } 

      } 

     //... Other ApiMethods 

    } 

コード

public class CustomAuth implements Authenticator { 


    @Override 
    public User authenticate(HttpServletRequest request) { 

     String phoneNumber = request.getHeader("phoneNumber"); 
     String token = request.getHeader("Authorization"); 

     if(checkToken(phoneNumber,token)){ 
       return new User(phoneNumber); 
     } 

     return null; 
    } 

    private boolean checkToken(String phoneNumber, String token){ 
     //Checks if authorization token is valid 
    } 


} 
+0

認証メソッドをデバッグしましたか?それは呼ばれていますか? – yurin

+0

@yurinはい、authenticateメソッドが呼び出され、期待どおりに動作します。どのクライアントからでも動作しますが、指定されたクライアントからのAPI呼び出しのみを許可します。 – KrisPrajapati

答えて

1

残念ながら現時点では、あなたがクライアントに自分のエンドポイントのAPIを制限することができますようには見えないし、Googleを使用していないアピエンドポイントのコードログインする。

GoogleのoAuth2認証を使用すると、いくつかの魔法のブードーが起こる(正確にはわからない)とアプリがClientIdの仕様に制限されるify。

しかし、その認証方法の使用をやめると、私はそれがもう動作しないことがわかりました(私の親愛なる失望)。

あなたは私のテストし、あなたに多くの情報を与える可能性があり、いくつかの追加のことについて読むことができ、ここで私の質問を参照してください:私はわからないAuthenticating your client to Cloud Endpoints without a Google Account login

0

は、それが問題ですが、あなたは、あなたが提供するコードでいくつかのバグを持っています。

authenticators = {com.google.api.server.spi.auth.EndpointsAuthenticator.class, 
    CustomAuth.class, 

カンマの代わりに角かっこを使用する必要があります。また、imho、ここではCustomAuthクラスのみが必要です。

audiences = {Constants.androidAudience}, 

カンマが冗長です。

秒。カスタムオーセンティケータを使用する必要はありません。トークンと電話番号を連結パラメータまたは2つのパラメータとしてサービスメソッドに送信してチェックすることができます。

+0

紛失した括弧で私の悪い、ここに投稿中に間違って削除している必要があります。また、パラメータはHTTPリクエストでURLエンコードされます(ほとんどのエンドポイントでGETが使用されるため)。オーセンティケータを使用すると、パラメータをヘッダに渡すことができます。いずれにせよ、Google Sign-inで使用されていないときは、クライアントがAPI呼び出しを行うことができ、それで私の質問に答えることはできません。 – KrisPrajapati

+0

最後に、私は質問を理解しています。遅くなりました。 – yurin

+0

私は、Googleのサインインが使用されていても、クライアントからapiが呼び出されていると思います。しかし、そのような場合には、あなたのコードでリクエストを見ることができる前に、許可されていない例外がスローされます。彼らはそれをどのように実装しましたか?私はgapi(またはアンドロイド/ iphoneクライアント)がロードされたときにクライアントIDをサーバーから要求するか、Googleプラグインによって生成されるのでハードコーディングされていると思いますが、とにかくclientIdがあり、リクエストごとにサーバーに送信します。 – yurin

関連する問題