我正在使用ConnectyCube React Native SDK,并已使用其API获得了应用程序身份验证令牌。发出进一步请求时(例如,以用户身份登录时),此令牌是必需的。他们的documentation说:
升级会话令牌(用户登录)
如果您有应用程序会话令牌,则可以通过调用登录方法将其升级为用户会话:
var userCredentials = {login: 'cubeuser', password: 'awesomepwd'};
ConnectyCube.login(userCredentials, function(error, user) {
});
问题在于,当我使用此方法时,我收到一条错误消息,说“需要令牌”。
如果要与REST API交互,我会将令牌放在请求的标头中,但是显然在这种情况下我不能这样做。所以问题是,我将令牌放在哪里?我有它,文档只是没有告诉您如何使用它!任何帮助表示赞赏。
答案 0 :(得分:1)
好的,我想出了一个解决办法。首先,我只是尝试以与社交身份验证文档中相同的方式将auth令牌传递给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()
}, []);
答案 1 :(得分:0)
希望它能起作用...
请自行实施...只需从下面的代码中了解即可。
代码说:将用户名和密码发送到api ...如果一切正常,然后进行身份验证,否则抛出错误...如果一切正常,则将返回的令牌存储为asyncStorage ...您可以使用任意名称创建存储。 ..并在应用程序中使用令牌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'
});
}
}
答案 2 :(得分: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)}`);
})
}