android - verifyIdToken() 的第一个参数必须是 Firebase ID 令牌字符串错误
问题描述
我将 idtoken 从 android 发送到服务器 node.js 我想在 node.js 中验证 Idtoken
但是发生了这个错误。
verifyIdToken() 的第一个参数必须是 Firebase ID 令牌字符串。
我不知道为什么会发生错误
我将令牌发送到我的本地服务器和虚拟主机服务器。但两者都出现错误。
var admin = require("firebase-admin");
function authCheck(token) {
return admin.auth().verifyIdToken(token)
};
exports.authCheck = authCheck;
// exports.userCheck=userCheck;
这是我用于验证 idtoken 的中间件
const { authCheck } = require('../user_fish/firebase');
const user_infoRepository = require('../user_info/repository')
function firebaseAuth(req, res, next) {
let token = req.body.token;
authCheck(token)
.then(decodedToken => {
let uid=decodedToken.uid;
console.log(uid);
// return user_infoRepository.uidFindOrCreate(decodedToken.uid)
})
.then(user => {
req.user = user[0]
next();
})
.catch(e => {
res.json(e)
})
}
exports.firebaseAuth = firebaseAuth;
这是我将令牌发送到 node.js 的 android 代码
public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
FirebaseUser user=firebaseAuth.getCurrentUser();
String uid=user.getUid();
Log.d(TAG,"user uid:"+user.getUid());
if(user!=null){
//Token 알아내기
user.getIdToken(true)
.addOnCompleteListener(new OnCompleteListener<GetTokenResult>() {
@Override
public void onComplete(@NonNull Task<GetTokenResult> task) {
if(task.isSuccessful()){
String idToken=task.getResult().getToken();
try {
// Send token to your backend via HTTPS
Log.d(TAG,"Token: " +idToken);
Log.d(TAG,"start:"+"start ok http");
OkHttpClient client = new OkHttpClient();
RequestBody formBody = new FormBody.Builder()
.add("idToken", idToken)
.build();
Request request = new Request.Builder()
.url("http://10.0.2.2:3000/user_fish/fish")
.post(formBody)
.build();
//바동기 처리
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(@NotNull Call call, @NotNull IOException e)
{
Log.d(TAG,"fail:"+e.toString());
System.out.println("error + Connection Server Error
is"+e.toString());
}
@Override
public void onResponse(@NotNull Call call, @NotNull Response
response) throws IOException {
Log.d(TAG,"success:"+response.body().toString());
System.out.println("Response Body is "+ response.body().string());
}
});
}catch (Exception e){
}
Toast.makeText(MainActivity.this, idToken,
Toast.LENGTH_SHORT).show();
}else{
}
}
});
Intent intent=new Intent(MainActivity.this, BasicActivity.class);
// intent.putExtra("uid",uid);
Log.d(TAG,"basic가는 uid:"+uid);
// Toast.makeText(MainActivity.this,uid, Toast.LENGTH_SHORT).show();
startActivity(intent);
}else{
}
}
};
这是我的令牌信息
{
"iss": "https://securetoken.google.com/graduation-f5a8d",
"aud": "graduation-f5a8d",
"auth_time": 1590587163,
"user_id": "f4ZelA5RrPQDvc9oqp5ev1WSXwW2",
"sub": "f4ZelA5RrPQDvc9oqp5ev1WSXwW2",
"iat": 1590587164,
"exp": 1590590764,
"email": "hyogil2478@daum.net",
"email_verified": false,
"firebase": {
"identities": {
"email": [
"hyogil2478@daum.net"
]
},
"sign_in_provider": "password"
}
}
请告诉我如何解决这个问题...
解决方案
最好检查 req.body.token 的值。
看来您的 android 代码将令牌作为 idToken 发送。
function firebaseAuth(req, res, next) {
let token = req.body.token;
console.log(token);
//or
console.log(req.body);
推荐阅读
- reactjs - 如何在 rect-hook-form v7 中显示复选框列表
- vue.js - VueJs/Vuex - 设计模式
- r - 在 R 中使用 ggnewscale::new_scale() 和 ggplot2 将图例拆分为两个或多个列
- spring-integration - Spring Integration DSL:如何删除 JPA 实体列表?
- substrate - 存储值的多地址查找使用:`T::lookup:lookup(Vec<[u8; 32], Global>)`?
- excel - 如何使范围从下到上开始?VBA
- angular - 从搜索框输入中过滤 *ngFor 结果
- html - CSS 居中的方形子元素受其父元素的宽度和高度限制(如 background-size:contain + center)
- javascript - ChartJS - 在条形图/折线图上单独显示/隐藏数据而不是整个数据集
- react-native - 在状态变化中反应原生测试