Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

User is null in the Google Cloud Api

I followed the instructions in this tutorial.

https://developers.google.com/appengine/docs/java/endpoints/getstarted/auth

when i deployed my code. and went to test my app.

with the following url

http://chandru-compute.appspot.com/_ah/api/explorer

My helloworld.greetings.multiply and helloworld.greetings.getGreeting works as expected.

But i have issues with the helloworld.greetings.authed method.

The user object is always null.

Here is the code.

package com.google.devrel.samples.helloendpoints;

import com.google.api.server.spi.config.Api;
import com.google.api.server.spi.config.ApiMethod;
import com.google.appengine.api.users.User;
import com.google.appengine.api.users.UserService;
import com.google.appengine.api.users.UserServiceFactory;
import javax.inject.Named;
import java.util.ArrayList;
/**
 * Defines v1 of a helloworld API, which provides simple "greeting" methods.
 */
@Api(
    name = "helloworld",
    version = "v1",
    clientIds = {com.google.api.server.spi.Constant.API_EXPLORER_CLIENT_ID}
)
public class Greetings {
  public static ArrayList<Greeting> greetings = new ArrayList<Greeting>();
  static {
    greetings.add(new Greeting("hello world!"));
    greetings.add(new Greeting("goodbye world!"));
  }

  public Greeting getGreeting(@Named("id") Integer id) {
    return greetings.get(id);
  }

   @ApiMethod(name = "greetings.multiply", httpMethod = "post")
   public Greeting insertGreeting(@Named("times") Integer times, Greeting greeting) {
     Greeting response = new Greeting();
     StringBuilder responseBuilder = new StringBuilder();
     for (int i = 0; i < times; i++) {
     responseBuilder.append(greeting.getMessage());
    }
    response.setMessage(responseBuilder.toString());
    return response;
  }

 @ApiMethod(name = "greetings.authed", path = "greeting/authed")
 public Greeting authedGreeting(User user) {
   //Greeting response = new Greeting("hello " + user.getEmail());
  Greeting response;
   if (user == null) {
       UserService userService = UserServiceFactory.getUserService();
       User user2 = userService.getCurrentUser();
       String text = null;
       if (user2 != null){
           text = user2.getEmail();
       }
       response = new Greeting("hello world : Email2" + text );
   } else {
       response = new Greeting("hello world : Email " + user.getEmail() );
   }
   return response;
 }

}
like image 397
Chandrashekar Vijayarenu Avatar asked Aug 11 '13 06:08

Chandrashekar Vijayarenu


2 Answers

I had same problem, it helped for me to add

scopes = {"https://www.googleapis.com/auth/userinfo.email"}

into my Greetings @Api annotation. So the whole final @Apilook like

@Api(
 name = "helloworld", 
 version = "v1", 
 clientIds = { com.google.api.server.spi.Constant.API_EXPLORER_CLIENT_ID }, 
 scopes = {"https://www.googleapis.com/auth/userinfo.email"}
)

Then deploy, reload Api Explorer page and also turn on "Authorize requests using OAuth 2.0" option with same scope.

like image 51
Jan Zdrha Avatar answered Oct 18 '22 08:10

Jan Zdrha


I am getting the same problem. And if you throw an OAuthRequestException Exception and test the service via the API Explorer console, you will get a message saying This method requires you to be authenticated. You may need to activate the toggle above to authorize your request using OAuth 2.0. When you try to enable the OAuth 2.0 toggle it requests in a new window to Select OAuth 2.0 scopes, and I have not been able to find which scopes are needed or figure out how I can test a cloud end-point service with authorization from the API Explorer console.

like image 24
Sca09 Avatar answered Oct 18 '22 07:10

Sca09