你这样做会给你firebase id令牌,见here。
有三种类型的标记,你会在火力遇到:
火力地堡ID令牌
的创火力地堡时的火力地堡的应用程序用户的迹象。这些令牌是经过签名的JWT,可以在Firebase项目中安全地识别用户。这些令牌包含用户的基本配置文件信息,包括用户的ID字符串,该字符串对Firebase项目是唯一的。由于可以验证ID令牌的完整性,因此可以将它们发送到后端服务器以标识当前登录的用户。
身份提供令牌
创建者联合身份提供商,如谷歌和Facebook。这些令牌可以具有不同的格式,但通常是OAuth 2.0访问令牌。 Firebase应用使用这些令牌来验证用户是否已成功通过身份提供商身份验证,然后将其转换为Firebase服务可用的凭据。
火力地堡定制令牌
由您自定义的身份验证系统创建允许用户在登录使用身份验证系统火力地堡的应用程序。自定义令牌是使用服务帐户的私钥签名的JWT。 Firebase应用使用这些令牌,就像他们使用联合身份提供商返回的令牌一样。现在
,你越来越是火力ID令牌,你需要的是身份提供令牌。
它很容易获得身份提供商令牌,它只是您显示的步骤之前的一个步骤。
因此,我们使用firebase登录谷歌的方式被提及here。
我会在下面添加完整的代码,在UI中显示一个按钮,点击后会将用户登录到Google帐户。然后,我会得到谷歌的访问令牌,然后将其发送到火力点,在那里它被转换成火力令牌ID。
我假定你已经配置为谷歌Android应用程序登录,如果没有,你可以进入细节here。
(切东西短,只要看看下面的步骤5,如果你已经做了设置好的)
代码:
配置谷歌签到和GoogleApiClient :
// Configure sign-in to request the user's ID, email address, and basic
// profile. ID and basic profile are included in DEFAULT_SIGN_IN.
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestIdToken(getString(R.string.default_web_client_id))
.requestEmail()
.build();
// NOTE :
// The string passed to requestIdToken, default_web_client_id,
// can be obtained from credentials page (https://console.developers.google.com/apis/credentials).
// There mentioned Web application type client ID is this string.
// ...
// Build a GoogleApiClient with access to the Google Sign-In API and the
// options specified by gso.
mGoogleApiClient = new GoogleApiClient.Builder(this)
.enableAutoManage(this /* Activity */, this /* OnConnectionFailedListener */)
.addApi(Auth.GOOGLE_SIGN_IN_API, gso)
.build();
添加谷歌登入按钮,您的应用程序
<com.google.android.gms.common.SignInButton
android:id="@+id/sign_in_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
设置签到点击监听器
findViewById(R.id.sign_in_button).setOnClickListener(new OnClickListener() {
public void onClick(View v){
Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient);
startActivityForResult(signInIntent, RC_SIGN_IN);
}
});
覆盖OnActivityResult
方法在活动:
@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 == RC_SIGN_IN) {
// Google Sign In was successful, authenticate with Firebase
GoogleSignInAccount account = result.getSignInAccount();
firebaseAuthWithGoogle(account); // This method is implemented in step 5.
} else {
// Google Sign In failed, update UI appropriately
// ...
}
}
火力地堡认证与谷歌SignInAccount
String idTokenString = "";
...
private void firebaseAuthWithGoogle(GoogleSignInAccount acct) {
Log.d(TAG, "Google User Id :" + acct.getId());
// --------------------------------- //
// BELOW LINE GIVES YOU JSON WEB TOKEN, (USED TO GET ACCESS TOKEN) :
Log.d(TAG, "Google JWT : " + acct.getIdToken());
// --------------------------------- //
// Save this JWT in global String :
idTokenString = acct.getIdToken();
AuthCredential credential = GoogleAuthProvider.getCredential(acct.getIdToken(), null);
mAuth.signInWithCredential(credential)
.addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
Log.d(TAG, "signInWithCredential:onComplete:" + task.isSuccessful());
if(task.isSuccessful()){
// --------------------------------- //
// BELOW LINE GIVES YOU FIREBASE TOKEN ID :
Log.d(TAG, "Firebase User Access Token : " + task.getResult().getToken());
// --------------------------------- //
}
// If sign in fails, display a message to the user. If sign in succeeds
// the auth state listener will be notified and logic to handle the
// signed in user can be handled in the listener.
else {
Log.w(TAG, "signInWithCredential", task.getException());
Toast.makeText(GoogleSignInActivity.this, "Authentication failed.",
Toast.LENGTH_SHORT).show();
}
}
});
}
最后一步:验证听众的火力地堡
private FirebaseAuth mAuth;
private FirebaseAuth.AuthStateListener mAuthListener;
@Override
protected void onCreate(Bundle savedInstanceState) {
// ...
mAuth = FirebaseAuth.getInstance();
mAuthListener = new FirebaseAuth.AuthStateListener() {
@Override
public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
FirebaseUser user = firebaseAuth.getCurrentUser();
if (user != null) {
// User is signed in
Log.d(TAG, "onAuthStateChanged:signed_in:" + user.getUid());
} else {
// User is signed out
Log.d(TAG, "onAuthStateChanged:signed_out");
}
// ...
}
};
// ...
}
//...
@Override
public void onStart() {
super.onStart();
mAuth.addAuthStateListener(mAuthListener);
}
@Override
public void onStop() {
super.onStop();
if (mAuthListener != null) {
mAuth.removeAuthStateListener(mAuthListener);
}
}
所以,你的答案就在第5步,这是就在您通过身份验证之前,以及您身份验证之后在谷歌登录enticated。
希望它能帮助!
UPDATE:
其重要的是在步骤1中,您请求的令牌标识,否则在步骤5中,你会得到空令牌ID。更多信息请参见here。我已经更新了第1步:
UPDATE:
按照讨论中,检索到的令牌是JWT令牌书面here。我们需要的是谷歌访问令牌。下面的代码使用JWT令牌开火OAuth的后端和检索此访问令牌:
(注:我已经使用okhttp 2.6.0版,其他版本可能有不同的方法)
代码:
...
OkHttpClient client = new OkHttpClient();
RequestBody requestBody = new FormEncodingBuilder()
.add("grant_type", "authorization_code")
.add("client_id", "<Your-client-id>") // something like : ...apps.googleusercontent.com
.add("client_secret", "{Your-client-secret}")
.add("redirect_uri","")
.add("code", "4/4-GMMhmHCXhWEzkobqIHGG_EnNYYsAkukHspeYUk9E8") // device code.
.add("id_token", idTokenString) // This is what we received in Step 5, the jwt token.
.build();
final Request request = new Request.Builder()
.url("https://www.googleapis.com/oauth2/v4/token")
.post(requestBody)
.build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(final Request request, final IOException e) {
Log.e(LOG_TAG, e.toString());
}
@Override
public void onResponse(Response response) throws IOException {
try {
JSONObject jsonObject = new JSONObject(response.body().string());
final String message = jsonObject.toString(5);
Log.i(LOG_TAG, message);
} catch (JSONException e) {
e.printStackTrace();
}
}
});
这里是具有访问令牌的输出根据需要:
I/onResponse: {
"expires_in": 3600,
"token_type": "Bearer",
"refresh_token": "1\/xz1eb0XU3....nxoALEVQ",
"id_token": "eyJhbGciOiJSUzI1NiIsImtpZCI6IjQxMWY1Ym......yWVsUA",
"access_token": "ya29.bQKKYah-........_tkt980_qAGIo9yeWEG4"
}
现在希望它有帮助!
你从控制台 –
启用API哪个控制台@KrunalKapadiya?我已启用Google Firebase身份验证控制台 – Wilik
https://console.developers.google.com/apis/dashboard?project=YOUR_PROJECT_ID,启用YouTube Data API v3 –