在 SDK 请求方法中的什么位置放置 API 会话身份验证令牌?



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

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

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

var userCredentials = {login: 'cubeuser', password: 'awesomepwd'};
ConnectyCube.login(userCredentials, function(error, user) {
});

问题是,当我使用此方法时,我在响应中收到一个错误,说"令牌是必需的"。

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

好的,我想出了一个解决方法。首先,我只是尝试以与社交身份验证文档中相同的方式将身份验证令牌传递给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()
  }, []);

希望它有效.... 请自行实现...只需从下面的代码中了解即可。 代码说:将用户名和密码发送到API...如果一切正常,则验证其他抛出错误...如果一切正常..然后存储返回的令牌是异步存储...您可以使用任何您喜欢的名称创建存储...并在您的应用程序中使用令牌 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'
     });
   }
   
  
   
 } 

这就是我如何让他们的登录名在他们的示例 react 本机应用程序

1 中工作。 我在 src>components>AuthScreen>AuthForm 的自定义登录函数中创建了一个这样的凭据对象.js

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

2.我使用了他们的_signIn(凭据(函数,并在他们的UserService.signin(凭据(使用用户对象解析后设置了我的凭据对象的"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.nn${JSON.stringify(e)}`);
                })
        })
        .catch(e => {
            this.props.userIsLogging(false);
            alert(`Error.nn${JSON.stringify(e)}`);
        })
}

相关内容

  • 没有找到相关文章