gpt4 book ai didi

android - 使用 Firebase 身份验证进行身份验证后检索 Google 访问 token

转载 作者:IT老高 更新时间:2023-10-28 21:45:50 25 4
gpt4 key购买 nike

我正在尝试检索 Google 访问 token 以访问 Google REST API,例如 YouTube Data API来自经过身份验证的用户(使用 Firebase 身份验证)。

Firebase-UI for Android - Auth 的帮助下,我已成功在我的应用中集成了 Google 登录图书馆。从 FirebaseUser.getToken() 方法检索到的 token 不是 REST API 的有效 Google 访问 token 。

user.getToken(true).addOnCompleteListener(new OnCompleteListener<GetTokenResult>() {
public void onComplete(@NonNull Task<GetTokenResult> task) {
if (task.isSuccessful()) {
String token = task.getResult().getToken();
// 'token' is not a Google Access Token
}
}
});

Google Sign-In for Web guide ,可以通过调用var token = result.credential.accessToken;获取访问 token ,但是我在Android中找不到类似的方法。

任何输入?如果我没有提供足够的信息,请在此处发表评论。谢谢你:)

最佳答案

您的操作方式将为您提供 firebase id token ,请参阅 here .


您会在 firebase 中遇到三种类型的 token :

  • Firebase ID token

    由 Firebase 在用户登录 Firebase 应用时创建。这些 token 是经过签名的 JWT,可以安全地识别 Firebase 项目中的用户。这些 token 包含用户的基本个人资料信息,包括用户的 ID 字符串,这是 Firebase 项目独有的。因为可以验证 ID token 的完整性,您可以将它们发送到后端服务器以识别当前登录的用户。

  • 身份提供者 token

    由联合身份提供商(例如 Google 和 Facebook)创建。这些 token 可以有不同的格式,但通常是 OAuth 2.0 访问 token 。 Firebase 应用使用这些 token 来验证用户是否已成功通过身份提供者进行身份验证,然后将其转换为 Firebase 服务可用的凭据。

  • Firebase 自定义 token

    由您的自定义身份验证系统创建,允许用户使用您的身份验证系统登录 Firebase 应用。自定义 token 是使用服务帐户的私钥签名的 JWT。 Firebase 应用使用这些 token 的方式与使用联合身份提供商返回的 token 非常相似。


现在,你得到的是 firebase Id token ,你需要的是身份提供者 token 。

获取身份提供者 token 很简单,它只是您显示的步骤的前一步。

所以,提到了我们使用 firebase 登录 google 的方式 here .

我将在下面添加在 UI 中显示一个按钮的完整代码,点击该按钮后,用户将登录到 Google 帐户。然后我将获取 google 访问 token ,然后将其发送到 firebase,然后将其转换为 firebase token ID。

我想你已经配置了安卓应用进行谷歌登录,如果没有,你可以详细了解 here .


(简而言之,如果您已经完成设置,请查看下面的第 5 步。)
代码:

  1. 配置 Google SignIn 和 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();
  2. 将 Google 登录按钮添加到您的应用中

    <com.google.android.gms.common.SignInButton
    android:id="@+id/sign_in_button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />
  3. 设置登录点击监听器

    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);
    }
    });
  4. 在 Activity 中重写 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
    // ...
    }
    }
  5. 使用 Google SignInAccount 进行 Firebase 身份验证

    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();
    }
    }
    });
    }
  6. 最后一步:为 Firebase 验证监听器

    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 步,即在您通过 Firebase 身份验证之前以及在您通过 google 登录身份验证之后。

希望对你有帮助!


更新:

重要的是,在步骤 1 中,您请求 token ID,否则在步骤 5 中,您将获得空 token ID。更多信息见 here .我已更新第 1 步。


更新:

根据讨论,检索到的 token 是 JWT token ,如 here .我们需要的是谷歌访问 token 。下面的代码使用 JWT token 在 OAuth 后端触发并检索此访问 token :

(注意:我用的是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();
}
}
});

这是具有所需访问 token 的输出:

I/onResponse: {
"expires_in": 3600,
"token_type": "Bearer",
"refresh_token": "1\/xz1eb0XU3....nxoALEVQ",
"id_token": "eyJhbGciOiJSUzI1NiIsImtpZCI6IjQxMWY1Ym......yWVsUA",
"access_token": "ya29.bQKKYah-........_tkt980_qAGIo9yeWEG4"
}

希望现在有帮助!

关于android - 使用 Firebase 身份验证进行身份验证后检索 Google 访问 token ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40838154/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com