【问题标题】:Where to put API session auth token in SDK request methods?在 SDK 请求方法中将 API 会话身份验证令牌放在哪里?
【发布时间】:2019-08-07 09:09:40
【问题描述】:

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

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

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

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

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

});

问题是当我使用这种方法时,我得到一个错误的响应,说“需要令牌”。

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

【问题讨论】:

    标签: javascript react-native connectycube


    【解决方案1】:

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

    然后我在一个异步函数内的 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()
      }, []);
    

    【讨论】:

    • 更新:这似乎有效,但不是出于我的原因。它可以在不将令牌传递到 userCredentials 对象的情况下工作,我不知道为什么。如果去掉 const appSessionToken = await createAppSession(); 这行没有意义,因为我没有对函数返回的内容做任何事情。有来自 ConnectyCude 的人想发表评论吗??
    【解决方案2】:

    希望它有效.... 请自行实现...只需从下面的代码中了解。 代码说:将用户名和密码发送到 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'
         });
       }
       
      
       
     } 

    【讨论】:

      【解决方案3】:

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

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

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

      2.在他们的 UserService.signin(credentials) 使用用户对象解析后,我使用了他们的 _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)}`);
              })
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-21
        • 2020-03-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多