从 Android 客户端向 Google 端点 API 发出授权请求
Make authorized request to Google Endpoint API from Android Client
我需要识别通过 Android 客户端向我的端点 api 发出请求的用户。尽管我能够通过使用 gradle 和 android studio 将我的 Api 和 App 保留在一个项目中来遵循最佳实践。我也可以向我的端点 api 发送请求并在未经授权的情况下接收响应。
基本上我需要在请求中将授权令牌作为 header 发送,人们建议,仅通过在请求中添加 "GoogleAccountCredential" 的实例就可以达到下面代码中的效果。 class,其中存在扩展 android.os.AsyncTask 的以下代码;一直在关注https://cloud.google.com/appengine/docs/java/endpoints/consume_android#using_the_account_picker,但是代码片段不是很清楚
@Override
protected String doInBackground(Pair<Context, String>... params) {
..
MyApi.Builder builder = new MyApi.Builder(AndroidHttp.newCompatibleTransport(), new AndroidJsonFactory(), credential).setRootUrl("https://myapp.appspot.com/_ah/api/");
..
我有:
- 我有一个 Activity 叫做 ExpandedListViewActivity
- 另一个是 ExpandedListAdaptor,它动态填充视图(表单)。
我的Objective
当用户点击提交时出现在表单中。
Android 应该能够找到 google 帐户及其凭据并将其附加到请求中。
如果没有找到然后显示帐户select或查看,这样用户就可以select帐户,如果我们可以在没有用户同意的情况下默默地做这将是非常不错
我拥有的额外方法:
class EndpointsAsyncTask extends AsyncTask, Void,
String>
void chooseAccount() {
mActivity.startActivityForResult(credential.newChooseAccountIntent(),
REQUEST_ACCOUNT_PICKER);
}
protected String fetchToken() throws IOException {
try {
return GoogleAuthUtil.getToken(mActivity, mEmail, mScope);
} catch (UserRecoverableAuthException userRecoverableException) {
// GooglePlayServices.apk is either old, disabled, or not present
// so we need to show the user some UI in the activity to recover.
userRecoverableException.printStackTrace();
} catch (GoogleAuthException fatalException) {
// Some other type of unrecoverable exception has occurred.
// Report and log the error as appropriate for your app.
}
return null;
}
public void getSettings(){
Log.d(APP, "get Settings ");
settings = mActivity.getSharedPreferences("Api", 0);
credential = GoogleAccountCredential.usingAudience(mActivity,
"server:client_id:Android-clientId.apps.googleusercontent.com");
setSelectedAccountName(settings.getString(PREF_ACCOUNT_NAME, null));
}
// setSelectedAccountName definition
private void setSelectedAccountName(String accountName) {
SharedPreferences.Editor editor = settings.edit();
editor.putString(PREF_ACCOUNT_NAME, accountName);
editor.commit();
credential.setSelectedAccountName(accountName);
this.accountName = accountName;
}
请注意我的端点服务器端已正确配置并且 运行。
应该是直截了当的,但我无法解决这个问题,请指出错误或告诉我解决这个问题的方向..
感谢阅读。
沙山克
这解决了我的问题。
http://android-developers.blogspot.in/2013/01/verifying-back-end-calls-from-android.html
https://cloud.google.com/appengine/docs/java/endpoints/auth
- 指定授权向您的 API 后端发出请求的应用程序的客户端 ID (clientIds)。
- 为所有公开的方法添加一个 User 参数以受授权保护。
- 为任何 Android 个客户再次生成客户端库
- 重新部署你的后端 API。 <-- 这是解决这个问题的关键。
谢谢,
沙山克
我需要识别通过 Android 客户端向我的端点 api 发出请求的用户。尽管我能够通过使用 gradle 和 android studio 将我的 Api 和 App 保留在一个项目中来遵循最佳实践。我也可以向我的端点 api 发送请求并在未经授权的情况下接收响应。
基本上我需要在请求中将授权令牌作为 header 发送,人们建议,仅通过在请求中添加 "GoogleAccountCredential" 的实例就可以达到下面代码中的效果。 class,其中存在扩展 android.os.AsyncTask 的以下代码;一直在关注https://cloud.google.com/appengine/docs/java/endpoints/consume_android#using_the_account_picker,但是代码片段不是很清楚
@Override
protected String doInBackground(Pair<Context, String>... params) {
..
MyApi.Builder builder = new MyApi.Builder(AndroidHttp.newCompatibleTransport(), new AndroidJsonFactory(), credential).setRootUrl("https://myapp.appspot.com/_ah/api/");
..
我有:
- 我有一个 Activity 叫做 ExpandedListViewActivity
- 另一个是 ExpandedListAdaptor,它动态填充视图(表单)。
我的Objective
当用户点击提交时出现在表单中。
Android 应该能够找到 google 帐户及其凭据并将其附加到请求中。
如果没有找到然后显示帐户select或查看,这样用户就可以select帐户,如果我们可以在没有用户同意的情况下默默地做这将是非常不错
我拥有的额外方法:
class EndpointsAsyncTask extends AsyncTask, Void, String>
void chooseAccount() {
mActivity.startActivityForResult(credential.newChooseAccountIntent(),
REQUEST_ACCOUNT_PICKER);
}
protected String fetchToken() throws IOException {
try {
return GoogleAuthUtil.getToken(mActivity, mEmail, mScope);
} catch (UserRecoverableAuthException userRecoverableException) {
// GooglePlayServices.apk is either old, disabled, or not present
// so we need to show the user some UI in the activity to recover.
userRecoverableException.printStackTrace();
} catch (GoogleAuthException fatalException) {
// Some other type of unrecoverable exception has occurred.
// Report and log the error as appropriate for your app.
}
return null;
}
public void getSettings(){
Log.d(APP, "get Settings ");
settings = mActivity.getSharedPreferences("Api", 0);
credential = GoogleAccountCredential.usingAudience(mActivity,
"server:client_id:Android-clientId.apps.googleusercontent.com");
setSelectedAccountName(settings.getString(PREF_ACCOUNT_NAME, null));
}
// setSelectedAccountName definition
private void setSelectedAccountName(String accountName) {
SharedPreferences.Editor editor = settings.edit();
editor.putString(PREF_ACCOUNT_NAME, accountName);
editor.commit();
credential.setSelectedAccountName(accountName);
this.accountName = accountName;
}
请注意我的端点服务器端已正确配置并且 运行。 应该是直截了当的,但我无法解决这个问题,请指出错误或告诉我解决这个问题的方向..
感谢阅读。 沙山克
这解决了我的问题。
http://android-developers.blogspot.in/2013/01/verifying-back-end-calls-from-android.html
https://cloud.google.com/appengine/docs/java/endpoints/auth
- 指定授权向您的 API 后端发出请求的应用程序的客户端 ID (clientIds)。
- 为所有公开的方法添加一个 User 参数以受授权保护。
- 为任何 Android 个客户再次生成客户端库
- 重新部署你的后端 API。 <-- 这是解决这个问题的关键。
谢谢, 沙山克