2013-10-01 17 views
12

私のアプリはOauthed Cloud Endpointsを使用しています。devserverでOauthを使用してCloud Endpointsをテストするには

私の問題は、私はいつもの認証、アクセスコード、などなどなどを経て、有効なauthedを持っていたにも関わらず、ローカルdevserverに、私のユーザー、ユーザーが常に[email protected]に設定されていることですユーザー。

oauthが正常に動作する前に、[email protected]がoauthエンドポイントをテストするのに便利ですが、私のアプリが動作しているので実際にそこに実際のユーザーがいると思います。

は、具体的には、私の終点方法が展開

@ApiMethod(name = "insertEmp"), etc 
public Emp insertEmp(User user, Emp emp) { 
     System.out.println(user.getEmail()); // (A) log "appengine" email 
     System.out.println(OAuthServiceFactory.getOAuthService().getCurrentUser().getEmail(); // (B) log authed email 

     ... 

で、すべてがうまくされ、両方の(A)と(B)が認証されたユーザを記録([email protected])。

Oauthシーケンスを経て有効な認証済みユーザがあっても、(A)は常に "[email protected]"をログに記録し、(B)はmy.email @ gmail.com。だから私は、ハイファイテストを行うことができます、私は本当の認証されたユーザーである必要があります。

簡単に言えば、(A)と(B)を同じにするにはどうすればよいですか?

答えて

3

ようですが、それが出来ないようです。私は、Endpointメソッドの最上部に次のコードを記述することで、コーディングを終了しました。

if ("[email protected]".equalsIgnoreCase(user.getEmail()) { 
    user = new User(OAuthServiceFactory.getOAuthService().getCurrentUser().getEmail(),"foo"); 
} 

これで、devserverでも、UserメールはOauthメールと一致します。

+3

私のためには機能しません... appengine 1.9.3を使用してメールは同じように続きます:[email protected] –

+1

本当のメールを受け取ることはできますか?私はユーザーとしてnullを返すようになり、OAuthServiceFactory.getOa ..()。getCurrentUser()を呼び出すと[email protected]が得られます – Patrick

+0

ここにも同じです。エンドポイントとOAuthServiceFactory.getOAuthService()から返されたユーザーの[email protected]を取得します。getCurrentUser() – Patrick

1

これはあまり簡単ではありません。 APIコンソールで設定を行う必要があります。ここで "localhost"(http://localhost/)を追加できるようになります。開発のためにローカルホスト上でアプリケーションを実行していても、Googleを通じて認証できます。 私はそれを広範囲に使用しており、正常に動作しています。 リンク:https://code.google.com/apis/console/ ここで使用しているIDは、appengine IDから完全に独立していることを覚えておいてください。 それを理解するのに数時間かかりました。

+2

を使用して入力に使用しますありがとう、しかしこれは私の質問に対する答えではありません。私はすでにローカルコンソールをAPIコンソールに設定していますが、Oauth *は機能しています。私の質問は、Oauthが働いていても、Cloud Endpointsはそれを無視し、[email protected]を認証済みのユーザーに置き換えます。 – pinoyyid

+1

@pinoyyid:Googleはそのドキュメントでこれについて説明しています。重要:バックエンドAPIがAuth-protectedの場合、クライアントはOAuth 2.0による認証サポートの追加で説明したようにサポートを提供する必要がありますが、ローカルのdevサーバに対して実行している場合、ユーザのログイン試行に応じてクレデンシャルページは表示されません。保護されたAPIへのユーザーアクセス、返されるユーザーは常に「[email protected]」です(https://cloud.google.com/appengine/docs/java/endpoints/consume_android#making_authenticated_calls – maya

0

ローカルで認証を行っているときは、Googleサーバーで認証していないので、ユーザーを認証することは実際にローカルでは起こっていないことです。

Googleは、ログインをシミュレートしようとすると、常に[email protected]のユーザーを提供します。これは基本的にすべてのサービスで発生します。たとえば、任意のWebサイトでGoogleアカウントからログインした場合GWTとApp Engine)。

実際のユーザーでテストした場合、または[email protected]のユーザーを自分のユーザーと見なすと、サイトによって異なる可能性がありますか?あなたはこの

ApiMethod (name="YourEndPointName", path="yourPath", 
      clientIds={"YourId.apps.googleusercontent.com"}, 
        scopes = { "https://www.googleapis.com/auth/userinfo.profile" }) 

が次に呼び出されるメソッドでは、あなたがGAPIからユーザーオブジェクトを持つことになります必要なエンドポイントAPIで

+1

)。 am **はGoogleサーバーを経由しています。サーブレットからoauthエンドポイントを呼び出すと、正規の認証済Googleユーザーが取得されます。問題は、devserverのappengine/endpointコードがそれを無視していることです。私は未知からユーザーを奪うオンボーディングプロセスをテストしたいのでハイファイテストを行うことはできません。Google APIにアクセスできるストアドクレデンシャルを持つことになります。これは実際のユーザーの代わりに、私のCEエンドポイントクラスが偽のユーザーに提示されているため、邪魔になります。 – pinoyyid

+0

私は、不一致をより詳細に示すために質問を更新しました。 – pinoyyid

0

。 使用このGoogleユーザーオブジェクトから実際の電子メールを取得するには、この

public myEndPointMethod(Foo foo, User user){ 
    email = user.getEmail(); 
} 
+0

質問をお読みください。私はすでにそれを持っている!問題は、user.getEmail()によって返される値です。 – pinoyyid

+0

さらに、userionfo.profileにはユーザーの電子メールが含まれていないため、スコープはhttps://developers.google.com/+/api/oauth#profileに宣言されているように「電子メール」する必要があります。したがって、userパラメータはnullになります。 +あなたが言及したスコープは廃止されました。 – Pega88

+0

「YourId」とは何ですか?私はmyapp-xxxx.appspot.comを持っています - 私は近くになっていると感じていますが、多少固まってしまいました –

0

私はOauth2ユーザーを置き換えました(example @ example。com)UserFactoryからユーザーとそれは正常に動作します。このメソッドを使用して、すべてのAPI認証済みAPIリクエストのユーザーを検証します。

public static User isAuthenticated(User user) throws OAuthRequestException{ 

    if(user == null){ 
     throw new OAuthRequestException("Please login before making requests"); 
    } 
    if(SystemProperty.environment.value() == 
      SystemProperty.Environment.Value.Development && "[email protected]".equalsIgnoreCase(user.getEmail())) { 

     //Replace the user from the user factory here. 
     user = UserServiceFactory.getUserService().getCurrentUser(); 

    } 
    return user; 

} 
+0

これは動作しません。私はUserServiceFactory.getUserService()からnullを取得します。OAuthServiceFactory.getUserService()からgetCurrentUser()と[email protected] – Patrick

-1

これはできません。 私は現在のセッションでuser_idを置き換えるために別のエンドポイントを使用します。

0

私はdevのサーバーおよび生産の両方で機能しているユーザーを取得するために、この機能に頼っている行くランタイムを使用する:

func currentUser(c context.Context) *user.User { 
    const scope = "https://www.googleapis.com/auth/userinfo.email" 
    const devClient = "123456789.apps.googleusercontent.com" 

    allowedClients := map[string]bool{ 
     "client-id-here.apps.googleusercontent.com": true, 
     devClient: true,    // dev server 
    } 

    usr, err := user.CurrentOAuth(c, scope) 
    if err != nil { 
     log.Printf("Warning: Could not get current user: %s", err) 
     return nil 
    } 

    if !allowedClients[usr.ClientID] { 
     log.Printf("Warning: Unauthorized client connecting with the server: %s", usr.ClientID) 
     return nil 
    } 

    if (usr.ClientID == devClient) { 
     usr = user.Current(c)   // replace with a more interesting user for dev server 
    } 
    return usr 
} 

これは、devのサーバーのログイン情報がhttp://localhost:8080/_ah/login

関連する問題