我正在构建一个使用Google Cloud Speech的应用 .
我的应用中有一个Google服务帐户密钥,我用它来调用API .
它在一个用户使用时效果很好,但在多个用户同时使用它时不起作用 .
例如,只有一个用户可用或全部不可用 .
服务帐户密钥的权限是项目所有者 .
我认为这是服务帐户的关键问题......如何解决?
private class AccessTokenTask extends AsyncTask<Void, Void, AccessToken> {
@Override
protected AccessToken doInBackground(Void... voids) {
final SharedPreferences prefs = mContext.getSharedPreferences(PREFS, Context.MODE_PRIVATE);
String tokenValue = prefs.getString(PREF_ACCESS_TOKEN_VALUE, null);
long expirationTime = prefs.getLong(PREF_ACCESS_TOKEN_EXPIRATION_TIME, -1);
// Check if the current token is still valid for a while
if (tokenValue != null && expirationTime > 0) {
if (expirationTime > System.currentTimeMillis() + ACCESS_TOKEN_EXPIRATION_TOLERANCE) {
return new AccessToken(tokenValue, new Date(expirationTime));
}
}
final InputStream stream = mContext.getResources().openRawResource(R.raw.credential);
try {
final GoogleCredentials credentials = GoogleCredentials.fromStream(stream).createScoped(SCOPE);
final AccessToken token = credentials.refreshAccessToken();
prefs.edit()
.putString(PREF_ACCESS_TOKEN_VALUE, token.getTokenValue())
.putLong(PREF_ACCESS_TOKEN_EXPIRATION_TIME, token.getExpirationTime().getTime())
.apply();
return token;
} catch (IOException e) {
Log.e(TAG, "Failed to obtain access token.", e);
}
return null;
}
@Override
protected void onPostExecute(AccessToken accessToken) {
mAccessTokenTask = null;
final ManagedChannel channel = new OkHttpChannelProvider()
.builderForAddress(GOOGLE_API_HOSTNAME, GOOGLE_API_PORT)
.nameResolverFactory(new DnsNameResolverProvider())
.intercept(new GoogleCredentialsInterceptor(new GoogleCredentials(accessToken)
.createScoped(SCOPE)))
.build();
mApi = SpeechGrpc.newStub(channel);
// Schedule access token refresh before it expires
if (mHandler != null) {
mHandler.postDelayed(mFetchAccessTokenRunnable,
Math.max(accessToken.getExpirationTime().getTime() - System.currentTimeMillis() - ACCESS_TOKEN_FETCH_MARGIN, ACCESS_TOKEN_EXPIRATION_TOLERANCE));
}
}
}
此代码是在Android上调用“credential.json”文件并获取“访问令牌”的代码 .
这个应用程序的服务器是python并通过http进行通信 .
https://github.com/GoogleCloudPlatform/android-docs-samples/tree/master/speech/Speech
上面链接中的描述告诉您将身份验证委派给服务器 .
我想用python代码编写那部分 . 我该怎么办?
1 回答
在您在说明中提供的链接中,他们建议您先阅读basic authentication concepts document . 在您的情况下,请使用Android应用程序的服务帐户 .
我了解您已经能够provide end user credentials使用Google Cloud Platform API,例如Cloud Speech API .
如果要对应用程序的多个用户进行身份验证,则应使用Firebase authentication . 该链接包含简要说明和教程 .
您可以使用several Python client libraries for GCP,具体取决于您要在服务器上执行的操作 . 关于服务器端的Python身份验证,this documentation显示了Google Cloud 存储的身份验证的工作原理(将此示例作为参考) .