我正在使用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)}`);
})
}