2014-07-18 3 views
1

Authentification et moteur d'application, il y a beaucoup à lire à ce sujet, mais beaucoup semble être obsolète!Google App Engine basé sur Java, Android et authentification oauth2

Même les pages google https://developers.google.com/appengine/docs/java/endpoints/consume_android#making-authenticated-calls

Ici, ils parlent de « GoogleAccountCredential.usingAudience », mais de nos jours, vous devez utiliser GoogleAuthUtil (pour autant que je sache, s'il vous plaît me corriger si je me trompe).

J'essaie de configurer un moteur d'application en tant que backend pour mon application Android (et à l'avenir, mon application iOS). J'utilise Android Studio, j'ai utilisé le 'nouveau module' et j'ai choisi le moteur d'application avec la messagerie dans le nuage.

Je créé un point de terminaison simple, et une fonction là, voici un code:

public class ReviewEndpoint { 

// Make sure to add this endpoint to your web.xml file if this is a web application. 

private static final Logger LOG = Logger.getLogger(ReviewEndpoint.class.getName()); 

/** 
* This method gets the <code>Review</code> object associated with the specified   <code>id</code>. 
* @param id The id of the object to be returned. 
* @return The <code>Review</code> associated with <code>id</code>. 
*/ 
@ApiMethod(name = "getReview") 
public Review getReview(@Named("id") Long id) { 
    // Implement this function 
    Review r = new Review(); 
    r.setData("test!"); 

Comme vous pouvez le voir, cela est bien généré par Android Studio. J'ai implémenté un peu de stuf comme créer l'objet 'review' et le retourner à la fin.

Du côté Android, je peux le faire:

ReviewEndpoint.Builder b = new ReviewEndpoint.Builder(AndroidHttp.newCompatibleTransport(), new AndroidJsonFactory(), null); 
ReviewEndpoint ep = b.build(); 
Review review = ep.getReview(1L).execute(); 
data = review.getData(); 

et oui, je reçois "test! :)

Maintenant, je veux l'avoir authentifié. Je veux savoir quel utilisateur a écrit quoi, alors j'ai pensé que je vais utiliser le compte GMail et Facebook plus tard.

Ici, je suis bloqué. Je suis en mesure d'obtenir un jeton de l'utilisateur sur Android:

token = GoogleAuthUtil.getToken(MainScreenActivity.this, mAccount.name, "oauth2:https://www.googleapis.com/auth/plus.me https://www.googleapis.com/auth/userinfo.profile"); 

alors vous pouvez ajouter ce jeton comme des titres de compétence à la demande:

Credential cr = new Credential(BearerToken.authorizationHeaderAccessMethod()).setAccessToken(token); 
ReviewEndpoint.Builder b = new ReviewEndpoint.Builder(AndroidHttp.newCompatibleTransport(), new AndroidJsonFactory(), cr); 

ensuite dans le moteur app j'ai essayé de l'info de l'utilisateur, mais comment? Sera-t-il fourni en tant que «porteur»? Comment puis-je obtenir ce jeton de porteur? Devrais-je alors faire une requête API pour obtenir les données sur le serveur?

cela ne fonctionne pas:

OAuthService service = OAuthServiceFactory.getOAuthService(); 
try { 
    User user = service.getCurrentUser(); 

quelqu'un peut me donner une tête?

Répondre

5

Donc finalement, aujourd'hui, j'ai découvert comment le faire! J'avais des questions sur Stackoverflow à ce sujet avant et n'a jamais eu une réponse, mais ceux-ci à des sites m'a donné la réponse:

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

https://developers.google.com/appengine/docs/java/endpoints/consume_android

La première montre ce qui doit être fait sur le côté moteur app . La deuxième page vous dira comment obtenir les informations d'identification. J'étais assez proche. Je ne suis pas sûr si l'ajustement du fichier build.gradle mentionné dans le deuxième lien est nécessaire.Ce que j'ajouté à App Engine:

@Api(name = "reviewEndpoint", version = "v1", ...<<some more stuff here >> 
    scopes = {Constants.EMAIL_SCOPE}, 
    clientIds = {Constants.WEB_CLIENT_ID, Constants.ANDROID_CLIENT_ID}, 
    audiences = {Constants.ANDROID_AUDIENCE}) 

puis obtenir les informations d'identification:

// Initialize the scope using the client ID you got from the Console. 
final String scope = "server:client_id:" + Constants.WEB_CLIENT_ID; 

credential = GoogleAccountCredential.usingAudience(activity,scope); 

Vous devez ajouter l'adresse e-mail de l'utilisateur:

credential.setSelectedAccountName("[email protected]"); 

vous pouvez obtenir l'adresse e-mail en utilisant le sélecteur de compte (également l'exemple montré lorsque vous suivez le lien)

et suivant. si vous appelez le point de terminaison en utilisant les informations d'identification, je pense que Play Services validera l'utilisateur, car si j'utilise un courrier électronique qui n'est pas connecté sur le périphérique, cela ne fonctionnera pas. Le code suivant lancera une GoogleAuthIOException:

ReviewEndpoint.Builder b = new ReviewEndpoint.Builder(
    AndroidHttp.newCompatibleTransport(), 
    new AndroidJsonFactory(), id_token); 
ReviewEndpoint ep = b.build(); 
Review review; 
review = ep.getReview(1L).execute(); 

pour les tests, j'ai mis l'adresse e-mail que je reçois sur le côté serveur comme une chaîne dans l'objet d'examen, et il m'a donné l'e-mail adresse au lieu de l'objet utilisateur étant null. Ow! J'ai oublié de vous dire, vous avez besoin d'un argument utilisateur du côté de l'application. Même si vous ne voyez pas l'argument 'user' dans l'appel 'getReview' ci-dessus, il sera ajouté par App Engine.

Voilà donc comment mon getReview ressemble maintenant:

@ApiMethod(name = "getReview") 
public Review getReview(@Named("id") Long id, User user) { 
    // Implement this function 
    Review r = new Review(); 

    r.setData("user == " + (user == null ? "NULL " : user.toString())); 

Espérons que cela aidera quelqu'un

+0

Bonjour @Boy, je suis en utilisant le service de OAuthService = OAuthServiceFactory.getOAuthService(); avec la sécurité de printemps.J'ai fait les mêmes étapes que vous avez mentionnées mais malgré l'id_token Je passe GoogleAccountCredential Object toujours ce service OAuthService = OAuthServiceFactory.getOAuthService(); try { Utilisateur utilisateur = service.getCurrentUser(); ne fonctionne pas. S'il vous plaît aider. –

+0

Je suis désolé, ça fait presque 3 ans et je n'ai pas encore travaillé dessus. Je ne suis pas assez familier avec ceci pour vous aider plus loin :( – Boy