在API请求方法中将API会话身份验证令牌放在哪里?

时间:2019-08-07 09:09:40

标签: javascript react-native connectycube

我正在使用ConnectyCube React Native SDK,并已使用其API获得了应用程序身份验证令牌。发出进一步请求时(例如,以用户身份登录时),此令牌是必需的。他们的documentation说:

升级会话令牌(用户登录)

如果您有应用程序会话令牌,则可以通过调用登录方法将其升级为用户会话:

var userCredentials = {login: 'cubeuser', password: 'awesomepwd'};

ConnectyCube.login(userCredentials, function(error, user) {

});

问题在于,当我使用此方法时,我收到一条错误消息,说“需要令牌”。

如果要与REST API交互,我会将令牌放在请求的标头中,但是显然在这种情况下我不能这样做。所以问题是,我将令牌放在哪里?我有它,文档只是没有告诉您如何使用它!任何帮助表示赞赏。

3 个答案:

答案 0 :(得分:1)

好的,我想出了一个解决办法。首先,我只是尝试以与社交身份验证文档中相同的方式将auth令牌传递给userCredntials对象,这是我上面从他们的文档中摘录的代码片段中的描述所缺少的。

然后,我承诺从异步函数内useEffect内部进行API调用,以确保一切按正确的顺序进行,并且可以正常工作:

export default function App() {

  const createAppSession = () => {
    return new Promise((resolve, reject) => {
      ConnectyCube.createSession((error, session) => {
        !error
          ? resolve(session.token)
          : reject(error, '=====1=====');
      });
    })
  }

  const loginUser = (credentials) => {
    return new Promise((resolve, reject) => {
      ConnectyCube.login(credentials, ((error, user) => {
        !error
          ? resolve(user)
          : reject(error, '=====2=====');
      }));
    })
  }

  useEffect(() => {
    const ccFunc = async () => {
      ConnectyCube.init(...config)
      const appSessionToken = await createAppSession();
      const userCredentials = { login: 'xxxxx', password: 'xxxxxxx', keys: { token: appSessionToken } };
      const user = await loginUser(userCredentials);
      console.log(user);

    }
    ccFunc()
  }, []);

答案 1 :(得分:0)

希望它能起作用... 请自行实施...只需从下面的代码中了解即可。 代码说:将用户名和密码发送到api ...如果一切正常,然后进行身份验证,否则抛出错误...如果一切正常,则将返回的令牌存储为asyncStorage ...您可以使用任意名称创建存储。 ..并在应用程序中使用令牌eveywhere。

SignInUser = async () => {
    
    this.setState({
     username: this.state.username,
     password:this.state.password,
   })

   if(this.state.username && this.state.password !== null){
    try{
      this.setState({
        loading:true
      })
      const response = await fetch('YOUR API', {
        method: 'POST',
        headers: {
          Accept: 'application/json',
          'Content-Type': 'application/json',
        },
        body: JSON.stringify({
          username: this.state.username,
          password: this.state.password
        })
      });
      var promiseResponse = await response.json()
      console.log(promiseResponse.token);
      try {
        await AsyncStorage.setItem('STORE_YOUR_LOGIN_TOKEN_HERE', JSON.stringify(promiseResponse.token));
        console.log('Token Stored In Async Storage');
        let tokenFromAsync = await AsyncStorage.getItem('STORE_YOUR_LOGIN_TOKEN_HERE');
        console.log('Getting Token From Async...')
        tokenFromAsync = JSON.parse(tokenFromAsync)
        if(tokenFromAsync !== null){
          console.log(tokenFromAsync);
          this.setState({
            loading:false
          })
          this.props.navigation.navigate('Tabnav');
        }
        
      } catch (error) {
        // saving error
        console.log(`ERROR OCCURED ${error}`)
      }
      //this.props.navigation.navigate('Tabnav')
     } catch(error){
       console.log(`COULDN'T SIGN IN ${error}`)
     }
   } else {
     this.setState({
       msg:'Invalid Credentials',
       label:'red'
     });
   }
   
  
   
 } 

答案 2 :(得分:0)

这是我如何使登录名在其示例本机应用程序中工作

1.我在src> components> AuthScreen> AuthForm.js中的自定义登录功能中创建了一个凭证对象

var credentials = {id:'',login: this.state.login,password: this.state.password}

2。我使用了他们的_signIn(credentials)函数,并在用用户对象解析了UserService.signin(credentials)之后设置了凭据对象的'id'属性。 (已解析的用户对象包含已登录用户的ID,即user.id)。然后它起作用了。稍作调整后,代码就是这样寻找登录的。

loginUser() { //my custom signin function

    var credentials = {id:'',login: this.state.login,password: this.state.password} //my credentials object
    this._signIn(credentials)

}

_signIn(userCredentials) { //their signin function
    this.props.userIsLogging(true);

    UserService.signin(userCredentials)
        .then((user) => {
            userCredentials.id =  user.id //setting id of my credentials object after promise resolved
            ChatService.connect(userCredentials) //using my credentials object with id value set
                .then((contacts) => {
                    console.warn(contacts)
                    this.props.userLogin(user);
                    this.props.userIsLogging(false);
                    Actions.videochat(); //login worked
                })
                .catch(e => {
                    this.props.userIsLogging(false);
                    alert(`Error.\n\n${JSON.stringify(e)}`);
                })
        })
        .catch(e => {
            this.props.userIsLogging(false);
            alert(`Error.\n\n${JSON.stringify(e)}`);
        })
}