cra*_*ool 15 android oauth-2.0 firebase firebase-authentication firebase-realtime-database
我目前正在使用Firebase实时数据库开发应用程序,但是我选择省略使用SDK从数据库中检索数据.原因是我不希望我的代码与FireBase紧密相关,因为一旦应用程序构建,api本身将转移到基于自定义休息的api.
我根据文档使用REST和Firebase实现了api调用,没有问题 - POST,GET,DELETE等.
我遇到的问题是,如果我在数据库上启用任何类型的身份验证,根据我需要发送带有请求的"access_token"的文档,但是我不知道从哪里检索它. firebaseUser.getToken(true)返回看起来像JWT令牌的内容,如果我将其发送为无法识别"access_token".我明白了401 Unauthorized
我还按照说明设置了一个服务帐户,该帐户似乎生成了一个有效的令牌,但它并没有唯一地标识用户.
所以我的问题是,任何人都可以指出我如何获得所需的访问令牌,以识别哪个用户正在访问该API?我的Firebase项目支持的登录选项是Google,Facebook和Twitter.
如果您要从每种不同的身份验证模式中查找不同的令牌或ID,则应为每个身份验证模式实现差异API:
要检索访问令牌,您需要使用服务帐户.请参阅使用Google服务帐户的指南.您可以从Firebase控制台的"服务帐户"部分在Firebase项目中创建服务帐户凭据.
例如,生成适当的oauth2令牌的一种方法是使用Java google-api-client.
GoogleCredential googleCred = GoogleCredential.fromStream(new FileInputStream("service_account.json"));
GoogleCredential scoped = googleCred.createScoped(
Arrays.asList(
"https://www.googleapis.com/auth/firebase.database",
"https://www.googleapis.com/auth/userinfo.email"
)
);
scoped.refreshToken();
String token = scoped.getAccessToken();
Run Code Online (Sandbox Code Playgroud)
成功的请求将由200 OKHTTP状态代码指示.响应包含要检索的数据:
{ "first": "Jack", "last": "Sparrow" }
Run Code Online (Sandbox Code Playgroud)
数据库REST API接受access_token=<TOKEN>查询字符串或标头Authorization: Bearer <TOKEN>,以使用服务帐户验证请求.
以下示例演示了如何在包含用户名的数据库中使用它.您将替换[PROJECT_ID]为Firebase项目的标识符.
您应该添加Facebook SDK到您的应用程序并实现一个LoginButton和LoginManager要求提供一些信息的项目作为public_profile一封电子邮件.与之合作非常烦人Facebook SDK.有关如何添加它的示例代码如下:
// Initialize Facebook Login button
mCallbackManager = CallbackManager.Factory.create();
LoginButton loginButton = (LoginButton) findViewById(R.id.button_facebook_login);
loginButton.setReadPermissions("email", "public_profile");
loginButton.registerCallback(mCallbackManager, new FacebookCallback<LoginResult>() {
@Override
public void onSuccess(LoginResult loginResult) {
Log.d(TAG, "facebook:onSuccess:" + loginResult);
handleFacebookAccessToken(loginResult.getAccessToken());
}
@Override
public void onCancel() {
Log.d(TAG, "facebook:onCancel");
// ...
}
@Override
public void onError(FacebookException error) {
Log.d(TAG, "facebook:onError", error);
// ...
}
});
Run Code Online (Sandbox Code Playgroud)
此外,在Facebook 的开发人员控制台中,您应该创建一个帐户,使用您的应用程序包名称配置一个新项目,并为您的应用程序的调试和发布版本添加SHA密钥.完成所有这些操作后,您将LoginResult使用该方法从对象成功检索令牌getAccessToken()
您可以在官方文档中阅读更多相关信息.
Google更容易,因为它已经连接到Firebase,您应该添加到您的gradle google play services并添加google services JSON已配置到您的应用程序的文件.您可以从firebase控制台获取它.
在此之后,您将需要GoogleSignInOptions使用JSON文件中的id 配置项目:
// Configure Google Sign In
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestIdToken(getString(R.string.default_web_client_id))
.requestEmail()
.build();
Run Code Online (Sandbox Code Playgroud)
在此之后,您只需要GoogleSignInApi在应用程序中创建一个意图并等待onActivityResult回调:
private void signIn() {
Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient);
startActivityForResult(signInIntent, RC_SIGN_IN);
}
@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) {
GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
if (result.isSuccess()) {
// Google Sign In was successful, authenticate with Firebase
GoogleSignInAccount account = result.getSignInAccount();
firebaseAuthWithGoogle(account);
} else {
// Google Sign In failed, update UI appropriately
// ...
}
}
}
Run Code Online (Sandbox Code Playgroud)
在此之后,您将能够从GoogleSignInAccount项目中检索令牌.请记住为应用的调试或发布版本配置不同的SHA密钥,否则Google登录将停止在发布版本中运行.
您可以在官方Firebase文档中阅读有关此内容的更多信息
关于twitter,我没有使用Twitter,所以我现在无法真正帮助你,但我建议你查看Twitter开发者文档和firebase Twitter实现帖子.
我会尝试编辑这个,当我在家里做一些pocs检查它是如何工作的.
了解Firebase id令牌的另一个好处是,每个用户和应用程序中的连接都是唯一的,允许您检查同一帐户是否正在尝试同时从不同设备登录,或者发送FirebaseInstanceId使用在线通知在你的应用程序中
要检索它,您应该使用FirebaseInstanceId.getInstance()API和方法来使用该对象idInstance.getToken().当用户登录您的应用时,这将为您的用户检索FirebaseInstance唯一ID.
您可以随时检索其令牌,200 OK并在应用程序中随时存储它以检查它并以您希望的方式进行管理.
关于这个的Firebase文档不是很清楚,所以我建议你使用下一个链接,它帮助我在我的应用程序中实现它很多.
祝你好运,并有一个很好的编码,如果我可以帮助你,随时可以提出更多的问题!
| 归档时间: |
|
| 查看次数: |
2046 次 |
| 最近记录: |