13

私のアプリは Oauthed Cloud Endpoints を使用しており、本番環境で正常に動作しています。

私の問題は、ローカル devserver では、通常の認証、アクセス コードなどを実行し、有効な認証済みユーザーを持っているにもかかわらず、ユーザー ユーザーが常にexample@example.comに設定されていることです。

example@example.com は、oauth が適切に機能する前に 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) の両方で認証済みユーザー (my.email@gmail.com) がログに記録されます。

ローカル devserver でテストすると、(A) Oauth シーケンスを経て有効な認証済みユーザーがいるにもかかわらず、常に "example@example.com" がログに記録され、(B) my.email@gmail.com がログに記録されます。したがって、忠実度の高いテストを行うことができます。ユーザーが実際の認証済みユーザーである必要があります。

簡単に言えば、どうすれば (A) と (B) を同じにすることができますか?

4

7 に答える 7

2

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

于 2013-10-01T21:26:43.823 に答える
0

go ランタイムを使用して、開発サーバーと本番環境の両方で機能するユーザーを取得するために、この関数に頼りました。

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
}

これは、 http://localhost:8080/_ah/loginを使用して入力された開発サーバーのログイン情報を使用します。

于 2016-02-09T03:06:37.247 に答える
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 && "example@example.com".equalsIgnoreCase(user.getEmail()) ) {

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

    }
    return user;

}
于 2014-08-19T09:08:33.090 に答える
0

エンドポイント API では、これが必要です

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

次に、呼び出されたメソッドで、GAPI からのユーザー オブジェクトを取得します。これを使用して、このように google User オブジェクトから実際のメールを取得します

public myEndPointMethod( Foo foo, User user ){
    email = user.getEmail();
}
于 2013-10-03T19:16:17.637 に答える
-1

不可能です。別のエンドポイントを使用して、現在のセッションの user_id を置き換えます。

于 2015-05-05T12:40:25.500 に答える