android应用程序中的云端点身份验证失败
我第一次尝试在Google Cloud Endpoints android应用程序的调试模式下使用身份验证时遇到了问题。我设置了如下凭据:android应用程序中的云端点身份验证失败,android,google-cloud-endpoints,Android,Google Cloud Endpoints,我第一次尝试在Google Cloud Endpoints android应用程序的调试模式下使用身份验证时遇到了问题。我设置了如下凭据: credential = GoogleAccountCredential.usingAudience(this, "server:client_id:long-string-i-got-from-api-console"); credential.setSelectedAccountName(accountName); final S
credential = GoogleAccountCredential.usingAudience(this,
"server:client_id:long-string-i-got-from-api-console");
credential.setSelectedAccountName(accountName);
final String LOCAL_APP_ENGINE_SERVER_URL = "http://xxx.xxx.x.xxx:8888";
Testdbendpoint.Builder endpointBuilder = new Testdbendpoint.Builder(
AndroidHttp.newCompatibleTransport(),
new GsonFactory(),
credential);
endpointBuilder.setRootUrl(LOCAL_APP_ENGINE_SERVER_URL + "/_ah/api/");
Testdbendpoint endpoint = endpointBuilder.build();
try {
TestDB testDB = new TestDB().setId(10101L);
TestDB result = endpoint.insertTestDB(testDB).execute(); //-- fails here!!!!
} catch ...
@Api(
name = "testEndpoint",
version = "v1",
clientIds = {ClientIds.WEB_ID, ClientIds.ANDROID_PRODUCTION_ID, ClientIds.ANDROID_DEBUG_ID},
audiences = {ClientIds.WEB_ID}
然后试着像这样使用它:
credential = GoogleAccountCredential.usingAudience(this,
"server:client_id:long-string-i-got-from-api-console");
credential.setSelectedAccountName(accountName);
final String LOCAL_APP_ENGINE_SERVER_URL = "http://xxx.xxx.x.xxx:8888";
Testdbendpoint.Builder endpointBuilder = new Testdbendpoint.Builder(
AndroidHttp.newCompatibleTransport(),
new GsonFactory(),
credential);
endpointBuilder.setRootUrl(LOCAL_APP_ENGINE_SERVER_URL + "/_ah/api/");
Testdbendpoint endpoint = endpointBuilder.build();
try {
TestDB testDB = new TestDB().setId(10101L);
TestDB result = endpoint.insertTestDB(testDB).execute(); //-- fails here!!!!
} catch ...
@Api(
name = "testEndpoint",
version = "v1",
clientIds = {ClientIds.WEB_ID, ClientIds.ANDROID_PRODUCTION_ID, ClientIds.ANDROID_DEBUG_ID},
audiences = {ClientIds.WEB_ID}
但尝试失败,我在logCat中收到以下消息:
03-06 23:33:20.418:W/系统错误(11861):由以下原因引起:
com.google.android.gms.auth.GoogleAuthException:未知03-06
23:33:20.418:W/系统错误(11861):在
com.google.android.gms.auth.GoogleAuthUtil.getToken(未知来源)
03-06 23:33:20.423:W/系统错误(11861):在
com.google.android.gms.auth.GoogleAuthUtil.getToken(未知来源)
03-06 23:33:20.428:W/系统错误(11861):在
com.google.api.client.googleapis.extensions.android.gms.auth.GoogleAccountCredential.getToken(GoogleAccountCredential.java:192)
只是确认一下,但是你是否在谷歌API控制台中注册了客户端ID以及应用程序引擎应用程序ID?谷歌账户是否已添加到设备中 此博客上的说明可能很有用:
希望有帮助 您的Android客户端Id可能有错误的证书指纹(SHA1)?只有在手动签署.apk时,才能使用生产密钥的指纹进行身份验证 使用您的debug.keystore指纹为已安装的应用程序(Android)注册客户端Id。要获取指纹,请使用:
C:\>keytool -list -alias androiddebugkey -keystore C:\.android\debug.keystore -storepass android -keypass android
您还需要一个Web客户端Id,并将其设置为Android应用程序中的访问群体:
credential = GoogleAccountCredential.usingAudience(this,"server:client_id:" + WEB_CLIENT_ID);
AppEngine端点配置应如下所示:
credential = GoogleAccountCredential.usingAudience(this,
"server:client_id:long-string-i-got-from-api-console");
credential.setSelectedAccountName(accountName);
final String LOCAL_APP_ENGINE_SERVER_URL = "http://xxx.xxx.x.xxx:8888";
Testdbendpoint.Builder endpointBuilder = new Testdbendpoint.Builder(
AndroidHttp.newCompatibleTransport(),
new GsonFactory(),
credential);
endpointBuilder.setRootUrl(LOCAL_APP_ENGINE_SERVER_URL + "/_ah/api/");
Testdbendpoint endpoint = endpointBuilder.build();
try {
TestDB testDB = new TestDB().setId(10101L);
TestDB result = endpoint.insertTestDB(testDB).execute(); //-- fails here!!!!
} catch ...
@Api(
name = "testEndpoint",
version = "v1",
clientIds = {ClientIds.WEB_ID, ClientIds.ANDROID_PRODUCTION_ID, ClientIds.ANDROID_DEBUG_ID},
audiences = {ClientIds.WEB_ID}
)我希望这能对你有所帮助
import android.accounts.Account;
import android.app.Activity;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.FragmentActivity;
import com.google.android.gms.auth.GoogleAuthException;
import com.google.android.gms.auth.GoogleAuthUtil;
import com.google.android.gms.auth.api.Auth;
import com.google.android.gms.auth.api.signin.GoogleSignInOptions;
import com.google.android.gms.auth.api.signin.GoogleSignInResult;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.api.GoogleApiClient;
import com.urbanft.utils.AppToast;
import java.io.IOException;
/**
* Created by kiwitech on 13/10/16.
*/
public class GoogleLogin extends FragmentActivity implements GoogleApiClient.OnConnectionFailedListener {
private GoogleSignInOptions gso;
protected GoogleApiClient mGoogleApiClient;
private int RC_SIGN_IN = 100;
public static String GOOGLE_ACCESS_TOKEN = "google_access_token";
public static String GOOGLE_USER_ID = "google_user_id";
private String mGooglesUserId;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initialize();
}
private void initialize(){
gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestEmail()
.build();
mGoogleApiClient = new GoogleApiClient.Builder(this)
.enableAutoManage(this , this)
.addApi(Auth.GOOGLE_SIGN_IN_API, gso)
.build();
}
protected void goForGoogleSignIn(){
Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient);
startActivityForResult(signInIntent, RC_SIGN_IN);
}
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == RC_SIGN_IN) {
GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
if(result.isSuccess()){
AppToast.showToast(this,"Google sign-in success");
mGooglesUserId = result.getSignInAccount().getId();
new LocalAsyncTask(result.getSignInAccount().getEmail()).execute();
}else{
AppToast.showToast(this,"Google sign-in failure");
onBackPressed();
finish();
}
}
}
class LocalAsyncTask extends AsyncTask<String,String,String> {
private String email;
LocalAsyncTask(String email) {
this.email = email;
}
@Override
protected String doInBackground(String... params) {
String token = null;
try {
String SCOPE = "oauth2:https://www.googleapis.com/auth/userinfo.profile";
Account account = new Account(email, "com.google");
token = GoogleAuthUtil.getToken(GoogleLogin.this, account, SCOPE);
} catch (IOException e) {
e.printStackTrace();
} catch (GoogleAuthException e) {
e.printStackTrace();
}
return token;
}
@Override
protected void onPostExecute(String s){
Intent intent =new Intent();
intent.putExtra(GOOGLE_ACCESS_TOKEN,s);
intent.putExtra(GOOGLE_USER_ID,mGooglesUserId);
setResult(Activity.RESULT_OK, intent);
onBackPressed();
finish();
}
}
@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
}
}
导入android.accounts.Account;
导入android.app.Activity;
导入android.content.Intent;
导入android.os.AsyncTask;
导入android.os.Bundle;
导入android.support.annotation.NonNull;
导入android.support.annotation.Nullable;
导入android.support.v4.app.FragmentActivity;
导入com.google.android.gms.auth.GoogleAuthException;
导入com.google.android.gms.auth.GoogleAuthUtil;
导入com.google.android.gms.auth.api.auth;
导入com.google.android.gms.auth.api.signin.GoogleSignInOptions;
导入com.google.android.gms.auth.api.signin.GoogleSignInResult;
导入com.google.android.gms.common.ConnectionResult;
导入com.google.android.gms.common.api.GoogleAppClient;
导入com.urbanft.utils.AppToast;
导入java.io.IOException;
/**
*kiwitech于2016年10月13日创建。
*/
公共类GoogleLogin扩展FragmentActivity实现GoogleAppClient.OnConnectionFailedListener{
谷歌私人签名gso;
受保护的GoogleapClient MGoogleapClient;
私有内部RC_符号=100;
公共静态字符串GOOGLE\u ACCESS\u TOKEN=“GOOGLE\u ACCESS\u TOKEN”;
公共静态字符串GOOGLE\u USER\u ID=“GOOGLE\u USER\u ID”;
私有字符串mGooglesUserId;
@凌驾
创建时受保护的void(@Nullable Bundle savedInstanceState){
super.onCreate(savedInstanceState);
初始化();
}
私有void初始化(){
gso=新建GoogleSignionOptions.Builder(GoogleSignionOptions.DEFAULT\u登录)
.requestEmail()
.build();
mgoogleapclient=新的Googleapclient.Builder(此)
.enableAutoManage(这个,这个)
.addApi(Auth.GOOGLE\u SIGN\u IN\u API,gso)
.build();
}
受保护的无效goForGoogleSignIn(){
意向符号=Auth.googlesignianpi.getsignient(mgoogleapclient);
startActivityForResult(签名、注册);
}
ActivityResult上的公共void(int请求代码、int结果代码、意图数据){
super.onActivityResult(请求代码、结果代码、数据);
if(requestCode==RC\u登录){
GoogleSignInResult结果=Auth.GoogleSignInApi.getSignInResultFromIntent(数据);
if(result.issucess()){
showtoos(这是“谷歌登录成功”);
mGooglesUserId=result.getSignInAccount().getId();
新的LocalAsyncTask(result.getSignInAccount().getEmail()).execute();
}否则{
showtoos(这是“谷歌登录失败”);
onBackPressed();
完成();
}
}
}
类LocalAsyncTask扩展了AsyncTask{
私人字符串电子邮件;
LocalAsyncTask(字符串电子邮件){
this.email=电子邮件;
}
@凌驾
受保护的字符串doInBackground(字符串…参数){
字符串标记=null;
试一试{
String SCOPE=“oauth2:https://www.googleapis.com/auth/userinfo.profile";
账户=新账户(电子邮件,“com.google”);
token=GoogleAuthUtil.getToken(GoogleLogin.this,account,SCOPE);
}捕获(IOE异常){
e、 printStackTrace();
}捕获(googleauthe异常){
e、 printStackTrace();
}
返回令牌;
}
@凌驾
受保护的void onPostExecute(字符串s){
意图=新意图();
intent.putExtra(谷歌访问令牌);
intent.putExtra(谷歌用户ID,mGooglesUserId);
设置结果(Activity.RESULT_OK,intent);
onBackPressed();
完成();
}
}
@凌驾
public void onconnection失败(@NonNull ConnectionResult ConnectionResult){
}
}
您使用的是物理设备而不是模拟器,对吗?谢谢@crazypfan。是的,我已经在API控制台中注册了一个客户端ID和一个应用程序引擎应用程序ID。在您提供的链接和其他来源之间,不清楚后端的cliendID和访问群体以及GoogleAccountCredentials(上下文,访问群体)中的“访问群体”应该使用什么。你能帮我吗?我从API控制台删除了客户端Id,无法使用正确的包名创建新的Android客户端Id。。你能帮我吗@钳子