Token null 登录谷歌账号
Posted
技术标签:
【中文标题】Token null 登录谷歌账号【英文标题】:Token null Sign-in Google Account 【发布时间】:2016-04-13 15:50:41 【问题描述】:我正在按照谷歌的例子来获取令牌但没有成功。 始终无法获取令牌。 这是 Google 在您的页面开发人员上显示的最新方式 我相信错误不在我的代码中
private String CLIENTE_ID = "...apps.googleusercontent.com";
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestIdToken(CLIENTE_ID)
.requestEmail()
.build();
// Build GoogleAPIClient with the Google Sign-In API and the above options.
mGoogleApiClient = new GoogleApiClient.Builder(this)
.enableAutoManage(this /* FragmentActivity */, this /* OnConnectionFailedListener */)
.addApi(Auth.GOOGLE_SIGN_IN_API, gso)
.build();
imgBGoogle.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View v)
Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient);
startActivityForResult(signInIntent, 9002);
);
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data)
super.onActivityResult(requestCode, resultCode, data);
// Result returned from launching the Intent from GoogleSignInApi.getSignInIntent(...);
if (requestCode == 9002)
GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
handleSignInResult(result, data);
if (requestCode == 9002)
// [START get_id_token]
GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
Log.d(TAG, "onActivityResult:GET_TOKEN:success:" + result.getStatus().isSuccess());
if (result.isSuccess())
GoogleSignInAccount acct = result.getSignInAccount();
String idToken = acct.getIdToken();
// Show signed-in UI.
Log.d(TAG, "idToken:" + idToken);
Log.d(TAG, "\n ");
// TODO(user): send token to server and validate server-side
else
// Show signed-out UI.
Log.d(TAG, "idToken: fail");
// [END get_id_token]
private void handleSignInResult(GoogleSignInResult result, Intent data)
getToken1(data);
getToken2(result);
String BOOKS_API_SCOPE = "https://www.googleapis.com/auth/books";
String GPLUS_SCOPE = "https://www.googleapis.com/auth/plus.login";
String mScopes = "oauth2:" + BOOKS_API_SCOPE + " " + GPLUS_SCOPE;
void getToken1(Intent data)
GoogleSignInResult a = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
if (a.isSuccess())
Log.d(TAG, "TOKEN 1: " + a.getSignInAccount().getIdToken());
Log.d(TAG, "DISPLAY NAME 1: " +a.getSignInAccount().getDisplayName());
Log.d(TAG, "ID 1: " + a.getSignInAccount().getId()+"\n ");
else
Log.d(TAG, "ID 1: falhou"+"\n ");
void getToken2(GoogleSignInResult result)
if (result.isSuccess())
GoogleSignInAccount acct = result.getSignInAccount();
Log.d(TAG, "TOKEN 2: " + acct.getIdToken());
Log.d(TAG, "DISPLAY NAME 2: " + acct.getDisplayName());
Log.d(TAG, "ID 2: " + acct.getId()+"\n ");
else
Log.d(TAG, "ID 2: falhou"+"\n ");
如何获得令牌? 谁能帮帮我?
【问题讨论】:
请在***.com/questions/34099208/google-sign-in-idtoken阅读我的回答,看看它是否有帮助 您确定您的应用使用的是 Web 类型的 ID,而不是 android 类型的 ID? [i.stack.imgur.com/6keg0.png] 请检查@BNK 你能帮我解决我的问题吗,我花了几天时间试图解决它......我使用相同的代码,但最后当我从谷歌 api 检索 tokenId 时,我得到一个字符串 tokenId = ... ??如果我尝试验证它 googleapis.com/oauth2/v3/tokeninfo?access_token= 我都会得到 'error_description": "Invalid Value' ...您如何验证您的响应?你是否也得到 String tokenId = ? 【参考方案1】:public class GplusTokenUtils extends AsyncTask<Void, Void, String>
String accessToken = "";
private GoogleSignInAccount account;
public IGetToken iGetTokenListener;
public interface IGetToken
void onGetToken(String token);
public void getTokenLitener(IGetToken tokenListener)
this.iGetTokenListener = tokenListener;
public GplusTokenUtils()
iGetTokenListener = new IGetToken()
@Override
public void onGetToken(String token)
;
private Activity activity;
public void setActivity(Activity activity)
this.activity = activity;
public void setAccount(GoogleSignInAccount account)
this.account = account;
@Override
protected String doInBackground(Void... voids)
try
accessToken = GoogleAuthUtil.getToken(activity, account.getEmail(), "oauth2:profile email");
catch (IOException e)
e.printStackTrace();
catch (GoogleAuthException e)
e.printStackTrace();
return accessToken;
@Override
protected void onPostExecute(String aVoid)
Log.d("GPLUS_TOKEN", aVoid);
iGetTokenListener.onGetToken(aVoid);
别忘了这一点
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestIdToken(getString(R.string.default_web_client_id))
.requestEmail()
.build();
【讨论】:
【参考方案2】:我只是偶然发现了类似的问题,我没有使用 Web OAuth 客户端,它使用 firebase 工作,我认为这个更简单的解决方案可能对某人有所帮助。
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestIdToken(getString(R.string.default_web_client_id))
.requestEmail()
.build();
不需要定义default_web_client_id,它会像粘贴一样工作。它是由 google-services 插件生成的字符串。
【讨论】:
这对我有用(只需添加requestIdToken()
行
也在这里工作过。谢谢。【参考方案3】:
您的代码似乎没问题,但请尽量遵循官方指南。它对我有用: http://android-developers.blogspot.com/2016/03/registering-oauth-clients-for-google.html
确保您使用网络令牌,尝试创建一个新的并使用它。
【讨论】:
你能帮我解决我的问题吗,我花了几天时间试图解决它......我使用相同的代码,但最后当我从谷歌 api 检索 tokenId 时,我得到一个字符串 tokenId = ... ??如果我尝试验证它 googleapis.com/oauth2/v3/tokeninfo?access_token= 我都会得到 'error_description": "Invalid Value' ...您如何验证您的响应?你是否也得到 String tokenId = ? @AlekseyTimoshchenko:你得到了一个 id_token,所以它应该是 oauth2/v3/tokeninfo?id_token=xxx以上是关于Token null 登录谷歌账号的主要内容,如果未能解决你的问题,请参考以下文章