2014-07-18 147 views
1

身份驗證和應用引擎,有很多需要閱讀的內容,但很多內容似乎已經過時!基於Java的Google App Engine,Android和身份驗證oauth2

即使是谷歌的網頁https://developers.google.com/appengine/docs/java/endpoints/consume_android#making-authenticated-calls

在這裏,他們談「GoogleAccountCredential.usingAudience」,但現在,你應該使用GoogleAuthUtil(據我所知,請糾正我,如果我錯了)。

我想設置一個應用程序引擎作爲我的Android應用程序(以及將來,我的iOS應用程序)的後端。

我正在使用Android Studio,使用'新模塊'並選擇了帶有云消息的應用程序引擎。

我創建了一個簡單的端點,並有一個函數在那裏,這裏是一些代碼:

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!"); 

正如你可以看到,這是很好的的Android Studio生成。我實現了一些stuf,比如創建'review'對象並在最後返回它。

在Android方面,我可以這樣做:

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

,是的,我得到 '考驗!' :)

現在,我想要這個認證。我想知道哪個用戶寫了什麼,所以我想我以後會使用GMail帳戶和Facebook。

這裏我卡住了。我能夠從用戶那裏獲取令牌上的Android:

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

那麼你就能夠將此令牌作爲憑證添加到請求:

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

然後在App Engine我試圖讓用戶信息,但如何? 它會作爲'承載者'提供嗎?我如何獲得這個不記名令牌?我應該做API請求來獲取服務器上的數據嗎?

這不起作用:

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

誰能給我一擡頭?

回答

5

因此,最後,今天,我發現如何做到這一點!我以前對這個#2的問題,從來沒有一個答案,但至網站給我的答案:

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

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

第一條顯示需要對應用程序引擎方做了什麼。第二頁將告訴你如何獲得憑證。我非常接近。我不確定是否需要調整第二個鏈接中提到的build.gradle文件。我加入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}) 

然後拿到證書:

// 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); 

你要添加的用戶的電子郵件地址:

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

可以使用賬戶選擇器獲取電子郵件地址(當您按照鏈接時顯示的示例)

和下一個。您使用憑據撥打端點電話,我認爲Play Services會驗證用戶,因爲如果我使用未在設備上登錄的電子郵件,它將無法工作。下面的代碼將拋出一個GoogleAuthIOException:

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

進行測試,我已經把電子郵件地址,我在服務器端作爲審查對象的字符串得到的,並且有它給我的電子郵件地址而不是用戶對象爲空。噢!我忘了告訴你,你需要在應用引擎端的用戶參數。即使您在上面的「getReview」調用中沒有看到「用戶」參數,它也會被App Engine添加。

所以這是我現在getReview的樣子:

@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())); 

希望這會幫助別人

+0

你好@Boy,我使用OAuthService服務= OAuthServiceFactory.getOAuthService();與彈簧security.I已完成相同的步驟,你已經提到,但儘管id_token我傳遞GoogleAccountCredential對象仍然這OAuthService服務= OAuthServiceFactory.getOAuthService(); try { User user = service.getCurrentUser();不工作。請幫忙。 –

+0

對不起,已經差不多3年了,我還沒有進一步研究。我對此不夠熟悉,以幫助您進一步: – Boy