我正在开发一个封装在react native容器中的PWA,我使用window.ReactNativeWebView.postMessage("data to send")
将数据来回传递到PWA和react native应用程序。
我正在尝试集成google fit API,为了访问API需要访问令牌,所以我使用react-native-google-signin
包为我的应用程序提供认证详细信息,但是当我存储idToken
并将其发送到PWA时,并请求获取步骤,它返回我错误401,错误的认证凭据。
整个流程工作很好当我只有集成在市政工程局和获得认证的细节通过react-google-login
和在浏览器中运行我的程序,我在这里也能通过谷歌的步骤数符合API,因此,一切工作正常,但当它在一个移动设备重定向我到谷歌登录页面但不回到我的应用程序,在返回给了我错误的用户关闭应用程序或用户否认谷歌身份验证,所以我不得不从react native应用程序本身获得令牌,并将其传递给PWA,然后使用该API令牌发出请求,但它也不起作用。
有人经历过这种情况吗?
其他细节我已经为web应用生成了WEB_CLIENT_ID
,并且还为android应用添加了SHA-1证书指纹。
在react原生应用中,
const signInGoogleAuth = async () => {
try {
await GoogleSignin.hasPlayServices();
const user = await GoogleSignin.signIn();
console.log('user after google auth', user);
// await webViewRef.postMessage(user);
sendDataToPWA(JSON.stringify(user));
} catch (error) {
console.log('Some other error, please try again!', error);
}
};
PWA应用
在这里,我将user
对象存储在redux存储中,从而通过用户对象内部的认证令牌获得。
进一步请求获取谷歌适合API获取步骤,
export const getRequestHeaders = accessToken => {
const requestHeaderBody = {
params: {
key: API_KEY, // generated from google API console
},
headers: {
Authorization: `Bearer ${accessToken}`, // stored API token from react native
Accept: 'application/json',
},
};
return requestHeaderBody;
};
export const getAggregatedDataBody = (dataType, endTime) => {
const requestBody = {
aggregateBy: [
{
dataTypeName: dataType,
},
],
bucketByTime: {
durationMillis: 86400000,
},
endTimeMillis: endTime,
startTimeMillis: endTime - 7 * 86400000,
};
return requestBody;
};
export const getAggregateData = async (body, headers) => {
const req = await axios.post(
'https://www.googleapis.com/fitness/v1/users/me/dataset:aggregate',
body,
headers,
);
return req;
};
auth完成后,您必须传递访问令牌而不是idtoken。您可以获得如下代码所示的访问令牌。
const {accessToken} = await GoogleSignin.getTokens();