使用 React TypeScript 进行 GraphQL 身份验证

Posted

技术标签:

【中文标题】使用 React TypeScript 进行 GraphQL 身份验证【英文标题】:GraphQL Authentication with React TypeScript 【发布时间】:2020-06-06 08:27:02 【问题描述】:

我有一个登录页面,当用户单击提交按钮时,我想从 GraphQL API 中可用的数据检查用户的身份验证。我尝试按照本教程进行操作:

https://www.apollographql.com/docs/react/networking/authentication/

在我的 graphQL 操场上,我使用这个突变,然后一个令牌返回给我。

mutation
             loginEmail(email: "$this.state.email",
             password: "$this.state.password")
          `,

但是,我可以弄清楚如何将它集成到我的代码中。我应该在哪里传递用户名和密码?如果我在按钮上调用 _AuthLink,则会出现重载错误。

这是我的登录页面代码:

export default class LoginPage extends Component <,  email: string,password: string, loggedIn: boolean>
  constructor(props: Readonly<>) 
    super(props);
    this.state = 
      email: '',
      password: '',
      loggedIn: false,
    ;
  

  _httpLink = createHttpLink(
    uri: 'https:myapilink/graphql',
  );

  _AuthLink = setContext((_,  headers ) => 
    // get the authentication token from local storage if it exists
    const token = localStorage.getItem('token');
    // return the headers to the context so httpLink can read them
    return 
      headers: 
        ...headers,
        authorization: token ? `Bearer $token` : "",
      
    
  );

  _client = new ApolloClient(
    link: authLink.concat(httpLink),
    cache: new InMemoryCache()
  );

  render() 
    return (
      <Container component="main" maxWidth="xs">
        <CssBaseline />
        <div style=
    display: 'flex',
    flexDirection: 'column',
    alignItems: 'center'>
          <Avatar>
            <LockOutlinedIcon />
          </Avatar>
          <Typography component="h1" variant="h5">
            Sign in
          </Typography>
          <form style=width: '100%' noValidate>
            <TextField
              variant="outlined"
              margin="normal"
              required
              fullWidth
              id="email"
              label="Email Address"
              name="email"
              autoComplete="email"
              autoFocus
              onChange=e => 
                this.setState(email: e.target.value)
              
            />
            <TextField
              variant="outlined"
              margin="normal"
              required
              fullWidth
              name="password"
              label="Password"
              type="password"
              id="password"
              autoComplete="current-password"
              onChange=e => 
                this.setState(password: e.target.value)
            
            />
            <FormControlLabel
              control=<Checkbox value="remember" color="primary" />
              label="Remember me"
            />
            <br></br>
            <Button className='button-center'
            //onClick=this._AuthLink
            >
            Submit</Button>
            <br></br>
            <Grid container>
              <Grid item xs>
                <Link href="#" variant="body2">
                  Forgot password?
                </Link>
              </Grid>
              <Grid item>
                <Link href="#" variant="body2">
                  "Don't have an account? Sign Up"
                </Link>
              </Grid>
            </Grid>
          </form>
        </div>
        <Box mt=8>
          <Copyright />
        </Box>
      </Container>
    );
  

【问题讨论】:

【参考方案1】:

您需要先创建一个突变!这将为您提供mutate 函数,您可以传递变量等。看看这个例子;

const AddTodo = () => 
  let input;

  return (
    <Mutation mutation=ADD_TODO>
      (addTodo,  data ) => (
        <div>
          <form
            onSubmit=e => 
              e.preventDefault();
              addTodo( variables:  type: input.value  );
              input.value = '';
            
          >
            <input
              ref=node => 
                input = node;
              
            />
            <button type="submit">Add Todo</button>
          </form>
        </div>
      )
    </Mutation>
  );
;

注意我们如何将addTodo( variables: type: input.value ); 变量传递到这里,您应该发送用户名和密码,而不是type

你可以这样做;

login(variables: username: this.state.username, password: this.state.password)

【讨论】:

嘿,你能在这个沙盒上检查我的代码吗? codesandbox.io/s/… 这还不是一个有效的例子。目前,每次单击登录按钮时,我的页面都会提醒“已提交”。即使输入的密码/用户名是错误的。我需要将从突变中接收到的令牌存储在 localstorage 中,但我不知道在哪里/如何这样做

以上是关于使用 React TypeScript 进行 GraphQL 身份验证的主要内容,如果未能解决你的问题,请参考以下文章

我应该如何测试使用 Typescript 进行 api 调用的 React Hook “useEffect”?

使用 React TypeScript 进行 GraphQL 身份验证

如何使用 Typescript 构建 React Native 导航以进行属性传递

Typescript 在使用 create react app 进行编译时不会出错

使用 typescript、react 和 graphql 以正确方式进行查询的问题

使用 Create React App 和 TypeScript 进行 Jest 测试时的 isolatedModules 错误?