javascript - 如何获取React Native GoogleSignIn的accessToken?

标签 javascript android react-native google-signin

我无法获得 accessToken,我的后端 api 中需要它。

当我尝试这个时,

googleLogin = () => {

  GoogleSignin.signIn()
    .then((data) => {
      console.log("TEST "+JSON.stringify(data));
      var postData = {
        access_token: data.accessToken,
        code: data.idToken,
      };

      let axiosConfig = {
        headers: {
            'Content-Type': 'application/json',
            "Accept": "application/json",
        }
      };
     ....
      //Backend api axios call
     ....

    })
    .then((user) => {
      console.log("TEST G LOGIN 1 "+JSON.stringify(user))
    })
    .catch((error) => {
      console.log("....."+JSON.stringify(error))
    });
}

得到这个回复,它不包含

accessToken

{
    "scopes": ["https://www.googleapis.com/auth/userinfo.profile", "https://www.googleapis.com/auth/userinfo.email", "https://www.googleapis.com/auth/drive.readonly"],
    "serverAuthCode": "4/jwE5LLLLLLa7-f33333jmMD2V978oyp44444eb9yGe_qhHnkXXXXXXXLFXKZlQdDzlH-iIJx_gzqlLLLLLL3Q0PP0",
    "idToken": "...v65a4MCC-ZUQmys_wf_DoCOBJEMuI........",
    "user": {
        "photo": "https://lh3.googleusercontent.com/-tLLLLLyeS0KE/AAAMMMMAAAI/AAAAAAAAAAA/ACHi3reMhihoeTe_6NjL666666EUVU82Q/s96-c/photo.jpg",
        "email": "test@gmail.com",
        "familyName": "tech",
        "givenName": "test",
        "name": "testtech",
        "id": "11688888817288868"
    }
}

根据 documentation

getTokens() Resolves with an object containing { idToken: string, accessToken: string, } or rejects with an error. Note that using accessToken is discouraged.

所以,我在

中尝试了这个
GoogleSignin.Sign({
....
 var gettoken =  GoogleSignin.currentUserAsync(data.user).then((token) => {
      console.log('USER token', token);
    }).done();
...
 })

它出错并尝试了 const token = GoogSignIn.getTokens(),它返回 null

package.json 信息

{
...
    "react": "16.8.3",
    "react-native": "0.59.9",
    "react-native-firebase": "5.3.1",
    "react-native-google-signin": "^2.0.0"
...
}

请建议获取 accessToken 的程序。

最佳答案

我终于得到了accessToken。

第 1 步:- 我删除了 goolge 开发者控制台中所有生成的 clidenId(只保留我在我的 web 项目中使用的 web 应用程序 clientId),还删除了 firebase 项目中的 android 应用程序。

第 2 步:- 在 firebase 中创建新的 android 应用程序并下载 google-services.json 并将其粘贴到 android/app/google-services.json

第 3 步:- 从 google-services.json 的这一部分复制了 clidenId

...
  "services": {
        "appinvite_service": {
          "other_platform_oauth_client": [
            {
              "client_id": "xxxxxxx-xxxxx.apps.googleusercontent.com", //<--- copied this clientID
              "client_type": 3
            },
            {
              "client_id": "XXXXXXXXXX-fBBBBBBBBBBBBBBBBBBBBBBBBpugnhrade.apps.googleusercontent.com",
              "client_type": 2,
              "ios_info": {
                "bundle_id": "com.projectios"
              }
            }
          ]
        }
      }

...

然后粘贴

GoogleSignin.configure({
  webClientId: 'paste it here',
});

第 4 步:- 这是获取accessToken的代码 (但这段代码在我之前的 google-services.json 文件中不起作用)

googleLogin = () => {
 
    GoogleSignin.signIn()
      .then((data) => {

        console.log("TEST " + JSON.stringify(data));

        const currentUser = GoogleSignin.getTokens().then((res)=>{
          console.log(res.accessToken ); //<-------Get accessToken
          var postData = {
            access_token: res.accessToken,
            code: data.idToken,
    
          };
    
          let axiosConfig = {
            headers: {
              'Content-Type': 'application/json',
              "Accept": "application/json",
            }
          };
         -----
          backend api call
         -----
});

      })
      .then((user) => {
        console.log("TEST G LOGIN 1 " + JSON.stringify(user))
      })
      .catch((error) => {
        console.log("....." + JSON.stringify(error))
      });   
  }

关于javascript - 如何获取React Native GoogleSignIn的accessToken?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57179401/

相关文章:

javascript - 将 Angular ui Bootstrap 注入(inject) app.js,但日期选择器未显示在 View 中

javascript - 如何将数组值插入对象?

javascript - 将 Android Chrome 与普通浏览器区分开来。 Stock 浏览器的用户代理包含 'Chrome'

android - 为什么发明了新的 apply() 而不是修改 commit() 行为?

javascript - 检查json是否包含react-native中的键

reactjs - 如何在 React Native 中监听子组件中的事件?

javascript - JQuery点击attr ('src')返回未定义

javascript - 剪刀的递归解

android - 在 OpenGL ES 2 中将原点设置为屏幕的左上角

reactjs - React Native 中的 useContext