我正在使用expo和AWS aws aws amplify构建一个反应本机应用程序,我正在尝试启用与Facebook,Google等签名。使用AWS
我可以创建一个用户并使用Cognito API登录而没有任何问题。
不过,使用第三方需要使用Expo授权功能。
功能本身可以正常工作,我能够从我的/oauth2/doken Endpoint中获取适当的令牌。
但是,就Amplify而言(并且我知道),用户未登录,因此当我尝试获得auth.currentauthenticatecateduser()时,返回了null。
// Open URL in a browser
openURL = async (url) => {
let result = await AuthSession.startAsync({ authUrl: url })
this.getTokenbyCode(result.params.code)
};
getTokenbyCode = async (code) => {
const details = {
grant_type: 'authorization_code',
code,
client_id: '10eavoe3ufj2d70m5m3m2hl4pl',
redirect_uri: AuthSession.getRedirectUrl()
}
const formBody = Object.keys(details)
.map(
key => `${encodeURIComponent(key)}=${encodeURIComponent(details[key])}`
)
.join("&");
await fetch(
'https://presentor.auth.us-west-2.amazoncognito.com/oauth2/token',
{
method: "POST",
headers: {
'Content-type': 'application/x-www-form-urlencoded;charset=UTF-8'
},
body: formBody
}
)
.then(async (res) => {
console.log('res: ', res);
let resJSON = await res.json();
let idToken = await resJSON.id_token;
let decodedToken = jwt(idToken);
let userData = {
Username : decodedToken["cognito:username"],
Pool : Auth.userPool
}
})
.catch(error => {
console.log('error: ', error);
});
}
当我解码令牌时,我会按照我的期望看到有效载荷,但是如果我想,例如,如果我想利用API来刷新令牌,如果它到期后,我必须手动解决(检查到期并检索新的新的)如果已过期)。
我是否缺少基本的东西?
好的,我想出了。不确定这是否是正确的道路,但是它很干净并且有效,所以我对此很好。
- 使用Amazon-Cognito-Indentity-js创建CognitoidToken,CognitoAccessToken和CognitoreFreshToken对象
- 从这些令牌创建一个用户会话
-
从该用户会话创建用户
await fetch( 'TOKEN ENDPOINT', { method: "POST", headers: { 'Content-type': 'application/x-www-form-urlencoded;charset=UTF-8' }, body: formBody } ) .then(async (res) => { const IdToken = new CognitoIdToken({ IdToken: tokenRequestJson.id_token }); const AccessToken = new CognitoAccessToken({ AccessToken: tokenRequestJson.access_token }); const RefreshToken = new CognitoRefreshToken({ RefreshToken: tokenRequestJson.refresh_token }) try { let userSession = new CognitoUserSession({ IdToken, AccessToken, RefreshToken }); console.log('userSession: ', userSession); const userData = { Username: userSession.idToken.payload.email, Pool: userPool }; console.log('userData: ', userData); cognitoUser = new CognitoUser(userData); cognitoUser.setSignInUserSession(userSession); cognitoUser.getSession((err, session) => { // You must run this to verify that session (internally) if (session.isValid()) { console.log('session is valid'); this.setState({user: cognitoUser}) this.props.navigation.navigate('AuthLoading') } else { console.log('session is not valid: ', session); } }) } catch (FBSignInError) { console.log('FBSignInError: ', FBSignInError) } }) .catch(fetchError => console.log('fetchError: ', fetchError))