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

Where to put API session auth token in SDK request methods?

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

升级session令牌(用户登录)

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

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

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

});

问题是当我使用这个方法时,我得到一个错误的响应说 'Token is required'。

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

好的,我想出了一个解决办法。首先,我只是尝试以与社交身份验证文档中相同的方式将身份验证令牌传递给 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...如果一切正常则进行身份验证否则抛出错误...如果一切正常..然后将返回的令牌存储为 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'
     });
   }
   
  
   
 } 

这就是我如何让登录在他们的示例 React 本机应用程序中工作

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

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

2.I 使用他们的 _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)}`);
        })
}