3

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

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

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

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

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

});

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

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

4

3 回答 3

0

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

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'
     });
   }
   
  
   
 } 

于 2019-08-07T10:46:46.660 回答
0

好的,我想出了一个修复方法。首先,我只是尝试以与userCredntials社交身份验证文档中相同的方式将身份验证令牌传递给对象,这在我上面从他们的文档中获取的代码片段中的描述中没有。

然后我在异步函数内部承诺 API 调用,useEffect以确保一切都以正确的顺序发生,并且它可以工作:

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()
  }, []);
于 2019-08-07T09:22:19.197 回答
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)}`);
        })
}
于 2019-08-17T14:53:49.953 回答