Next.js: рд▓реЙрдЧрд┐рди / рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдЙрджрд╛рд╣рд░рдг рдЬреЛрдбрд╝реЗрдВ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 29 рдЕрдХреНрддреВре░ 2016  ┬╖  208рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: vercel/next.js

рд╕рд╛рде рдореЗрдВ:

  • рдкреГрд╖реНрдареЛрдВ рдкрд░ рдкреБрди: рдкреНрд░рдпреЛрдЬреНрдп рдкреНрд░рдорд╛рдгреАрдХрд░рдг рд╕рд╣рд╛рдпрдХ
  • рдЯреИрдм рдХреЗ рдмреАрдЪ рд╕рддреНрд░ рддреБрд▓реНрдпрдХрд╛рд▓рди
  • рд╕рд░рд▓ рдкрд╛рд╕рд╡рд░реНрдб рд░рд╣рд┐рдд рдИрдореЗрд▓ рдмреИрдХрдПрдВрдб now.sh рдкрд░ рд╣реЛрд╕реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдмрд╣реБрдд рд╕реЗ рдирдП рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рдж рдорджрджрдЧрд╛рд░ рд╣реЛрдЧрд╛ред

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рддреЛ рдореЗрд░реЗ рдкрд╛рд╕ рддреИрд░рд╛рдХреА рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рдЕрдзрд┐рдХрд╛рд░ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдХрд╣реАрдВ рдФрд░ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдпрд╣ рдХреЗрд╡рд▓ рдХреНрд▓рд╛рдЗрдВрдЯ-рд╕рд╛рдЗрдб рд╣реИ, рдЬреЛ рдЕрдВрддрддрдГ рдХреЗрд╡рд▓ рдЖрдзреА рд▓рдбрд╝рд╛рдИ рд╣реИред

"рдмрд╣реБрдд рд╕реБрд░рдХреНрд╖рд┐рдд"

Php рдХреА рддрд░рд╣, Next рдХреА рдкрд░рдорд╛рдгреБ рдЗрдХрд╛рдИ рдкреГрд╖реНрда рд╣реИред рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдЖрд▓рд╕реА рдкреНрд░рддреНрдпреЗрдХ рдкреГрд╖реНрда рдХреЛ рдХреЗрд╡рд▓ рддрднреА рд▓реЛрдб рдХрд░рддрд╛ рд╣реИ рдЬрдм рдЙрд╕рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдХреНрд▓рд╛рдЗрдВрдЯ-рд╕рд╛рдЗрдб рдХреЗрд╡рд▓ рдСрде рдХреЗ рд╕рд╛рде рд▓реЗрдХрд┐рди рд╕рд░реНрд╡рд░-рд░реЗрдВрдбрд░рд┐рдВрдЧ рдХреЗ рд╕рд╛рде, рдЙрд╕ рд╕рдВрд░рдХреНрд╖рд┐рдд рдкреГрд╖реНрда рдХреЗ рд▓рд┐рдП рдЬреЗрдПрд╕ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рджреНрд╡рд╛рд░рд╛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЬрдм рдиреЗрдХреНрд╕реНрдЯ рд╕рд░реНрд╡рд░ рд╡рд░реНрдХрдлреНрд▓реЛ рдЬреЛрдбрд╝рддрд╛ рд╣реИ, рддреЛ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЖрдк рдЗрд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд░реНрд╡рд░ рдкрд░ рд░реЗрдВрдбрд░ рдФрд░ рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ рдХреЛ рдмреНрд▓реЙрдХ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдВрдЧреЗред рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреБрдХреАрдЬрд╝, рд╕рддреНрд░ рдФрд░ AFAIK рд╕рддреНрд░ рд╕реНрдЯреЛрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рд▓реЗрдХрд┐рди рдпрд╣ рдЗрд╕ рддрд░рд╣ рдХреЗ рд╣рд╛рдЗрдмреНрд░рд┐рдб рдРрдкреНрд╕ рдХрд░рдиреЗ рдХреА рд▓рд╛рдЧрдд рд╣реИред

рдкреНрд░рд╛рдорд╛рдгрд┐рдХ рдЙрджрд╛рд╣рд░рдг

рдорд╛рди рд▓реЗрдВ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЬреЗрдбрдмреНрд▓реНрдпреВрдЯреА-рд╕реБрд░рдХреНрд╖рд┐рдд рдПрдкреАрдЖрдИ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдмреНрдпрд╛рдЬ рдХреЗ рджреЛ рдЕрдВрддрд┐рдо рдмрд┐рдВрджреБ рд╣реИрдВ: /token рдФрд░ /me ред /token рдИрдореЗрд▓/рдкрд╛рд╕рд╡рд░реНрдб рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдПрдХ рд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд JWT ( id_token ) рджреЗрддрд╛ рд╣реИ рдЬрдмрдХрд┐ /me JWT-рдкреНрд░рдорд╛рдгрд┐рдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рдЬрд╛рдирдХрд╛рд░реА рджреЗрддрд╛ рд╣реИред рдореИрдВрдиреЗ Auth0 рдХреЗ рд▓реЙрдХ рд╕реЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд AuthService.js рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд┐рдпрд╛ (рдИрд╡реЗрдВрдЯ рдПрдорд┐рдЯрд░ рдХреЛ рд╣рдЯрд╛ рд░рд╣рд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рд╕рдмрд╕реЗ рдмреБрд░рд╛ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рд╣реИ)ред рдпрд╣ рд▓рдЧрднрдЧ рд╕рднреА рдЬреЗрдбрдмреНрд▓реНрдпреВрдЯреА рдЯреЛрдХрди рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХреЛ рдирд┐рдХрд╛рд▓рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдЗрд╕реЗ рд▓реЙрдЧрд┐рди рдкреЗрдЬ рдкрд░ рдФрд░ рдЙрдЪреНрдЪ рдСрд░реНрдбрд░ рдШрдЯрдХ рдореЗрдВ рднреА рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ (рдЙрд╕ рдкрд░ рдмрд╛рдж рдореЗрдВ рдФрд░ рдЕрдзрд┐рдХ)ред

// utils/AuthService.js
export default class AuthService {
  constructor(domain) {
    this.domain = domain || 'http://localhost:5000'
    this.fetch = this.fetch.bind(this)
    this.login = this.login.bind(this)
    this.getProfile = this.getProfile.bind(this)
  }

  login(email, password) {
    // Get a token
    return this.fetch(`${this.domain}/token`, {
      method: 'POST',
      body: JSON.stringify({
        email,
        password
      })
    }).then(res => {
      this.setToken(res.id_token)
      return this.fetch(`${this.domain}/user`, {
        method: 'GET'
      })
    }).then(res => {
      this.setProfile(res)
      return Promise.resolve(res)
    })
  }

  loggedIn(){
    // Checks if there is a saved token and it's still valid
    const token = this.getToken()
    return !!token && !isTokenExpired(token) // handwaiving here
  }

  setProfile(profile){
    // Saves profile data to localStorage
    localStorage.setItem('profile', JSON.stringify(profile))
  }

  getProfile(){
    // Retrieves the profile data from localStorage
    const profile = localStorage.getItem('profile')
    return profile ? JSON.parse(localStorage.profile) : {}
  }

  setToken(idToken){
    // Saves user token to localStorage
    localStorage.setItem('id_token', idToken)
  }

  getToken(){
    // Retrieves the user token from localStorage
    return localStorage.getItem('id_token')
  }

  logout(){
    // Clear user token and profile data from localStorage
    localStorage.removeItem('id_token');
    localStorage.removeItem('profile');
  }

  _checkStatus(response) {
    // raises an error in case response status is not a success
    if (response.status >= 200 && response.status < 300) {
      return response
    } else {
      var error = new Error(response.statusText)
      error.response = response
      throw error
    }
  }

  fetch(url, options){
    // performs api calls sending the required authentication headers
    const headers = {
      'Accept': 'application/json',
      'Content-Type': 'application/json'
    }

    if (this.loggedIn()){
      headers['Authorization'] = 'Bearer ' + this.getToken()
    }

    return fetch(url, {
      headers,
      ...options
    })
    .then(this._checkStatus)
    .then(response => response.json())
  }
}

рд╕реБрд░рдХреНрд╖рд╛ рдкреГрд╖реНрдареЛрдВ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдЧрд▓рд╛ рдПрдХ HOC рд╣реИред рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рдЕрд╡рд╛рдВрдЫрд┐рдд рдлреНрд▓реИрд╢ рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП, рдкреЗрдЬ рдкрд╣рд▓реЗ рд░реЗрдВрдбрд░ рдкрд░ Loading... рд╕рд░реНрд╡рд░-рд░реЗрдВрдбрд░ рдХрд░реЗрдЧрд╛ рдЬрдмрдХрд┐ рд░рд┐рдПрдХреНрдЯ рдмреВрдЯ рдЕрдк/рд▓реЛрдХрд▓рд╕реНрдЯреЛрд░реЗрдЬ рд╕реЗ рдЯреЛрдХрди рдкрдврд╝рддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╕рдВрд░рдХреНрд╖рд┐рдд рдкреГрд╖реНрда рдПрд╕рдИрдУ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ, рдЬреЛ рд╢рд╛рдпрдж рдЕрднреА рддрдХ рдареАрдХ рд╣реИ, рд▓реЗрдХрд┐рди рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЗрд╖реНрдЯрддрдо рдирд╣реАрдВ рд╣реИред

// utils/withAuth.js - a HOC for protected pages
import React, {Component} from 'react'
import AuthService from './auth'

export default function withAuth(AuthComponent) {
    const Auth = new AuthService('http://localhost:5000')
    return class Authenticated extends Component {
      constructor(props) {
        super(props)
        this.state = {
          isLoading: true
        };
      }

      componentDidMount () {
        if (!Auth.loggedIn()) {
          this.props.url.replaceTo('/')
        }
        this.setState({ isLoading: false })
      }

      render() {
        return (
          <div>
          {this.state.isLoading ? (
              <div>LOADING....</div>
            ) : (
              <AuthComponent {...this.props}  auth={Auth} />
            )}
          </div>
        )
      }
    }
}
// ./pages/dashboard.js
// example of a protected page
import React from 'react'
import withAuth from  '../utils/withAuth'

class Dashboard extends Component {
   render() {
     const user = this.props.auth.getProfile()
     return (   
         <div>Current user: {user.email}</div>
     )
   }
}

export default withAuth(Dashboard) 

рд▓реЙрдЧрд┐рди рдкреЗрдЬ рдПрдЪрдУрд╕реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЕрднреА рдЦрдбрд╝рд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд▓реЙрдЧрд┐рди рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рддреЛ рдпрд╣ рд╕реАрдзреЗ AuthService рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рддрд╛ рд╣реИред рдЖрдк рд╕рд╛рдЗрдирдЕрдк рдкреЗрдЬ рдХреЗ рд▓рд┐рдП рднреА рдХреБрдЫ рдРрд╕рд╛ рд╣реА рдХрд░реЗрдВрдЧреЗред

// ./pages/login.js
import React, {Component} from 'react'
import AuthService from '../utils/AuthService'

const auth = new AuthService('http://localhost:5000')

class Login extends Component {
  constructor(props) {
    super(props)
    this.handleSubmit = this.handleSubmit.bind(this)
  }

  componentDidMount () {
    if (auth.loggedIn()) {
      this.props.url.replaceTo('/admin')   // redirect if you're already logged in
    }
  }

  handleSubmit (e) {
    e.preventDefault()
    // yay uncontrolled forms!
    auth.login(this.refs.email.value, this.refs.password.value)
      .then(res => {
        console.log(res)
        this.props.url.replaceTo('/admin')
      })
      .catch(e => console.log(e))  // you would show/hide error messages with component state here 
  }

  render () {
    return (
      <div>
         Login
          <form onSubmit={this.handleSubmit} >
            <input type="text" ref="email"/>
            <input type="password" ref="password"/>
            <input type="submit" value="Submit"/>
          </form>
      </div>
    )
  }
}

export default Login

Airbnb рдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рд╢реИрд▓реА рд╕реЗ рдкреНрд░реЗрд░рд┐рдд рд╣реЛрдХрд░, рдореИрдВрдиреЗ next-with-auth lib рдкрд░ рднреА рдХрд╛рдо рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛, рдЬреЛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реЛрдЧрд╛ рдЬреЛ рдкреГрд╖реНрдареЛрдВ рдкрд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ HOC рд▓реМрдЯрд╛рдПрдЧрд╛ред рдореИрдВрдиреЗ AuthService рдФрд░ рдЗрд╕ рдПрдЪрдУрд╕реА рдХреЗ рд╡рд┐рд▓рдп рдХреЗ рд╕рд╛рде рднреА рдЦреЗрд▓рд╛ред рдПрдХ рд╕рдорд╛рдзрд╛рди рдпрд╣ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдПрдЪрдУрд╕реА рдХреЛ рдШрдЯрдХ рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдПрдХ рдЕрдиреБрдорддрд┐ рд╕реНрддрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд░реЗрдбрдХреНрд╕ рдХрдиреЗрдХреНрдЯ рдЬреИрд╕реЗ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рдПред рднрд▓реЗ рд╣реА, рдореЗрд░реЗ рджрд┐рдорд╛рдЧ рдореЗрдВ, рдЖрдк рдЗрд╕ рддрд░рд╣ next-with-auth рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ:

// ./utils/withAuth.js
import nextAuth from 'next/auth'
import parseScopes from './parseScopes'

const Loading = () => <div>Loading...</div>

export default nextAuth({
  url: 'http://localhost:5000',
  tokenEndpoint: '/api/token',
  profileEndpoint: '/api/me',
  getTokenFromResponse: (res) => res.id_token,
  getProfileFromResponse: (res) => res,
  parseScopes,
})

Redux рдХреЗ рд╕рд╛рде рдпрд╣ рд╕рдм рдХрд░рдирд╛ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд░реВрдк рд╕реЗ рдЬрдЯрд┐рд▓ рд▓рдЧ рд░рд╣рд╛ рдерд╛, рд▓реЗрдХрд┐рди рдореВрд▓ рд░реВрдк рд╕реЗ рдЖрдк рд╡рд┐рдХреА рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди AuthService рдХреЛ рдХреНрд░рд┐рдпрд╛рдУрдВ (рд▓реЙрдЧрд┐рди рдФрд░ рд▓реЙрдЧрдЖрдЙрдЯ) рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд░реЗрдбреНрдпреВрд╕рд░ рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдк рдХреЗрд╡рд▓ рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд░ рдЗрди рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╕рд░реНрд╡рд░ рдкрд░ рд╕реНрдерд╛рдиреАрдп рд╕реНрдЯреЛрд░реЗрдЬ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдЗрд╕реЗ рдЕрдкрдиреЗ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдЬрд╛рдВрдЪрдирд╛ рд╣реЛрдЧрд╛ред рдЕрдВрддрддрдГ, redux store рдХреЛ рд╡реИрд╕реЗ рднреА window рдкрд░ рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред рддреЛ рдЖрдк рд╕рдВрджрд░реНрдн рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ window рдкрд░ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХреИрд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдк redux рдирд╣реАрдВ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк react-broadcast рднреА рдЖрдЬрд╝рдорд╛ рд╕рдХрддреЗ рд╣реИрдВред

рдЕрдВрдд рдореЗрдВ, next/server рдЬрд╣рд╛рдЬреЛрдВ рдХреЛ #25 рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдорд╛рдирдХрд░ред next-with-auth рдорд┐рдбрд▓рд╡реЗрдпрд░ + рдПрдХ рдПрдЪрдУрд╕реА рдХреЗ рд╕рд╛рде рдбреЗрд╡рд▓рдкрд░ рд╕реЗ рдЬрдЯрд┐рд▓ рдЬрдЯрд┐рд▓ рд╕реНрдерд╛рдиреАрдп рд╕реНрдЯреЛрд░реЗрдЬ рдмрдирд╛рдо рдХреБрдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдЕрдореВрд░реНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдЯреЛрдХрди рд░рд┐рдлреНрд░реЗрд╢рд┐рдВрдЧ рдХреЛ рднреА рд╣реИрдВрдбрд▓ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рд╕рднреА 208 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рд╕реБрдЭрд╛рд╡: рдЙрджрд╛рд╣рд░рдг рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Redux рдФрд░ JWT рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ

рдореИрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдореЗрд░реЗ рдЙрдЪреНрдЪ рд╕реНрддрд░реАрдп рдШрдЯрдХ (рдЬрд╣рд╛рдВ рдореИрдВ рдпрд╣ рдЬрд╛рдВрдЪрдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреНрд░рдорд╛рдгреАрдХреГрдд рд╣реИ рдФрд░ рд▓реЙрдЧрд┐рди рдкреГрд╖реНрда рдкрд░ рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ рдирд╣реАрдВ рд╣реИ)

рддреЛ рдореЗрд░реЗ рдкрд╛рд╕ рддреИрд░рд╛рдХреА рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рдЕрдзрд┐рдХрд╛рд░ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдХрд╣реАрдВ рдФрд░ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдпрд╣ рдХреЗрд╡рд▓ рдХреНрд▓рд╛рдЗрдВрдЯ-рд╕рд╛рдЗрдб рд╣реИ, рдЬреЛ рдЕрдВрддрддрдГ рдХреЗрд╡рд▓ рдЖрдзреА рд▓рдбрд╝рд╛рдИ рд╣реИред

"рдмрд╣реБрдд рд╕реБрд░рдХреНрд╖рд┐рдд"

Php рдХреА рддрд░рд╣, Next рдХреА рдкрд░рдорд╛рдгреБ рдЗрдХрд╛рдИ рдкреГрд╖реНрда рд╣реИред рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдЖрд▓рд╕реА рдкреНрд░рддреНрдпреЗрдХ рдкреГрд╖реНрда рдХреЛ рдХреЗрд╡рд▓ рддрднреА рд▓реЛрдб рдХрд░рддрд╛ рд╣реИ рдЬрдм рдЙрд╕рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдХреНрд▓рд╛рдЗрдВрдЯ-рд╕рд╛рдЗрдб рдХреЗрд╡рд▓ рдСрде рдХреЗ рд╕рд╛рде рд▓реЗрдХрд┐рди рд╕рд░реНрд╡рд░-рд░реЗрдВрдбрд░рд┐рдВрдЧ рдХреЗ рд╕рд╛рде, рдЙрд╕ рд╕рдВрд░рдХреНрд╖рд┐рдд рдкреГрд╖реНрда рдХреЗ рд▓рд┐рдП рдЬреЗрдПрд╕ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рджреНрд╡рд╛рд░рд╛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЬрдм рдиреЗрдХреНрд╕реНрдЯ рд╕рд░реНрд╡рд░ рд╡рд░реНрдХрдлреНрд▓реЛ рдЬреЛрдбрд╝рддрд╛ рд╣реИ, рддреЛ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЖрдк рдЗрд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд░реНрд╡рд░ рдкрд░ рд░реЗрдВрдбрд░ рдФрд░ рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ рдХреЛ рдмреНрд▓реЙрдХ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдВрдЧреЗред рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреБрдХреАрдЬрд╝, рд╕рддреНрд░ рдФрд░ AFAIK рд╕рддреНрд░ рд╕реНрдЯреЛрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рд▓реЗрдХрд┐рди рдпрд╣ рдЗрд╕ рддрд░рд╣ рдХреЗ рд╣рд╛рдЗрдмреНрд░рд┐рдб рдРрдкреНрд╕ рдХрд░рдиреЗ рдХреА рд▓рд╛рдЧрдд рд╣реИред

рдкреНрд░рд╛рдорд╛рдгрд┐рдХ рдЙрджрд╛рд╣рд░рдг

рдорд╛рди рд▓реЗрдВ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЬреЗрдбрдмреНрд▓реНрдпреВрдЯреА-рд╕реБрд░рдХреНрд╖рд┐рдд рдПрдкреАрдЖрдИ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдмреНрдпрд╛рдЬ рдХреЗ рджреЛ рдЕрдВрддрд┐рдо рдмрд┐рдВрджреБ рд╣реИрдВ: /token рдФрд░ /me ред /token рдИрдореЗрд▓/рдкрд╛рд╕рд╡рд░реНрдб рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдПрдХ рд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд JWT ( id_token ) рджреЗрддрд╛ рд╣реИ рдЬрдмрдХрд┐ /me JWT-рдкреНрд░рдорд╛рдгрд┐рдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рдЬрд╛рдирдХрд╛рд░реА рджреЗрддрд╛ рд╣реИред рдореИрдВрдиреЗ Auth0 рдХреЗ рд▓реЙрдХ рд╕реЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд AuthService.js рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд┐рдпрд╛ (рдИрд╡реЗрдВрдЯ рдПрдорд┐рдЯрд░ рдХреЛ рд╣рдЯрд╛ рд░рд╣рд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рд╕рдмрд╕реЗ рдмреБрд░рд╛ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рд╣реИ)ред рдпрд╣ рд▓рдЧрднрдЧ рд╕рднреА рдЬреЗрдбрдмреНрд▓реНрдпреВрдЯреА рдЯреЛрдХрди рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХреЛ рдирд┐рдХрд╛рд▓рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдЗрд╕реЗ рд▓реЙрдЧрд┐рди рдкреЗрдЬ рдкрд░ рдФрд░ рдЙрдЪреНрдЪ рдСрд░реНрдбрд░ рдШрдЯрдХ рдореЗрдВ рднреА рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ (рдЙрд╕ рдкрд░ рдмрд╛рдж рдореЗрдВ рдФрд░ рдЕрдзрд┐рдХ)ред

// utils/AuthService.js
export default class AuthService {
  constructor(domain) {
    this.domain = domain || 'http://localhost:5000'
    this.fetch = this.fetch.bind(this)
    this.login = this.login.bind(this)
    this.getProfile = this.getProfile.bind(this)
  }

  login(email, password) {
    // Get a token
    return this.fetch(`${this.domain}/token`, {
      method: 'POST',
      body: JSON.stringify({
        email,
        password
      })
    }).then(res => {
      this.setToken(res.id_token)
      return this.fetch(`${this.domain}/user`, {
        method: 'GET'
      })
    }).then(res => {
      this.setProfile(res)
      return Promise.resolve(res)
    })
  }

  loggedIn(){
    // Checks if there is a saved token and it's still valid
    const token = this.getToken()
    return !!token && !isTokenExpired(token) // handwaiving here
  }

  setProfile(profile){
    // Saves profile data to localStorage
    localStorage.setItem('profile', JSON.stringify(profile))
  }

  getProfile(){
    // Retrieves the profile data from localStorage
    const profile = localStorage.getItem('profile')
    return profile ? JSON.parse(localStorage.profile) : {}
  }

  setToken(idToken){
    // Saves user token to localStorage
    localStorage.setItem('id_token', idToken)
  }

  getToken(){
    // Retrieves the user token from localStorage
    return localStorage.getItem('id_token')
  }

  logout(){
    // Clear user token and profile data from localStorage
    localStorage.removeItem('id_token');
    localStorage.removeItem('profile');
  }

  _checkStatus(response) {
    // raises an error in case response status is not a success
    if (response.status >= 200 && response.status < 300) {
      return response
    } else {
      var error = new Error(response.statusText)
      error.response = response
      throw error
    }
  }

  fetch(url, options){
    // performs api calls sending the required authentication headers
    const headers = {
      'Accept': 'application/json',
      'Content-Type': 'application/json'
    }

    if (this.loggedIn()){
      headers['Authorization'] = 'Bearer ' + this.getToken()
    }

    return fetch(url, {
      headers,
      ...options
    })
    .then(this._checkStatus)
    .then(response => response.json())
  }
}

рд╕реБрд░рдХреНрд╖рд╛ рдкреГрд╖реНрдареЛрдВ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдЧрд▓рд╛ рдПрдХ HOC рд╣реИред рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рдЕрд╡рд╛рдВрдЫрд┐рдд рдлреНрд▓реИрд╢ рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП, рдкреЗрдЬ рдкрд╣рд▓реЗ рд░реЗрдВрдбрд░ рдкрд░ Loading... рд╕рд░реНрд╡рд░-рд░реЗрдВрдбрд░ рдХрд░реЗрдЧрд╛ рдЬрдмрдХрд┐ рд░рд┐рдПрдХреНрдЯ рдмреВрдЯ рдЕрдк/рд▓реЛрдХрд▓рд╕реНрдЯреЛрд░реЗрдЬ рд╕реЗ рдЯреЛрдХрди рдкрдврд╝рддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╕рдВрд░рдХреНрд╖рд┐рдд рдкреГрд╖реНрда рдПрд╕рдИрдУ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ, рдЬреЛ рд╢рд╛рдпрдж рдЕрднреА рддрдХ рдареАрдХ рд╣реИ, рд▓реЗрдХрд┐рди рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЗрд╖реНрдЯрддрдо рдирд╣реАрдВ рд╣реИред

// utils/withAuth.js - a HOC for protected pages
import React, {Component} from 'react'
import AuthService from './auth'

export default function withAuth(AuthComponent) {
    const Auth = new AuthService('http://localhost:5000')
    return class Authenticated extends Component {
      constructor(props) {
        super(props)
        this.state = {
          isLoading: true
        };
      }

      componentDidMount () {
        if (!Auth.loggedIn()) {
          this.props.url.replaceTo('/')
        }
        this.setState({ isLoading: false })
      }

      render() {
        return (
          <div>
          {this.state.isLoading ? (
              <div>LOADING....</div>
            ) : (
              <AuthComponent {...this.props}  auth={Auth} />
            )}
          </div>
        )
      }
    }
}
// ./pages/dashboard.js
// example of a protected page
import React from 'react'
import withAuth from  '../utils/withAuth'

class Dashboard extends Component {
   render() {
     const user = this.props.auth.getProfile()
     return (   
         <div>Current user: {user.email}</div>
     )
   }
}

export default withAuth(Dashboard) 

рд▓реЙрдЧрд┐рди рдкреЗрдЬ рдПрдЪрдУрд╕реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЕрднреА рдЦрдбрд╝рд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд▓реЙрдЧрд┐рди рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рддреЛ рдпрд╣ рд╕реАрдзреЗ AuthService рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рддрд╛ рд╣реИред рдЖрдк рд╕рд╛рдЗрдирдЕрдк рдкреЗрдЬ рдХреЗ рд▓рд┐рдП рднреА рдХреБрдЫ рдРрд╕рд╛ рд╣реА рдХрд░реЗрдВрдЧреЗред

// ./pages/login.js
import React, {Component} from 'react'
import AuthService from '../utils/AuthService'

const auth = new AuthService('http://localhost:5000')

class Login extends Component {
  constructor(props) {
    super(props)
    this.handleSubmit = this.handleSubmit.bind(this)
  }

  componentDidMount () {
    if (auth.loggedIn()) {
      this.props.url.replaceTo('/admin')   // redirect if you're already logged in
    }
  }

  handleSubmit (e) {
    e.preventDefault()
    // yay uncontrolled forms!
    auth.login(this.refs.email.value, this.refs.password.value)
      .then(res => {
        console.log(res)
        this.props.url.replaceTo('/admin')
      })
      .catch(e => console.log(e))  // you would show/hide error messages with component state here 
  }

  render () {
    return (
      <div>
         Login
          <form onSubmit={this.handleSubmit} >
            <input type="text" ref="email"/>
            <input type="password" ref="password"/>
            <input type="submit" value="Submit"/>
          </form>
      </div>
    )
  }
}

export default Login

Airbnb рдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рд╢реИрд▓реА рд╕реЗ рдкреНрд░реЗрд░рд┐рдд рд╣реЛрдХрд░, рдореИрдВрдиреЗ next-with-auth lib рдкрд░ рднреА рдХрд╛рдо рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛, рдЬреЛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реЛрдЧрд╛ рдЬреЛ рдкреГрд╖реНрдареЛрдВ рдкрд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ HOC рд▓реМрдЯрд╛рдПрдЧрд╛ред рдореИрдВрдиреЗ AuthService рдФрд░ рдЗрд╕ рдПрдЪрдУрд╕реА рдХреЗ рд╡рд┐рд▓рдп рдХреЗ рд╕рд╛рде рднреА рдЦреЗрд▓рд╛ред рдПрдХ рд╕рдорд╛рдзрд╛рди рдпрд╣ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдПрдЪрдУрд╕реА рдХреЛ рдШрдЯрдХ рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдПрдХ рдЕрдиреБрдорддрд┐ рд╕реНрддрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд░реЗрдбрдХреНрд╕ рдХрдиреЗрдХреНрдЯ рдЬреИрд╕реЗ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рдПред рднрд▓реЗ рд╣реА, рдореЗрд░реЗ рджрд┐рдорд╛рдЧ рдореЗрдВ, рдЖрдк рдЗрд╕ рддрд░рд╣ next-with-auth рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ:

// ./utils/withAuth.js
import nextAuth from 'next/auth'
import parseScopes from './parseScopes'

const Loading = () => <div>Loading...</div>

export default nextAuth({
  url: 'http://localhost:5000',
  tokenEndpoint: '/api/token',
  profileEndpoint: '/api/me',
  getTokenFromResponse: (res) => res.id_token,
  getProfileFromResponse: (res) => res,
  parseScopes,
})

Redux рдХреЗ рд╕рд╛рде рдпрд╣ рд╕рдм рдХрд░рдирд╛ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд░реВрдк рд╕реЗ рдЬрдЯрд┐рд▓ рд▓рдЧ рд░рд╣рд╛ рдерд╛, рд▓реЗрдХрд┐рди рдореВрд▓ рд░реВрдк рд╕реЗ рдЖрдк рд╡рд┐рдХреА рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди AuthService рдХреЛ рдХреНрд░рд┐рдпрд╛рдУрдВ (рд▓реЙрдЧрд┐рди рдФрд░ рд▓реЙрдЧрдЖрдЙрдЯ) рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд░реЗрдбреНрдпреВрд╕рд░ рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдк рдХреЗрд╡рд▓ рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд░ рдЗрди рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╕рд░реНрд╡рд░ рдкрд░ рд╕реНрдерд╛рдиреАрдп рд╕реНрдЯреЛрд░реЗрдЬ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдЗрд╕реЗ рдЕрдкрдиреЗ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдЬрд╛рдВрдЪрдирд╛ рд╣реЛрдЧрд╛ред рдЕрдВрддрддрдГ, redux store рдХреЛ рд╡реИрд╕реЗ рднреА window рдкрд░ рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред рддреЛ рдЖрдк рд╕рдВрджрд░реНрдн рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ window рдкрд░ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХреИрд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдк redux рдирд╣реАрдВ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк react-broadcast рднреА рдЖрдЬрд╝рдорд╛ рд╕рдХрддреЗ рд╣реИрдВред

рдЕрдВрдд рдореЗрдВ, next/server рдЬрд╣рд╛рдЬреЛрдВ рдХреЛ #25 рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдорд╛рдирдХрд░ред next-with-auth рдорд┐рдбрд▓рд╡реЗрдпрд░ + рдПрдХ рдПрдЪрдУрд╕реА рдХреЗ рд╕рд╛рде рдбреЗрд╡рд▓рдкрд░ рд╕реЗ рдЬрдЯрд┐рд▓ рдЬрдЯрд┐рд▓ рд╕реНрдерд╛рдиреАрдп рд╕реНрдЯреЛрд░реЗрдЬ рдмрдирд╛рдо рдХреБрдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдЕрдореВрд░реНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдЯреЛрдХрди рд░рд┐рдлреНрд░реЗрд╢рд┐рдВрдЧ рдХреЛ рднреА рд╣реИрдВрдбрд▓ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдЗрд╕реЗ рдЖрдЬрдорд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрддреНрд╕рд╛рд╣рд┐рдд! рдмреЗрдпрд░рдмреЛрди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж :)

@jaredpalmer рдореИрдВ рдХреБрдЫ рдЗрд╕реА рддрд░рд╣ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реВрдБред рдЬрдм рдХрд┐рд╕реА рдШрдЯрдХ рдХреЛ рд╕рд░реНрд╡рд░ рд╕рд╛рдЗрдб рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдЖрдкрдХрд╛ AuthService рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ? рд╕рд░реНрд╡рд░ рдХреЛ JWT рддрдХ рдкрд╣реБрдВрдЪ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рд╕реНрдерд╛рдиреАрдп рднрдВрдбрд╛рд░рдг рд╕реЗ рдирд╣реАрдВ рдкрдврд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

@amccloud рдпрд╣ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдпрд╣реА рд╣реИ рд╕рд╛рд░рд╛ рдорд╕рд▓рд╛ред рдПрдЪрдУрд╕реА рд╕рдВрд░рдХреНрд╖рд┐рдд рдорд╛рд░реНрдЧреЛрдВ рдкрд░ <div>Loading..</div> рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЯреЛрдХрди рдХреЛ рдкрдврд╝рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдпрд╣ рддрдп рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ componentDidMount рдореЗрдВ рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ рдХрд░рдирд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред рдЗрд╕рдХреЗ рд▓рд┐рдП рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдЖрдк рдЗрд╕реЗ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рд╕рд░реНрд╡рд░-рд╕рд╛рдЗрдб рдкреНрд░рд╕реНрддреБрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЗрд╕рдХреЗ рд▓рд┐рдП # 25 рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдпрд╛ рдХрдо рд╕реЗ рдХрдо рдЬреЗрдбрдмреНрд▓реНрдпреВрдЯреА AFAIK рдХреЗ рдореВрд▓реНрдп рдХреЗ рд╕рд╛рде рдХреБрдХреА рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реИред

рдореИрдВрдиреЗ рдХреБрдХреА рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдХреА-рдЬреЗрдПрд╕ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рд╣реИрдХ рдХрд╛ рдереЛрдбрд╝рд╛ рд╕рд╛ рд╣реИ ..
рдмрд╛рдд рдпрд╣ рд╣реИ: рдпрджрд┐ рдЖрдк рдХреБрдХреА рдирд╣реАрдВ рднреЗрдЬрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдкреНрд░рдорд╛рдгрд┐рдд рдорд╛рд░реНрдЧреЛрдВ рдореЗрдВ рдиреЗрдХреНрд╕реНрдЯрдЬ рдФрд░ рд╕рд░реНрд╡рд░ рд╕рд╛рдЗрдб рд░реЗрдВрдбрд░рд┐рдВрдЧ рдХреЗ рд╕рднреА рд▓рд╛рдн рдЦреЛ рджреЗрддреЗ рд╣реИрдВ

@jaredpalmer рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИ! рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдореИрдВ рдЕрдЧрд▓реЗ рджрд┐рдиреЛрдВ рдореЗрдВ рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реВрдБрдЧрд╛ (рдпрд╛ рдпрджрд┐ рдЖрдк рдЪрд╛рд╣реЗрдВ рддреЛ рдЗрд╕реЗ рдХрд░рдиреЗ рдореЗрдВ рдЖрдкрдХреА рд╕рд╣рд╛рдпрддрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ)

рдпреЛ! рдореИрдВрдиреЗ рдпрд╣рд╛рдБ nextjs рдФрд░ auth0 рдХреЗ рд╕рд╛рде рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд┐рдпрд╛: https://github.com/luisrudge/next.js-auth0
рдЗрд╕рдореЗрдВ рдПрдХ рдореБрдЦреНрдп рд▓реЗрдЖрдЙрдЯ рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рд╣реИ рдФрд░ "рд╕реБрд░рдХреНрд╖рд┐рдд рдкреГрд╖реНрда" рднреА рд╣реИрдВ рдЬреЛ рдХреЗрд╡рд▓ рддрдм рд▓реЛрдб рд╣реЛрддреЗ рд╣реИрдВ рдЬрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреНрд░рдорд╛рдгрд┐рдд рд╣реЛрддрд╛ рд╣реИред
рдореБрдЭреЗ рдмрддрд╛рдПрдВ рдХрд┐ рдЖрдк рдХреНрдпрд╛ рд╕реЛрдЪрддреЗ рд╣реИрдВ

@luisrudge рдЕрджреНрднреБрддред рдореИрдВ рдХреНрд▓реЛрдирд┐рдВрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдХреБрдЫ рдмрджрд▓рд╛рд╡ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рд▓реЗрдХрд┐рди рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд▓рдЧ рд░рд╣рд╛ рд╣реИ

рдардВрдбрд╛! рдЖрдкрдХреЛ рдХреНрдпрд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдореЗрдВ рдХреНрдпрд╛ рдХрдореА рд╣реИ? рдЖрдк рдХреНрдпрд╛ рдмрджрд▓рд╛рд╡ рд╕реЛрдЪ рд░рд╣реЗ рд╣реИрдВ?

рд╕реВрд░реНрдп, рдирд╡рдореНрдмрд░ 6, 2016 рдХреЛ 1:12 PM рдкрд░ -0200 рдкрд░, "рджрд╛рди Zajdband" < [email protected] [email protected] > рдиреЗ рд▓рд┐рдЦрд╛:

@luisr udgehttps://github.com/luisrudge рдЕрджреНрднреБрддред рдореИрдВ рдХреНрд▓реЛрдирд┐рдВрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдХреБрдЫ рдмрджрд▓рд╛рд╡ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рд▓реЗрдХрд┐рди рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд▓рдЧ рд░рд╣рд╛ рд╣реИ

рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ, рдЗрд╕реЗ Gi tHubhttps://github.com/zeit/next.js/issues/153#issuecomment -258687108 рдкрд░ рджреЗрдЦреЗрдВ, рдпрд╛ рдкрдврд╝рдиреЗ рдХреЛ рдореНрдпреВрдЯ рдХрд░реЗрдВ https://github.com/notifications/unsubscribe-auth/ AA5cE8NIsvQ_ITjc1gArTFgNXzEda4TSks5q7e5NgaJpZM4KkJmiред

1) рд▓рд╛рдЗрдирд┐рдВрдЧ рдХреЗ рд▓рд┐рдП standard рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ (рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╣рд░ рдЙрд╕ рдЪреАрдЬ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рдЖрдЧреЗ рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВ)
2) @rauchg . рджреНрд╡рд╛рд░рд╛ рдЕрдиреБрд░реЛрдзрд┐рдд рдорд▓реНрдЯреА-рдЯреИрдм рд╕рдорд░реНрдерди рдЬреЛрдбрд╝рдирд╛
3) рд╕реАрдПрд╕рдПрд╕ рднрд╛рдЧ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ

рдореИрдВ рдЖрдкрдХреЛ рдПрдХ рдЬрдирд╕рдВрдкрд░реНрдХ рднреЗрдЬреВрдВрдЧрд╛ :)

рдорд▓реНрдЯреА рдЯреИрдм рд╕рдкреЛрд░реНрдЯ рд╕реЗ рдЖрдк рдХреНрдпрд╛ рд╕рдордЭрддреЗ рд╣реИрдВ?

рд╕реВрд░реНрдп, рдирд╡рдореНрдмрд░ 6, 2016 рдХреЛ 1:16 PM рдкрд░ -0200 рдкрд░, "рджрд╛рди Zajdband" < [email protected] [email protected] > рдиреЗ рд▓рд┐рдЦрд╛:

1) рд▓рд╛рдЗрдирд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ (рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╣рд░ рдЙрд╕ рдЪреАрдЬрд╝ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рдЖрдЧреЗ рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВ)
2) @rauchghttps :
3) рд╕реАрдПрд╕рдПрд╕ рднрд╛рдЧ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ

рдореИрдВ рдЖрдкрдХреЛ рдПрдХ рдЬрдирд╕рдВрдкрд░реНрдХ рднреЗрдЬреВрдВрдЧрд╛ :)

рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ, рдЗрд╕реЗ Gi tHubhttps://github.com/zeit/next.js/issues/153#issuecomment -258687373 рдкрд░ рджреЗрдЦреЗрдВ, рдпрд╛ рдкрдврд╝рдиреЗ рдХреЛ рдореНрдпреВрдЯ рдХрд░реЗрдВ https://github.com/notifications/unsubscribe-auth/ AA5cE1A6jq4KZc9_ynukTCI4mU-rdsNaks5q7e81gaJpZM4KkJmiред

рдЖрдкрдХреЗ рдкрд╛рд╕ 2 рдЦреБрд▓реЗ рдЯреИрдм рд╣реИрдВ, 1 рдкрд░ рд▓реЙрдЧрдЖрдЙрдЯ рдХрд░реЗрдВ, рджреВрд╕рд░реЗ рдкрд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд▓реЙрдЧ рдЖрдЙрдЯ рдХрд░реЗрдВ

рдЖрд╣ред рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИ!

рд╕реВрд░реНрдп, рдирд╡рдореНрдмрд░ 6, 2016 рдХреЛ 1:21 PM рдкрд░ -0200 рдкрд░, "рджрд╛рди Zajdband" < [email protected] [email protected] > рдиреЗ рд▓рд┐рдЦрд╛:

рдЖрдкрдХреЗ рдкрд╛рд╕ 2 рдЦреБрд▓реЗ рдЯреИрдм рд╣реИрдВ, 1 рдкрд░ рд▓реЙрдЧрдЖрдЙрдЯ рдХрд░реЗрдВ, рджреВрд╕рд░реЛрдВ рдкрд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд▓реЙрдЧ рдЖрдЙрдЯ рдХрд░реЗрдВ

рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ, рдЗрд╕реЗ Gi tHubhttps://github.com/zeit/next.js/issues/153#issuecomment -258687707 рдкрд░ рджреЗрдЦреЗрдВ, рдпрд╛ рдкрдврд╝рдиреЗ рдХреЛ рдореНрдпреВрдЯ рдХрд░реЗрдВ https://github.com/notifications/unsubscribe-auth/ AA5cE9e2DA4_GgNQIVTMp0hx74G-6RmUks5q7fBfgaJpZM4KkJmiред

рдирдорд╕реНрддреЗ @luisrudge рдореИрдВрдиреЗ рдЖрдкрдХреЛ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдкреАрдЖрд░ рднреЗрдЬрд╛ рд╣реИ https://github.com/luisrudge/next.js-auth0/pull/2

рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХрд╛ рдмрд╣реБрдд-рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рдж <3

рдмреАрдЯреАрдбрдмреНрд▓реНрдпреВ рдпрд╣ рдкрд░рд┐рдгрд╛рдо рд╣реИ:

2016-11-06 11 14 31

@improunciable @luisrudge рд╢рд╛рдирджрд╛рд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди! рдпрджрд┐ рдЖрдк рдЗрд╕реЗ Auth0 рдХреЗ рдмрд┐рдирд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдХреЗрд╡рд▓ ./utils dir рдореЗрдВ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рд╢рд╛рдпрдж рдХреЗрд╡рд▓ lock.js ред рдореИрдВ рдЗрд╕реЗ рдЬрд▓реНрдж рд╣реА рдЖрдЬрдорд╛рдКрдВрдЧрд╛ред рдмреАрдЯреАрдбрдмреНрд▓реНрдпреВ рдорд▓реНрдЯреА-рдЯреИрдм рдХрдорд╛рд▓ рдХрд╛ рджрд┐рдЦрддрд╛ рд╣реИ

@ugiacoman рдореИрдВрдиреЗ passwordless.net рдХреЗ рд╕рд╛рде рдПрдХ рдЫреЛрдЯрд╛ рд╕рд░реНрд╡рд░ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ рд╣реИ, рдореБрдЭреЗ рдмрддрд╛рдПрдВ рдХрд┐ рдХреНрдпрд╛ рдЖрдк рдореЗрд░реЗ рдХреЛрдб рдХреЛ рд╢реБрд░реБрдЖрддреА рдмрд┐рдВрджреБ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ

@improunciable рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛! рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЯреНрд╡рд┐рдЯрд░ рдлреИрдмреНрд░рд┐рдХ рдХреЗ рдЕрдВрдХреЛрдВ рдХреЗ рд╕рд╛рде рдХреБрдЫ рдРрд╕рд╛ рд╣реА рдХрд░рдиреЗ рдЬрд╛ рд░рд╣рд╛ рдерд╛ред

@impronuncible рдореИрдВ рд╕реБрдЭрд╛рд╡

рдзрдиреНрдпрд╡рд╛рдж @improunciable тЭдя╕П

@ugiacoman рд╣рд╛рдБ, auth0 рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рд╣рдЯрд╛рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИред рдореИрдВрдиреЗ рдЗрд╕рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдСрде рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдПрдкреАрдЖрдИ рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛ рдерд╛

@jaredpalmer рдЬрд╣рд╛рдБ рддрдХ рдореБрдЭреЗ рдкрддрд╛ рд╣реИ, #25 рд╣реЛрдирд╛ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рд▓реЗрдХрд┐рди рдЕрд╡рд░реБрджреНрдз рдирд╣реАрдВ рд╣реЛ рд░рд╣рд╛ рд╣реИ? рдореЗрд░рд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╣рдо рд╕рд░реНрд╡рд░ рд╕рд╛рдЗрдб рдХреА рдкрд╣реБрдВрдЪ рд╣реИ req рдореЗрдВ getInitialProps рддреЛ рдХреБрдЫ рднреА рдирд╣реАрдВ рд░реЛрдХрддрд╛ рд╣реИ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ cookie-parser рдпрд╣ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП? рд╕рд░реНрд╡рд░-рд╕рд╛рдЗрдб рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдФрд░ рд╕рддреНрд░ рдкреНрд░рдмрдВрдзрди рдореЗрд░реЗ рд▓рд┐рдП рдмрд┐рд▓реНрдХреБрд▓ рдирдпрд╛ рд╣реИ

localStorage рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╣реБрдП рдмреАрдЯреАрдбрдмреНрд▓реНрдпреВ рд╕рд░реНрд╡рд░-рд╕рд╛рдЗрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпрд╛ рдХреБрдХреАрдЬрд╝ рд╕рд░реНрд╡рд░-рд╕рд╛рдЗрдб рд╕рддреНрд░ рд░рдЦрдиреЗ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рддрд░реАрдХрд╛ рд╣реИ? рдореБрдЭреЗ рдПрдХ рдЕрд╕реНрдкрд╖реНрдЯ рдпрд╛рдж рд╣реИ рдХрд┐ рдпрд╣ рд╕рдмрд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ? рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдХреЛрдИ рдФрд░ рд╡рд┐рдХрд▓реНрдк рд╣реИ?

@sedubois

рдЕрдЧрд░ рдареАрдХ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдП рддреЛ рдХреБрдХреА рджреГрд╖реНрдЯрд┐рдХреЛрдг рдмрд╣реБрдд рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд░рдирд╛ рдХрд╛рдлреА рддреБрдЪреНрдЫ рд╣реИ:

  • httpOnly рдзреНрд╡рдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ (рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдХреБрдХреА рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рд╕реЗ рд░реЛрдХрддрд╛ рд╣реИ)
  • рд╕реБрд░рдХреНрд╖рд┐рдд рдзреНрд╡рдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ (рдХреЗрд╡рд▓ https рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд▓рд┐рдП рдХреБрдХреА рд╕реЗрдЯ рдХрд░реЗрдВ)
  • рд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рдХреБрдХреАрдЬрд╝ (рдХреБрдХреА рдХреЗ рд╕реНрд░реЛрдд рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░реЗрдВ)

рдЬрдм рдЖрдк рд╕реАрдзреЗ рд╕рд░реНрд╡рд░ рдкрд░ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдЬрд╛рдирдХрд╛рд░реА рддрдХ рдкрд╣реБрдБрдЪ рд╕рдХрддреЗ рд╣реИрдВ рддреЛ рдПрдХ рдмрд╣реБрдд рд╣реА рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡рд┐рд▓рдВрдмрддрд╛ рд▓рд╛рдн рднреА рд╣реЛрддрд╛ рд╣реИред

рд╣рдореЗрдВ рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЛ examples/ рдореЗрдВ рд▓реЗ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдореИрдВ рджреЗрдЦреВрдВрдЧрд╛ рдХрд┐ рдореИрдВ рдХрд┐рд╕рдХреЗ рд╕рд╛рде рдЖ рд╕рдХрддрд╛ рд╣реВрдВ

рдореИрдВрдиреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рддрд░реАрдХреЗ рд╕реЗ рдПрдХ рдХрд╕реНрдЯрдо рдПрдХреНрд╕рдкреНрд░реЗрд╕ рд╕рд░реНрд╡рд░ рдореЗрдВ рдиреЗрдХреНрд╕реНрдЯрдЬ рдХреЛ рд▓рдкреЗрдЯрдХрд░ рдЖрдЗрд╕реЛрдореЙрд░реНрдлрд┐рдХ рдХреБрдХреАрдЬрд╝ рдХреЗ рд▓рд┐рдП react-cookie рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд┐рдпрд╛ рд╣реИ:

const express = require('express')
const next = require('next')
const cookie = require('react-cookie')
const cookieParser = require('cookie-parser')

const app = next({ dev: true, dir: process.cwd() })
const handle = app.getRequestHandler()

app.prepare().then(() => {
  const server = express()
  server.use(cookieParser())       // <---- this line

  server.get('*', (req, res) => {
    cookie.plugToRequest(req, res) // <---- this line
    return handle(req, res)
  })

  server.listen(3000, (err) => {
    if (err) throw err
    console.log('> Ready on http://localhost:3000')
  })
})

рдпрд╣ рдореБрдЭреЗ рд╕рд░реНрд╡рд░ рдХреА рдУрд░ рд╕реЗ рдкреНрд░рдорд╛рдгрд┐рдд рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдпрд╣ рдореВрд▓ рдЧреЛрд▓рд┐рдпреЛрдВ рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рднреА рдореБрджреНрджреЗ рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдЗрд╕рдиреЗ рдХреНрд▓рд╛рдЗрдВрдЯ рдФрд░ рд╕рд░реНрд╡рд░ рдХреЗ рдмреАрдЪ рд╕реНрдерд┐рддрд┐ рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд┐рдпрд╛ рд╣реИред

рдХрд┐рд╕реА рдРрд╕реЗ рд╡реНрдпрдХреНрддрд┐ рдХреЗ рдкреАрдУрд╡реА рд╕реЗ рдЬреЛ рдЗрд╕ рд╕рд╛рдорд╛рди рдХреЛ рдмрд╣реБрдд рдХреБрдЫ рд╕реАрдЦ рд░рд╣рд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдЙрджрд╛рд╣рд░рдг рддреГрддреАрдп рдкрдХреНрд╖ рд╕реЗрд╡рд╛рдУрдВ рдЬреИрд╕реЗ auth0 рдкрд░ рдирд┐рд░реНрднрд░ рдирд╣реАрдВ рд╣реИрдВред рдирд╡рд╛рдЧрдВрддреБрдХреЛрдВ рдХреЗ рд▓рд┐рдП рд▓реЙрдЧрд┐рди/рд╕рд╛рдЗрдирдЕрдк рдлреЙрд░реНрдо рдФрд░ Redux рдФрд░ JWT рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдзрд┐рдХ рдирдВрдЧреЗ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦрдирд╛ рдЕрдзрд┐рдХ рдлрд╛рдпрджреЗрдордВрдж рд╣реЛрдЧрд╛ред

рд╣рдо _bundle_ рдХреЗ рд▓рд┐рдП рдЬрд┐рд╕ рдЙрджрд╛рд╣рд░рдг рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВ, рд╡рд╣ рдУрдкрди-рд╕реЛрд░реНрд╕ Node.js рд╕рд░реНрд╡рд░ APIs рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реЛрдЧрд╛

рдореИрдВрдиреЗ https://github.com/iaincollins/nextjs-starter рдкрд░ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╕реНрдЯрд╛рд░реНрдЯрд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдИрдореЗрд▓ рдЖрдзрд╛рд░рд┐рдд рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдЬреЛрдбрд╝рд╛ рд╣реИ

рдЗрд╕рдореЗрдВ рд╕реЗрд╢рди рд╕рдкреЛрд░реНрдЯ рд╣реИ (рдмреИрдХрдПрдВрдб рдкрд░ рдПрдХреНрд╕рдкреНрд░реЗрд╕ рд╕реЗрд╢рдВрд╕ рдФрд░ рдлреНрд░рдВрдЯ рдПрдВрдб рдкрд░ рдХреИрд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмреНрд░рд╛рдЙрдЬрд░ рд╕реЗрд╢рдирд╕реНрдЯреЛрд░реЗрдЬ рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде), рдПрдЪрдЯреАрдЯреАрдкреА рдУрдирд▓реА рдХреБрдХреАрдЬ, рд╕реАрдПрд╕рдЖрд░рдПрдл рдкреНрд░реЛрдЬреЗрдХреНрд╢рди, рдИрдореЗрд▓ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдПрд╕рдПрдордЯреАрдкреА рдореЗрдВ рдирд┐рд░реНрдорд┐рдд рдЙрдкрдпреЛрдЧ, рдмреИрдХрдПрдВрдб рдХреЛ рдмрджрд▓рдиреЗ рдореЗрдВ рдЖрд╕рд╛рди рд╣реИ рдЬреЛ рдПрд╕рдХреНрдпреВрдПрд▓ рд▓рд╛рдЗрдЯ рдореЗрдВ рдбрд┐рдлреЙрд▓реНрдЯ рдХрд░рддрд╛ рд╣реИ . рдЗрд╕реЗ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рд▓реЗрдЖрдЙрдЯ рдкреЗрдЬ, рдХрд╕реНрдЯрдо рд░реВрдЯ рднреА рд╣реИрдВ рдФрд░ рдЗрд╕рдореЗрдВ рд╡рд┐рдХреА рд╕реЗ рдШрдбрд╝реА рдХрд╛ рдЙрджрд╛рд╣рд░рдг рднреА рд╢рд╛рдорд┐рд▓ рд╣реИред рдпрд╣ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХрд╛ рд╕рдмрд╕реЗ рдкреНрд░рд╢рдВрд╕рдиреАрдп рдЙрджрд╛рд╣рд░рдг рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдорджрджрдЧрд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рд╕рд░рд▓ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд╕рд╛рде рд╢реБрд░реБрдЖрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬреЛ рд╕рдордЭрдиреЗ рдореЗрдВ рдЖрд╕рд╛рди рд╣реЛ рдФрд░ рдЗрд╕рдХреЗ рд╕рд╛рде рдЦреЗрд▓рдирд╛ рдЖрд╕рд╛рди рд╣реЛред

рдореИрдВ @iamjacks рд╕реЗ рд╕рд╣рдордд

рдореБрдЭреЗ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░рдиреЗ рдФрд░ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рдкреГрд╖реНрда рдЬреИрд╕реА рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдореЗрдВ рдкреНрд░рд╕рдиреНрдирддрд╛ рд╣реЛ рд░рд╣реА рд╣реИ рдЬрд┐рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдлреЗрд╕рдмреБрдХ, Google рдФрд░ рдЯреНрд╡рд┐рдЯрд░ рдХреЗ рд▓рд┐рдП oAuth рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдкрд╛рд╕рдкреЛрд░реНрдЯ рдПрдХреАрдХрд░рдг рдпрджрд┐ рдпрд╣ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ред рдЕрдЧрд░ рд▓реЛрдЧреЛрдВ рдХреЗ рдкрд╛рд╕ рдШрдЯрдХреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рддреНрд░ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдкреНрд░рдЪрд╛рд░рд┐рдд/рдЙрдЬрд╛рдЧрд░ рдХрд░рдиреЗ рдХреЗ рдмреЗрд╣рддрд░ рддрд░реАрдХреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдЪреНрдЫреЗ рд╡рд┐рдЪрд╛рд░ рд╣реИрдВ рддреЛ рдореБрдЭреЗ рдмрд╣реБрдд рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИред

Example screenshot showing what to expect

рдпрд╣ рдХрд╛рдлреА рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд╣реИ @iaincollinsред рд╣рдо рдЗрд╕реЗ 2.0 рдХреЗ рд░рд┐рд▓реАрдЬ рдиреЛрдЯреНрд╕ рдкрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВрдЧреЗ :)

@rauchg рдзрдиреНрдпрд╡рд╛рдж! :)

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рд╕рддреНрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдФрд░ рд╕рд░реНрд╡рд░ рджреЛрдиреЛрдВ рдЖрдзрд╛рд░рд┐рдд рд╣реИрдВ - рдпрд╛рдиреА рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд╕рд╛рде рдФрд░ рдмрд┐рдирд╛ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ (рдФрд░ рд╕рддреНрд░ рд╕реНрдЯреЛрд░реЗрдЬ рдХреЗ рдмрд┐рдирд╛ рд╕рд┐рд╕реНрдЯрдо рдкрд░), рдФрд░ рдПрдХ рд╣реА рд╕рддреНрд░ рджреЛрдиреЛрдВ рдореЗрдВ рд╕рд╛рдЭрд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рд╕реЗ рд╕рддреНрд░ рдШрдЯрдХ рдореЗрдВ рдереЛрдбрд╝рд╛ рд╕рд╛ рдЧрдбрд╝рдмрдбрд╝ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рд╕рд░реНрд╡рд░ рд╣реЗрдбрд░ рд╕реЗ рд╕реАрдПрд╕рдЖрд░рдПрдл рдЯреЛрдХрди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП req.connection._httpMessage.locals._csrf рдЬреИрд╕реЗ рдирд╛рдореЛрдВ рдХреЗ рд╕рд╛рде рдЪрд░ рдореЗрдВ рдЬрд╛рддрд╛ рд╣реИ - рдХреНрдпреЛрдВрдХрд┐ 'req' рдСрдмреНрдЬреЗрдХреНрдЯ getInitialProps() рдореЗрдВ рдкреГрд╖реНрдареЛрдВ рдХреЛ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрддреНрд╕реБрдХрддрд╛ рд╕реЗ рдПрдХреНрд╕рдкреНрд░реЗрд╕ рдореЗрдВ рдЙрдЬрд╛рдЧрд░ рдХрд┐рдП рдЧрдП req рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реЗ рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдЗрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ req.locals._csrf рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХреНрд╕реЗрд╕ рдХрд░рддрд╛ рд╣реВрдВ (рд╣рд╛рд▓рд╛рдБрдХрд┐ req.session рджреЛрдиреЛрдВ рдореЗрдВ рд╕рдорд╛рди рд╣реИ)ред

рд▓реЛрдХрд▓рд╕реНрдЯреЛрд░реЗрдЬ рд╕реБрд░рдХреНрд╖рд┐рдд рдирд╣реАрдВ рд╣реИред рдЗрд╕реЗ рдФрд░ рдЕрдзрд┐рдХ рд╕реБрд░рдХреНрд╖рд┐рдд рдмрдирд╛рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рдХреНрдпрд╛ рд╣реИред рдХреЛрдИ рднреА рд╕реНрдерд╛рдиреАрдп рд╕реНрдЯреЛрд░реЗрдЬ рдбреЗрдЯрд╛ рдЪреБрд░рд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рдЕрдкрдиреЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдбрд╛рд▓ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдкреАрдбрд╝рд┐рдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЙрдЧ рдЗрди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ !!

@ рдЪрдереБрд▓рд╛ рдпрд╣ рд╕рдЪ рдирд╣реАрдВ рд╣реИред рдпрд╣ рддрд░реНрдХ рдЧрд▓рдд рд╣реИред
рдпрджрд┐ рдХрд┐рд╕реА рдХреЗ рдкрд╛рд╕ рднреМрддрд┐рдХ рд░реВрдк рд╕реЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рддрдХ рдкрд╣реБрдВрдЪ рд╣реИ, рддреЛ рд╡реЗ рдХреБрдЫ рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдХреБрдХреАрдЬрд╝ рдХреЗ рд▓рд┐рдП рднреА рдпрд╣реА рд╕рдЪ рд╣реИред

рдСрде рдХреЗ рд▓рд┐рдП рд▓реЛрдХрд▓рд╕реНрдЯреЛрд░реЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдХреБрдХреА рдЖрдзрд╛рд░рд┐рдд рд╕реЗрдХреЗрдВрдб рдореБрджреНрджреЛрдВ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред
рд▓реЗрдХрд┐рди рджреВрд╕рд░реА рдУрд░, рдпрд╣ SSR рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИред

@arunoda рдореИрдВрдиреЗ Laravel API рдФрд░ Next.js рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рд╕рд╛рде рд▓реЙрдЧрд┐рди рдмрдирд╛рдпрд╛ рд╣реИред рдореИрдВ рд╕реНрдерд╛рдиреАрдп рд╕реНрдЯреЛрд░реЗрдЬ рдХреЗ рдЕрдВрджрд░ authUser access_token рд╕реНрдЯреЛрд░ рдХрд░рддрд╛ рд╣реВрдВред рдлрд┐рд░ рдкреНрд░рдорд╛рдгрд┐рдд рдХрд░рдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд▓реЙрдЧ рдЗрди рдХрд░реЗрдВ рдпрд╛ рдирд╣реАрдВ рдЬрд╛рдВрдЪреЗрдВред рд▓реЗрдХрд┐рди рдпрд╣ рд╕реБрд░рдХреНрд╖рд┐рдд рдирд╣реАрдВ рд╣реИред рдЕрдЧрд░ рдХрд┐рд╕реА рдиреЗ рд▓реЛрдХрд▓рд╕реНрдЯреЛрд░реЗрдЬ рдбреЗрдЯрд╛ рдЪреБрд░рд╛ рд▓рд┐рдпрд╛ рд╣реИред рд╡рд╣ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛/рд╕рдХрддреА рд╣реИред

рдЕрдЧрд░ рдХрд┐рд╕реА рдиреЗ рд▓реЛрдХрд▓рд╕реНрдЯреЛрд░реЗрдЬ рдбреЗрдЯрд╛ рдЪреБрд░рд╛ рд▓рд┐рдпрд╛ рд╣реИред

рдХреИрд╕реЗ? рдореВрд▓ рд░реВрдк рд╕реЗ рдЙрд╕рдХреЗ рдкрд╛рд╕ рднреМрддрд┐рдХ рд░реВрдк рд╕реЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рддрдХ рдкрд╣реБрдВрдЪ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рддрдм рд╡рд╣ рд╡реНрдпрдХреНрддрд┐ рдХреБрдЫ рднреА рдХрд░ рд╕рдХрддрд╛ рдерд╛ред
рдРрд╕реЗ рдореЗрдВ рд╣рдореЗрдВ рдЗрд╕рдХреА рдЪрд┐рдВрддрд╛ рдирд╣реАрдВ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдПред

рдХреНрдпрд╛ рд╣рдо рдЗрд╕реЗ рдФрд░ рдЕрдзрд┐рдХ рд╕реБрд░рдХреНрд╖рд┐рдд рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ?

@рдЪрдереБрд▓рд╛ рдпрд╣ рд╡рд┐рд╖рдп рд╕реЗ рд╣рдЯрдХрд░ рд╣реИред рдпрд╣ Next.js рдХреЗ рд▓рд┐рдП рдмрд┐рд▓реНрдХреБрд▓ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдирд╣реАрдВ рд╣реИ рдФрд░ рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рд╡реЗрдм рд╕рд╛рдордЧреНрд░реА рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреА рд╣реИред

@ рдЪрдереБрд▓рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЙрдкрд░реЛрдХреНрдд рд╕реНрдЯрд╛рд░реНрдЯрд░-рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдПрдХ рдирдпрд╛ рдзрд╛рдЧрд╛ рд╢реБрд░реВ рдХрд░ рд╕рдХреЗрдВред

@arunoda рд╣рд╛рд╣рд╛ !! рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж! :рдбреА

@ рдЪрдереБрд▓рд╛ рдЕрдЧрд░ рдЖрдкрдХреЛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЪрд┐рдВрддрд╛рдПрдВ рд╣реИрдВ рддреЛ рд╕реНрдЯрд╛рд░реНрдЯрд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рдореБрджреНрджреЗ рдкрд░ рдореБрдЭреЗ рдФрд░ рдЕрдзрд┐рдХ рдЪрд░реНрдЪрд╛ рдХрд░рдиреЗ рдореЗрдВ рдЦреБрд╢реА рд╣реЛ рд░рд╣реА рд╣реИред

рд▓реЛрдЧреЛрдВ рдХреЛ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд░реВрдк рд╕реЗ рдЪрд┐рдВрддрд┐рдд рд╣реЛрдиреЗ рд╕реЗ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдХрд┐рд╕реА рднреА рдЧрд╝рд▓рддрдлрд╝рд╣рдореА рдХреЛ рджреВрд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдБред

рд╡реЗрдм рд╕реНрдЯреЛрд░реЗрдЬ рдПрдкреАрдЖрдИ (рдпрд╛рдиреА рд▓реЛрдХрд▓рд╕реНрдЯреЛрд░реЗрдЬ рдФрд░ рд╕реЗрд╢рдирд╕реНрдЯреЛрд░реЗрдЬ) рд╣реИ - рдмрд┐рдирд╛ httpOnly рд╕реЗрдЯ рдХреЗ рдХреБрдХреАрдЬ рдХреА рддрд░рд╣ - рд╕рдорд╛рди рдореВрд▓ рдиреАрддрд┐ (рдкреНрд░реЛрдЯреЛрдХреЙрд▓, рд╣реЛрд╕реНрдЯрдирд╛рдо, рдкреЛрд░реНрдЯ рдирдВрдмрд░) рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд, рдпрд╣ рд╕рдЪ рдирд╣реАрдВ рд╣реИ рдХрд┐ "рдХреЛрдИ рднреА [рдЗрд╕реЗ] рдЪреБрд░рд╛ рд╕рдХрддрд╛ рд╣реИ"; рд▓реЗрдХрд┐рди рд╣рд╛рдБ рдпрджрд┐ рдХреЛрдИ рдЖрдкрдХреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдХреНрд░реЙрд╕ рд╕рд╛рдЗрдЯ рд╕реНрдХреНрд░рд┐рдкреНрдЯрд┐рдВрдЧ рднреЗрджреНрдпрддрд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЖрдкрдХреА рд╕рд╛рдЗрдЯ рдкрд░ рдордирдорд╛рдиреА рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИ рддреЛ рд╡реЗ рд╕реНрдЯреЛрд░ рддрдХ рднреА рдкрд╣реБрдВрдЪ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдЗрд╕рдореЗрдВ рд╕рддреНрд░ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рд╕реНрдЯреЛрд░ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рд╕рддреНрд░ рдЯреЛрдХрди рд╕реНрдерд╛рдиреАрдп рд╕реНрдЯреЛрд░реЗрдЬ/рд╕рддреНрд░ рд╕реНрдЯреЛрд░реЗрдЬ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдирд╣реАрдВ рд╣реИ рдФрд░ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдкрдврд╝рдиреЗ рдпреЛрдЧреНрдп рдирд╣реАрдВ рд╣реИ, рдпрд╣ рдХреЗрд╡рд▓ HTTP рдХреЗрд╡рд▓ рдХреБрдХреА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░реЗрд╖рд┐рдд рд╣реЛрддрд╛ рд╣реИ (рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рд╕рддреНрд░ рд╡рд░реНрдЧ рд▓рд╛рдиреЗ рдХреЗ рдмрдЬрд╛рдп XMLHttpRequest() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ () - рдЬреИрд╕рд╛ рдХрд┐ рдХрдХреНрд╖рд╛ рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ)ред

рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рднрд▓реЗ рд╣реА рдХреЛрдИ рдЖрдкрдХреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдХреНрд░реЙрд╕ рд╕рд╛рдЗрдЯ рд╕реНрдХреНрд░рд┐рдкреНрдЯрд┐рдВрдЧ рднреЗрджреНрдпрддрд╛ рдХрд╛ рдлрд╛рдпрджрд╛ рдЙрдард╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛ рдФрд░ рдЖрдкрдХреЗ рд╡реЗрдм рдРрдк рдореЗрдВ рдордирдорд╛рдиреЗ рдврдВрдЧ рд╕реЗ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░ рд╕рдХреЗ, рдлрд┐рд░ рднреА рд╡реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рддреНрд░ рдЯреЛрдХрди рдХреЛ рдкрдврд╝ рдпрд╛ рдирд┐рд░реНрдпрд╛рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдпрд╣ рд╢рд╛рдпрдж рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рд╢реНрд░рдо рдХрд░рдиреЗ рд▓рд╛рдпрдХ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрдВрддрд░ рд╣реИред

рдиреЛрдЯ: рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдбреЗрдЯрд╛ рдХрд╛ рдЕрддрд┐рд░рд┐рдХреНрдд рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдпрд╣рд╛рдВ рдорджрджрдЧрд╛рд░ рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдРрдк рдХреЛ рд╣рдореЗрд╢рд╛ рдбреЗрдЯрд╛ рдХреЛ рдкрдврд╝рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рддрд╛рдХрд┐ рдЗрд╕реЗ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ (рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдРрдк рдореЗрдВ рдПрдХ рд╡рд┐рд╡рд░рдг рдХреБрдВрдЬреА рднреА рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдЬреЛ рдПрдиреНрдХреНрд░рд┐рдкреНрдЯрд┐рдВрдЧ рдкреНрд░рджрд╛рди рдХрд░реЗрдЧреА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдбреЗрдЯрд╛ рдХрд╛рдлреА рдореВрдЯ)ред

_рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ: рдкрд┐рдЫрд▓реЗ рдПрдХ рдпрд╛ рджреЛ рд╕рдкреНрддрд╛рд╣ рдореЗрдВ рд╕реЗрд╢рдирд╕реНрдЯреЛрд░реЗрдЬ рдкрд░ рд▓реЛрдХрд▓рд╕реНрдЯреЛрд░реЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрджрд╛рд╣рд░рдг рдХреЛ рдлрд┐рд░ рд╕реЗ рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдХреНрдпреЛрдВрдХрд┐ рд╕реЗрд╢рдирд╕реНрдЯреЛрд░реЗрдЬ рдХреЛ рдЯреИрдм рдХреЗ рдмреАрдЪ рд╕рд╛рдЭрд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЧреИрд░-рд╕реЗрдВрд╕рд┐рдЯрд┐рд╡ рдбреЗрдЯрд╛ рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рд╕реЗ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХреА рд╕рдВрдЦреНрдпрд╛ рдХрдо рд╣реЛ рдЬрд╛рддреА рд╣реИ рдФрд░ рд╕рддреНрд░ рдХреА рд╕реНрдерд┐рддрд┐ рдЯреИрдм рдХреЗ рдмреАрдЪ рд╕реБрд╕рдВрдЧрдд рд░рд╣рддреА рд╣реИред

рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛ, рдореИрдВрдиреЗ рдкреНрд░рдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдпрд╣ рдирдореВрдирд╛ рдРрдк рдмрдирд╛рдпрд╛ рд╣реИ:

https://github.com/possibilities/next.js-with-auth

рдЗрд╕ рдЦрд┐рд▓реМрдирд╛ рдмреИрдХрдПрдВрдб рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд:

https://github.com/possibilities/micro-auth

рдпрд╣рд╛рдВ рддреИрдирд╛рдд:

https://next-with-auth.now.sh/

рдпрд╣рд╛рдВ рдмреИрдХрдПрдВрдб:

https://micro-auth.now.sh/

@ рд╕рдВрднрд╛рд╡рдирд╛рдПрдБ рдзрдиреНрдпрд╡рд╛рдж рдорд╛рдЗрдХ! рд╕рд╛рде рд╣реА рдПрдХ рдЕрд▓рдЧ рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрд╡рд┐рд╕ рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рдирд╛ рдЬреЛ рд╕реБрд░рдХреНрд╖рд┐рдд рдкреГрд╖реНрдареЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдЬреЛ рдореИрдВ рд╕реЛрдЪ рд░рд╣рд╛ рдерд╛ рдХрд┐ рдпрд╣ рдЕрдЪреНрдЫрд╛ рдкреНрд░рдЬреНрдЮрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЗрд╕рд╕реЗ рдкреНрд░реЗрд░рдгрд╛ рд▓реЗ рд╕рдХрддрд╛ рд╣реИред рдореЗрд░реЗ рдкрд╛рд╕ рдХреБрдЫ рд╡рд┐рдЪрд╛рд░ рд╣реИрдВ рдЬреЛ рдЕрдЧрд▓реЗ.js-with-auth рд░реЗрдкреЛ рдореЗрдВ рдЙрдард╛рдП рдЬрд╛рдПрдВрдЧреЗред

рдХреБрдЫ рдФрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рд╢рд╛рдпрдж рдореИрдВ рдЕрдкрдиреЗ рдкреНрд░рдпрд╛рд╕реЛрдВ рдХреЛ рдПрдХ рдорд╣рд╛рди рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдКрдкрд░ рдирд╣реАрдВ рд░рдЦреВрдВрдЧрд╛ред рдореИрдВ рд╕рд╛рдЗрдирдЕрдк/рд╕рд╛рдЗрдирдЗрди рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╡реЗрдм 1.0 рд╢реИрд▓реА рд╕рдмрдорд┐рдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрджрд▓ рд╕рдХрддрд╛ рд╣реВрдВ рддрд╛рдХрд┐ рд╣рдо рд╕рд░реНрд╡рд░ рдкрд░ рдХреЗрд╡рд▓ HTTP рдХреБрдХреА рд╕реНрдерд╛рдкрд┐рдд рдХрд░ рд╕рдХреЗрдВ (рдПрдХреНрд╕рдПрд╕рдПрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬреЗрдбрдмреНрд▓реНрдпреВрдЯреА рддрдХ рдкрд╣реБрдВрдЪ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░ рд╕рдХреЗрдВ) рдФрд░ рдлрд┐рд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ req рдмрдЬрд╛рдп рд╕рдВрд▓рдЧреНрди рдХрд░реЗрдВ рдкреВрд░реЗ рдЯреЛрдХрди рдХреА рддреБрд▓рдирд╛ рдореЗрдВред рдпрд╣ рд╕реАрдПрд╕рдЖрд░рдПрдл рдХрдордЬреЛрд░рд┐рдпреЛрдВ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЛ рдЫреЛрдбрд╝ рджреЗрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХреНрд╕рдПрд╕рдПрд╕ (рдирд╣реАрдВ?) рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рдЕрдзрд┐рдХ рд╕рд░рд▓ рд╣реИред рдЗрд╕рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рд╛рдЗрдб рдЗрдлреЗрдХреНрдЯ рдпрд╣ рд╣реИ рдХрд┐ рдХреНрд▓рд╛рдЗрдВрдЯ рдРрдк рд╢рдкрде рд╕реЗрд╡рд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рд╛рдЗрди рдЗрди рдХрд░рддреЗ рд╕рдордп рд▓рдЧрднрдЧ рд╕рдорд╛рди рдкреНрд░рд╡рд╛рд╣ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдореИрдВ рдпрд╣ рднреА рджреЗрдЦрддрд╛ рд╣реВрдВ рдХрд┐ рдореИрдВ Page HoC рдХреЗ getInitialProps рдореЗрдВ рдХреБрдХреА рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдХреЗ "рдорд┐рдбрд▓рд╡реЗрдпрд░" (рдФрд░ рдЗрд╕рд▓рд┐рдП рдХрд╕реНрдЯрдо рд╕рд░реНрд╡рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛) рд╕реЗ рдмрдЪ рд╕рдХрддрд╛ рд╣реВрдВред

@рд╕рдВрднрд╛рд╡рдирд╛рдПрдВ рдЪреВрдВрдХрд┐ 'рд╕реАрдХреНрд░реЗрдЯ' рдкреЗрдЬ рд╕рд┐рд░реНрдл рдПрдХ рдкреЗрдЬ рд╣реИ рдФрд░

рд╣рд╛рдБ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рд░реНрд╡рд░-рд╕рд╛рдЗрдб рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд╛рдпрд░реНрдб рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдмреАрдЯреАрдбрдмреНрд▓реВ, рдореИрдВ рдЬреАрдердм рдХреЗ рд╕рд╛рде рд╕рд╛рдЗрди рдЗрди рдХрд░рдиреЗ рдХреА рдЕрдкрдиреА рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рд╡рд╛рдкрд╕ рд╡рд┐рдЪрд▓рд┐рдд рд╣реЛ рдЧрдпрд╛ред рдкреНрд░рд╡рд╛рд╣ рд╕реБрд░рдХреНрд╖рд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рджреЗрдЦрднрд╛рд▓ рдХреЗ рд╕рдорд╛рди рд╣реИ (рдЕрд░реНрдерд╛рддреН XSS рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдУрде рдЯреЛрдХрди рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рдиреЗ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд░ рдХрд┐рд╕реА рднреА рд░рд╣рд╕реНрдп рдХреЛ рдЙрдЬрд╛рдЧрд░ рдирд╣реАрдВ рдХрд░рдирд╛)ред рдпрд╣ рдПрдХ рдЙрдЪрд┐рдд рдРрдк рдореЗрдВ рдмрдВрдзрд╛ рд╣реБрдЖ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдХреЛрдИ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИ рддреЛ рдореИрдВ рдЗрд╕реЗ рдХрд┐рд╕реА рдРрд╕реА рдЪреАрдЬрд╝ рдореЗрдВ рддреЛрдбрд╝ рд╕рдХрддрд╛ рд╣реВрдВ рдЬреЛ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рд╢рдкрде рдкреНрд░рд╡рд╛рд╣ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддреА рд╣реИред

@ рд╕рдВрднрд╛рд╡рдирд╛рдПрдБ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рднрдпрд╛рдирдХ рдорджрдж рд╣реЛрдЧреА, рдЕрдЧрд░ рдХреЛрдИ рдиреНрдпреВрдирддрдо (рд▓реЗрдХрд┐рди рдЙрдЪрд┐рдд) рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рдкреАрдЖрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдореИрдВ рдЕрдкрдиреЗ рдРрдк рдореЗрдВ рдСрде рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реВрдВ (https://github.com/relatenow/ рд╕рдВрдмрдВрдзрд┐рдд) рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдХреЗрд╡рд▓ рдХреНрд▓рд╛рдЗрдВрдЯ-рд╕рд╛рдЗрдб (рд▓реЛрдХрд▓рд╕реНрдЯреЛрд░реЗрдЬ) рд╣реИред

@sedubois рдореЗрд░реЗ рдкрд╛рд╕ https://github.com/zeit/next.js/pull/646 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЬрдирд╕рдВрдкрд░реНрдХ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рдХрд╣реАрдВ рдФрд░ рдСрде рд╕рд░реНрд╡рд░ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реЗрдВрдЧреЗ

рдЧреНрд░рд╛рдлрд╝рд┐рдХрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛?

рдЕрдкреЛрд▓реЛ рдЧреНрд░рд╛рдлрд╝рд┐рдХрд▓ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреЗрддрд╛ рд╣реИ:

https://dev-blog.apollodata.com/a-guide-to-authentication-in-graphql-e002a4039d1

рдпрд╣рд╛рдВ рд╣рдо рдПрдХ рдЧреНрд░рд╛рдлрд╝рд┐рдХрд▓ рдЕрдиреБрд░реЛрдз рдХреЛ рдкреНрд░рдорд╛рдгрд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдкреНрд▓рд╕ рдЧреНрд░рд╛рдлрд╝рд┐рдХрд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдФрд░ рддрд░реНрдХ рдХреЛ рджреВрд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдкрд╛рд╕рд╡рд░реНрдб рд░рд╣рд┐рдд, auth0, рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рдЪреАрдЬрд╝ рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рдкрд╕рдВрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

@improunciable FYI рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рдореБрдЭреЗ рдЕрднреА рддрдХ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╕рддреНрд░реЛрдВ рдХреЛ рдХреИрд╕реЗ рд╕рдВрднрд╛рд▓рдирд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдкрд╛рд╕рд╡рд░реНрдб рд░рд╣рд┐рдд рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдореИрдВ рдЕрдкрдиреЗ рдРрдк рдореЗрдВ @iaincollins рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЛ рдЕрдкрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢

рдореЗрд░реА рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдВ рд╣реИрдВ:

  • рд╕реБрд░рдХреНрд╖рд┐рдд
  • рд╕рд░реНрд╡рд░ рд╕рд╛рдЗрдб рдХреЛ рдкреНрд░рдорд╛рдгрд┐рдд рдХрд░рдирд╛ рдлрд┐рд░ рдХреНрд▓рд╛рдЗрдВрдЯ рд╕рд╛рдЗрдб
  • рдлреЗрд╕рдмреБрдХ рдФрд░ рд▓реЙрдЧрд┐рди/рдкрд╛рд╕рд╡рд░реНрдб рджреЛрдиреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░реЗрдВ
  • рдкреНрд░рд╛рдорд╛рдгрд┐рдХ рдкреНрд░рджрд╛рддрд╛рдУрдВ рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рдмрджрд▓рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП
  • рдЧреНрд░рд╛рдлрдХреВрд▓ рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдмрдирд╛рдПрдВ
  • рдЧреНрд░рд╛рдлрд╝рдХреВрд▓ рдХреЗ рдмрд╛рдж рдХреЗ рдЧреНрд░рд╛рдлрд╝рдХреНрдпреВрдПрд▓ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдкреНрд░рдорд╛рдгрд┐рдд рдХрд░реЗрдВ

рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ рд╕рд░реНрд╡рд░-рд╕рд╛рдЗрдб рдСрде рдХреЗ рд╕рд╛рде рдореЗрд░реЗ рдРрдк рдореЗрдВ рдХрд┐рд╕реА рдХреА рдорджрдж рдХрд░рддрд╛ рд╣реИ

рд▓реЗрдЦ рдХреЛ Next.js рд╕рд░реНрд╡рд░ рд╕реЗ рдЕрд▓рдЧ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкреНрд░реЗрд░рдгрд╛ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рдФрд░ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ ... рд╕рд╛рде рд╣реА рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рд╕реАрдПрд╕рдЖрд░рдПрдл рдХреЗ рдЦрд┐рд▓рд╛рдл рдареАрдХ рд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИ рдпрд╛ рдирд╣реАрдВред

рдпрд╣ рдЬреЛ рдореИрдВрдиреЗ рдХрд┐рдпрд╛ рд╣реИ:

  • рдЬрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд▓реЙрдЧ рдЗрди рдХрд░рддрд╛ рд╣реИ, рдХреНрд▓рд╛рдЗрдВрдЯ-рд╕рд╛рдЗрдб рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдПрдХ рдХреБрдХреА рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рд╡рд╛рд╣рдХ рдЯреЛрдХрди рд╣реЛрддрд╛ рд╣реИ
  • рдкреНрд░рдорд╛рдгрд┐рдд рдЕрдиреБрд░реЛрдз рдХрд░рддреЗ рд╕рдордп рд╕рд░реНрд╡рд░-рд╕рд╛рдЗрдб (рдиреЗрдХреНрд╕реНрдЯ.рдЬреЗрдПрд╕) рдХреЛрдб рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЗ рдЕрдиреБрд░реЛрдз рдХреЗ рд╣реЗрдбрд░ рдореЗрдВ рдмрд┐рдпрд░рд░ рдЯреЛрдХрди рдХреЛ рдкрдврд╝рддрд╛ рд╣реИ рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреА рдУрд░ рд╕реЗ рдПрдкреАрдЖрдИ рд╕рд░реНрд╡рд░ рд╕реЗ рд╕рдВрдкрд░реНрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред

рдпрд╣ рдПрдХреНрд╕рдПрд╕рдПрд╕ рдХреЗ рд▓рд┐рдП рдХрдордЬреЛрд░ рд╣реИ (рднрд▓реЗ рд╣реА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЗрд╕реЗ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдХреБрдЫ рдХрд░рддреА рд╣реИ) рдФрд░ рд╕реАрдПрд╕рдЖрд░рдПрдл рд╣рдорд▓реЗ рд▓реЗрдХрд┐рди рдпрд╣ рдЖрд╕рд╛рди рд╣реИ рдФрд░ рдПрд╕рдПрд╕рдЖрд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдмрд╕ рдЕрдиреБрд░реЛрдзреЛрдВ рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП

graph.cool + apollo + jwt + auth0 + next.js, рдЗрд╕рдХреЗ рдкрд╣рд▓реЗ 4 рднрд╛рдЧ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА https://github.com/graphcool-examples/react-apollo-auth0-example рдкрд░ рдХрд┐рдП рдЬрд╛ рдЪреБрдХреЗ рд╣реИрдВред

@balupton рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрднреА рднреА рдХрдиреЗрдХреНрдЯ рд╣реЛрдиреЗ рдкрд░ рдЯреЛрдХрди рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпрд╛ рд╕рддреНрд░ рдЕрднреА рдЦрддреНрдо рд╣реЛ рдЧрдпрд╛ рд╣реИ рдпрд╛ рдЗрд╕реЗ рдХрд┐рд╕реА рднреА рддрд░рд╣ рдирд╡реАрдиреАрдХреГрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ?

@nmaro рдирд╣реАрдВ рдЬрд╛рдирддрд╛, рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рдирд╣реАрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ - рд╡рд╣рд╛рдБ рдкрд░ рдкреВрдЫрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реИ

рдореЗрд░реЗ рдЕрдкрдиреЗ рдРрдк рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ рдЕрдЧрд▓рд╛.js рдФрд░ auth0 рдХреЗ рд╕рд╛рде auth рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рдлрд┐рд░ рдПрдХ zeit/micro API рд╕рд░реНрд╡рд░ рдХреЗ рд╕рд╛рде рдЬреЛ рд╡рд╛рд╣рдХ рдЯреЛрдХрди рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░рддрд╛ рд╣реИред

рдлрд░рд╡рд░реА рдореЗрдВ рдХрднреА-рдХрднреА рдУрдкрди-рд╕реЛрд░реНрд╕ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЙрд╕реА рджрд░реНрд╢рди рдХрд╛ рдкрд╛рд▓рди рдХрд░рддреЗ рд╣реБрдП рдХрд┐ next.js рдЕрдиреБрд╕рд░рдг рдХрд░ рд░рд╣рд╛ рд╣реИ (рдПрдХ рдХрд╛рдо рдХрд░реЗрдВ рдФрд░ рдЗрд╕реЗ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд░реЗрдВ), рдореИрдВрдиреЗ рдиреЛрдб рдХреЗ рд▓рд┐рдП рдПрдХ рдПрдХреНрд╕реНрдЯреЗрдВрд╕рд┐рдмрд▓ рдпреВрдЬрд░ рдЕрдХрд╛рдЙрдВрдЯ рд╕рд┐рд╕реНрдЯрдо рдХрд╛ рдХрдВрдХрд╛рд▓ рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛ рд╣реИред рдпрд╣рд╛рдВ рджрд░реНрд╢рди рджреЗрдЦреЗрдВ: https://medium.com/the-ideal-system/ooth-user-accounts-for-node-js-93cfcd28ed1a#.97kyfg4xg

рдЬреАрдердм рдкрд░рд┐рдпреЛрдЬрдирд╛ рдпрд╣рд╛рдБ рд╣реИ: https://github.com/nmaro/ooth/

рд▓рдХреНрд╖реНрдп рдПрдХ рдПрдХреНрд╕реНрдЯреЗрдВрд╕рд┐рдмрд▓, рд╕реНрд╡рддрдВрддреНрд░ рдкреНрд░рдорд╛рдгреАрдХрд░рдг + рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреНрд░рдмрдВрдзрди рд╕реЗрд╡рд╛ рд╣реИ рдЬреЛ рдПрдХ рдЕрд▓рдЧ рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрд╡рд┐рд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрджрд░реНрд╢ рд╣реИ, рдПрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕рдВрд░рдЪрдирд╛ рдЬреЛ рдиреЛрдб.рдЬреЗрдПрд╕ рдХреЗ рд╕рд╛рде рдмрд╣реБрдд рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЦреЗрд▓реЗрдЧреАред

рдИрдореЗрд▓+рдкрд╛рд╕рд╡рд░реНрдб рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХреЗ рд╕рд╛рде рдПрдХ рдЙрджрд╛рд╣рд░рдг рдпрд╣рд╛рдБ рд╣реИ: https://github.com/nmaro/ooth/tree/master/examples/ooth
рдлреЗрд╕рдмреБрдХ рдФрд░ рдЧреВрдЧрд▓ рдСрде (рдУрде-рдлреЗрд╕рдмреБрдХ, рдФрд░ рдУрде-рдЧреВрдЧрд▓) рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкреИрдХреЗрдЬ рдореМрдЬреВрдж рд╣реИрдВ, рдЬрд┐рдиреНрд╣реЗрдВ рдХреНрд░рдорд╢рдГ рдкрд╛рд╕рдкреЛрд░реНрдЯ-рдлреЗрд╕рдмреБрдХ рдФрд░ рдкрд╛рд╕рдкреЛрд░реНрдЯ-рдЧреВрдЧрд▓ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдореИрдВ рдПрдХ рдЕрдЧрд▓рд╛.рдЬреЗрдПрд╕ рдПрдХреАрдХрд░рдг рдЙрджрд╛рд╣рд░рдг рдпрдерд╛рд╢реАрдШреНрд░ рдкреЛрд╕реНрдЯ рдХрд░реВрдВрдЧрд╛ред рдмреЗрдЭрд┐рдЭрдХ рдЪрд░реНрдЪрд╛ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдВ рдФрд░ рдпреЛрдЧрджрд╛рди рджреЗрдВред

рдкреНрд▓рдЧ рдХреЗ рд▓рд┐рдП рдЦреЗрдж рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрдзрд┐рдХ рдЕрдЪреНрдЫреЗ рдХреЗ рд▓рд┐рдП рд╣реИ - рдореБрдЭреЗ рд╕рдЪ рдореЗрдВ рд╡рд┐рд╢реНрд╡рд╛рд╕ рд╣реИ рдХрд┐ рдЕрднреА рддрдХ рдиреЛрдб рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реИ, рдФрд░ рдпрд╣ рд╕рд┐рд░реНрдл рдЙрди рд▓реЛрдЧреЛрдВ рдХрд╛ рд╕рд╣реА рджрд░реНрд╢рдХ рд╣реИ рдЬреЛ рдРрд╕реА рдЪреАрдЬ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рд╢рд╛рдВрддрд┐

рдЗрд╕ рдмреАрдЪ... рдпрд╣рд╛рдВ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдЧреНрд░рд╛рдлрд╝рд┐рдХрд▓ рдПрдкреАрдЖрдИ рд╣реИ рдЬрд┐рд╕реЗ рдХреЗрд╡рд▓ рд▓рд┐рдЦрдиреЗ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП рдЬреЗрдбрдмреНрд▓реНрдпреВрдЯреА-рдЯреЛрдХрди рдХреЗ рд╕рд╛рде рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЕрдкрдиреА рдкрд╕рдВрджреАрджрд╛ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рд╡рд┐рдзрд┐ рдХреЗ рд╕рд╛рде рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рдорд╣рд╕реВрд╕ рдХрд░реЗрдВ :)

https://github.com/nmaro/ooth/tree/master/examples/graphql-api-with-auth

рдореИрдВрдиреЗ oAuth рд╕рдорд░реНрдерди рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП https://nextjs-starter.now.sh рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рд╣реИред

screen shot 2017-02-10 at 05 03 19

  • рдпрд╣ рдПрдХреНрд╕рдкреНрд░реЗрд╕-рд╕рддреНрд░реЛрдВ (рдкрд╣рд▓реЗ рдХреА рддрд░рд╣) рдХреЗ рд╕рд╛рде, oAuth рдХреЗ рд▓рд┐рдП рдкрд╛рд╕рдкреЛрд░реНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред
  • Facebook, Google рдФрд░ Twitter+ oAuth рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдЙрдкрд▓рдмреНрдз рд╣реИ рдФрд░ рдЕрдзрд┐рдХ рдЬреЛрдбрд╝рдирд╛ рдЖрд╕рд╛рди рд╣реИ (рджреЗрдЦреЗрдВ AUTHENTICATION.md рдФрд░ рдорд╛рд░реНрдЧ/auth-passport.js )ред
  • рдпрд╣ рдИрдореЗрд▓ рд╕рд╛рдЗрди рдЗрди рдХреЗ рд░реВрдк рдореЗрдВ рдпреВрдирд┐рд╡рд░реНрд╕рд▓ рдХреНрд▓рд╛рдЗрдВрдЯ/рд╕рд░реНрд╡рд░ рд╕реЗрд╢рди рд╕рд┐рд╕реНрдЯрдо (CSRF рдЯреЛрдХрди рдХреЗ рд╕рд╛рде, рдХреЗрд╡рд▓ HTTP рдХреБрдХреАрдЬрд╝ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ XSS рд╕реБрд░рдХреНрд╖рд╛, Mongo, SQL DBs, Redshift, рдЖрджрд┐ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рд╡рд╛рд▓реА ORM рдкрд░рдд) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред
  • рд░рд┐рдкреЛрд░реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдбреЗрд╡рд▓рдкрд░ рдкреЛрд░реНрдЯрд▓ рдкрд░ oAuth рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХрд╛ рдЕрдиреБрднрд╡ рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣ рднрдпрд╛рдирдХ рд╣реИ (рдЕрдЬреАрдм рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╣реЛрддреА рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдбреАрдмрдЧ рдХрд░рдирд╛ рдХрдард┐рди рд╣реЛрддрд╛ рд╣реИ)ред

рдУрдПрде рдХреА рдкреНрд░рдХреГрддрд┐ - рдбреАрдмреА + рд╕рддреНрд░ + рдкрд╛рд╕рдкреЛрд░реНрдЯ рдФрд░ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рде рдорд┐рд▓рдХрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ - рдФрд░ рд╕рддреНрд░реЛрдВ рдореЗрдВ рдХреНрд▓рд╛рдЗрдВрдЯ рдФрд░ рд╕рд░реНрд╡рд░ рджреЛрдиреЛрдВ рдХреЛ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдФрд░ рдпрд╣ рдХреИрд╕реЗ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рдкреНрд░рддрд┐рдкрд╛рджрди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ - рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдПрдХ рдмрд╛рд░ рдореЗрдВ рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдФрд░ рд▓рдкреЗрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдереЛрдбрд╝рд╛ рд╕рд╛ рдЖрдк рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреНрд▓рд╛рдЗрдВрдЯ рд▓реЙрдЬрд┐рдХ рдореЗрдВ рдХреЛрдИ oAuth рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдмрд╣реБрдд рдЧрдиреНрджрд╛ рдирд╣реАрдВ рд╣реИред

рдореБрдЭреЗ рдХреЗрд╡рд▓ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХреЛ рдПрдХ рдЕрд▓рдЧ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдЦреБрд╢реА рд╣реЛрдЧреА, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдмрд╣реБрдд рдЫреЛрдЯрд╛ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдХреЛрдИ рдФрд░ рдЪрд╛рд╣реЗ рддреЛ рдмрдврд╝рд┐рдпрд╛ред рдореИрдВ рд╢рд╛рдпрдж рдХрд┐рд╕реА рдмрд┐рдВрджреБ рдкрд░ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдереЛрдбрд╝рд╛ рдФрд░ рдЬреЛрдбрд╝ рджреВрдВрдЧрд╛ (рдЬреИрд╕реЗ рдЦрд╛рддрд╛ рдкреНрд░рдмрдВрдзрди рдкреГрд╖реНрда)ред рд╢рд╛рдпрдж рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рд╕реЗ рдЕрдзрд┐рдХ рд▓рд┐рдВрдХ рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред

рдЕрджреНрднреБрдд рдХрд╛рд░реНрдп! рдпрджрд┐ рдЖрдк рд▓реЗрдЦ рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдЕрдЧрд▓реЗ.рдЬреЗрдПрд╕ рд░реЗрдкреЛ рдореЗрдВ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдмрд╣реБрдд рдмрдврд╝рд┐рдпрд╛ рд╣реЛрдЧрд╛: рджрд┐рд▓:

рдореИрдВ рдЗрд╕реЗ рдмреАрдЯреАрдбрдмреНрд▓реНрдпреВ рднреА рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ

рдореЗрд░реЗ рдкрд╛рд╕ рдЕрдЧрд▓реЗ 2 рд╣рдлреНрддреЛрдВ рдореЗрдВ рд╕рдордп рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдХреЛрдИ рдРрд╕рд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ рддреЛ рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред

рдореБрдЭреЗ рдЗрд╕реЗ рд░рд┐рдлреИрдХреНрдЯрд░ рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд▓рдЧреЗрдЧрд╛ рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдЗрд╕реЗ рдХреЗрд╡рд▓ рдПрдХ рдореЙрдбреНрдпреВрд▓ рддрдХ рдХрдо рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдЬреЛ рд▓реЙрдЧрд┐рди рдмрдЯрди рдЬреИрд╕реЗ рд╕рд░рд▓ рдШрдЯрдХреЛрдВ рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдПрдореНрдмреЗрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлреЙрд░реНрдо рдореЗрдВ рд╕рд╛рдЗрди рдЗрди рдХрд░рддрд╛ рд╣реИ), рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкрд╣рд▓реЗ рдХреЗ рдХреНрд▓рд╛рдЗрдВрдЯ-рд╕рд╛рдЗрдб-рдУрдирд▓реА рдЙрджрд╛рд╣рд░рдг рд╕реЗ рдХреБрдЫ рдкреНрд░реЗрд░рдгрд╛ рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП @improunciable рджреНрд╡рд╛рд░рд╛ред

рдЕрдкрдбреЗрдЯ: рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рджреВрд░ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдирд╣реАрдВ рдЬрд╛ рд╕рдХрддрд╛, рд▓реЗрдХрд┐рди рдЬрдм рдореИрдВ рд╡рд╛рдкрд╕ рдЖрддрд╛ рд╣реВрдВ рддреЛ рдореБрдЭреЗ рдРрд╕рд╛ рдХрд░рдиреЗ рдореЗрдВ рдЦреБрд╢реА рд╣реЛрддреА рд╣реИ!

рдореИрдВрдиреЗ рдХреБрдЫ рд╕рдВрд╢реЛрдзрди рдХреЗ рд╕рд╛рде auth0/react рдХреНрд╡рд┐рдХ рд╕реНрдЯрд╛рд░реНрдЯ рдЧрд╛рдЗрдб рдХрд╛ рдкрд╛рд▓рди рдХрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЬрдм рдореИрдВ lock.show() рдХреЙрд▓ рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рдРрдк рд╢рд┐рдХрд╛рдпрдд рдХрд░рддрд╛ рд╣реИ:

рдзреНрдпрд╛рди рдореЗрдВ рди рдЖрдпрд╛ рддреНрд░реБрдЯрд┐: addComponentAsRefTo(...): рдХреЗрд╡рд▓ рдПрдХ ReactOwner refs рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдХрд┐рд╕реА рдРрд╕реЗ рдШрдЯрдХ рдореЗрдВ рд░реЗрдлрд░реА рдЬреЛрдбрд╝ рд░рд╣реЗ рд╣реЛрдВ рдЬреЛ рдХрд┐рд╕реА рдШрдЯрдХ рдХреЗ render рдкрджреНрдзрддрд┐ рдХреЗ рдЕрдВрджрд░ рдирд╣реАрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рдпрд╛ рдЖрдкрдХреЗ рдкрд╛рд╕ рд░рд┐рдПрдХреНрдЯ рд▓реЛрдб рдХреА рдХрдИ рдкреНрд░рддрд┐рдпрд╛рдВ рд╣реИрдВ

@iaincollins @timneutkens рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ, рдЕрдЧрд░ рдореИрдВ рдЧрд▓рдд рд╣реВрдВ рддреЛ рдХреГрдкрдпрд╛ рдореБрдЭреЗ рд╕рд╣реА рдХрд░реЗрдВред

рдЙрджрд╛рд╣рд░рдг рд╕рддреНрд░ рдЯреЛрдХрди рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП httpOnly рдХреБрдХреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЗрд╕реЗ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЗрдВрдЬреЗрдХреНрд╢рди рд╣рдорд▓реЛрдВ (XSS) рдХреЗ рд╡рд┐рд░реБрджреНрдз рд╕реБрд░рдХреНрд╖рд┐рдд рдмрдирд╛рддрд╛ рд╣реИред рдлрд┐рд░ рдпрд╣ рд╕реАрдПрд╕рдЖрд░рдПрдл рд╣рдорд▓реЛрдВ рд╕реЗ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдерд╛рдиреАрдп рднрдВрдбрд╛рд░рдг рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╕реАрдПрд╕рдЖрд░рдПрдл рдЯреЛрдХрди рд░рдЦрдиреЗ рдХреА рд╕рдорд╕реНрдпрд╛ рдореЗрдВ рдЪрд▓рд╛ рдЬрд╛рддрд╛ рд╣реИред

рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдзрд╛рд░рдгрд╛ рд╣реИ рдХрд┐ рддрдХрдиреАрдХреЛрдВ рдХрд╛ рдпрд╣ рд╕рдВрдпреЛрдЬрди рдЪреАрдЬреЛрдВ рдХреЛ рд╕реБрд░рдХреНрд╖рд┐рдд рдмрдирд╛рддрд╛ рд╣реИ, рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛/рдбреЗрд╡рд▓рдкрд░ рдХреЛ рдЧреБрдорд░рд╛рд╣ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдПрдХ рд╣рдорд▓рд╛рд╡рд░ рдЕрднреА рднреА рдкреГрд╖реНрда (XSS) рдореЗрдВ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдЗрдВрдЬреЗрдХреНрд╖рди рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд╕реАрдПрд╕рдЖрд░рдПрдл рдЯреЛрдХрди рдкрдврд╝ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдПрдкреАрдЖрдИ рдХреЛ рдкреНрд░рдорд╛рдгрд┐рдд (рдХреБрдХреА) рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдХреНрдпрд╛ рд░реАрдбрдореА рдореЗрдВ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИ?

рдирдорд╕реНрддреЗ @davibe

рдХрд╛рд╢, рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдПрдХ рд╕рддреНрд░ рдХреБрдХреА рдФрд░ рдПрдХ рдЕрд▓рдЧ рдШреВрд░реНрдгрди рд╕реАрдПрд╕рдЖрд░рдПрдл рдЯреЛрдХрди рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рддрдХрдиреАрдХреА рд░реВрдк рд╕реЗ рдмреЗрд╣рддрд░ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдпрд╣ рдХрд╣рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдореИрдВ рдореЙрдбрд▓ рд╕реЗ рдХрд╛рдлреА рдЦреБрд╢ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рджреВрд╕рд░рд╛ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред (рднрд▓реЗ рд╣реА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рд╣рдореЗрд╢рд╛ рд╕реБрдзрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ)ред

рд╣рдо рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдлрд┐рдВрдЧрд░ рдкреНрд░рд┐рдВрдЯрд┐рдВрдЧ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рд╢рд╛рдпрдж рд╕рддреНрд░ рдЯреЛрдХрди рдЕрдзрд┐рдХ рдмрд╛рд░ рдШреВрдо рд╕рдХрддрд╛ рд╣реИ (рдореИрдВ рднреВрд▓ рдЬрд╛рддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдЕрднреА рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд╣реИ), рд╕реАрдПрд╕рдЖрд░рдПрдл рдЯреЛрдХрди рдкрд░рдо рдХреЗ рдмрдЬрд╛рдп рд╣реЗрдбрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдХреБрдХреАрдЬрд╝ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЗрд╡рд▓ рдЙрддреНрдкрд╛рджрди рдореЗрдВ рдПрд╕рдПрд╕рдПрд▓ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП рдФрд░ рд╣рдо рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдЯреЛрдХрди рдореЗрдВ рд╕рд╛рдЗрди рдЗрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдорд╛рдкреНрддрд┐ рддрд┐рдерд┐, рд▓реЗрдХрд┐рди AFAICS рдореЗрдВ рд╕реБрдзрд╛рд░ рдХреЗ рд▓рд┐рдП рдХрд╛рдлреА рд╕реАрдорд┐рдд рдЧреБрдВрдЬрд╛рдЗрд╢ рд╣реИ рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛрд╕реБрд░рдХреНрд╖рд╛ рдореЙрдбрд▓ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдРрд╕рд╛ рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИ рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд┐рд╕реА рдРрдк рдореЗрдВ рдХрд┐рд╕реА рднреА рдХреЛрдб рдХреЛ рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдФрд░ рд╕реБрд░рдХреНрд╖рд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ; рд▓реЗрдХрд┐рди рдХреГрдкрдпрд╛ рдмреЗрдЭрд┐рдЭрдХ рдЙрди рдЪреАрдЬреЛрдВ рдХреЛ рд░реЗрдкреЛ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХреЗ рдореБрджреНрджреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдард╛рдПрдВред

рдпрджрд┐ рдХреЛрдИ рдЦрд╛рддрд╛ рд╕реНрдерд┐рддрд┐ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд╡рд┐рдХрд▓реНрдк рдереЗ (рдЬреЛ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдирд╣реАрдВ рд╣реИрдВ) рддреЛ рд╣рдо рдЙрдиреНрд╣реЗрдВ рдмрд┐рдирд╛ рдЕрдиреБрдорддрд┐ рдХреЗ рд╕рд░реНрд╡рд░ рдкрд░ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рдирд╛ рдЕрдзрд┐рдХ рдХрдард┐рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдПрдХ рдХреИрдкреНрдЪрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдЬреЛ рдХреБрдЫ рд╣реЛрддрд╛ рд╣реИ рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рд╛рдЗрди рдЗрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдмрд╛рд╣рд░ рдЗрд╕рд▓рд┐рдП рдХрд┐ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рджрд╛рдпрд░реЗ рд╕реЗ рдмрд╛рд╣рд░ рд╣реИред

рд╕рддреНрд░ рдЯреЛрдХрди рдХрд╛ рднрдВрдбрд╛рд░рдг рд╕реНрдерд╛рдиреАрдп рднрдВрдбрд╛рд░рдг рдЗрд╕реЗ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдХрдо рд╕реБрд░рдХреНрд╖рд┐рдд рдмрдирд╛ рджреЗрдЧрд╛ рдФрд░ рдХрд▓реНрдкрдирд╛ рдореЗрдВ рдЗрдЪреНрдЫрд┐рдд рдЙрдкрдпреЛрдЧ рдХреЗ рдЦрд┐рд▓рд╛рдл рдЬрд╛рдПрдЧрд╛, рдЗрд╕рд▓рд┐рдП рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдореИрдВ рдЗрд╕рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рдирд╣реАрдВ рд╣реВрдВ - рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореИрдВ рд╕рд░рд╛рд╣рдирд╛ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдЪреАрдЬреЛрдВ рдХреЛ рд╕рд░рд▓ рдХрд░реЗрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рд╕реАрдПрд╕рдЖрд░рдПрдл рдкреНрд░рдХреНрд╖реЗрдкрдг рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд▓реЛрдЧ рд╢рд╛рдпрдж рдЗрд╕рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдХрд░рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реЛрдЧрд╛ - рдореИрдВрдиреЗ рдХреЗрд╡рд▓ рдПрдХ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдмрд╣реБрдд рдЕрдЬреАрдм рд╣реИред :-)

рдореИрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЖрдкрдХреЗ рд╕рд╛рде рд╣реВрдВ рдХрд┐ рдореБрдЭреЗ рднреА рдирдлрд░рдд рд╣реИ рдХрд┐ рдпрд╣ рдХрд┐рддрдирд╛ рдЕрдЬреАрдм рд╣реИ рдФрд░ рдЗрд╕реЗ рдПрдХ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдмрджрд▓рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХреА рд╣реИред

рд╣рдореНрдо .. рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдБред
рдпрд╣ рдореБрджреНрджрд╛ рдореЗрд░реЗ рд▓рд┐рдП рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рдерд╛, рдзрдиреНрдпрд╡рд╛рджред

рдпрд╣ Auth0 рдХрд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реИ https://auth0.com/blog/cookies-vs-tokens-definitive-guide/
рд╡реЗ рдореВрд▓ рд░реВрдк рд╕реЗ рдХреБрдХреАрдЬрд╝ рд╕реЗ рдмрдЪрдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрддреЗ рд╣реИрдВ рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкрд╣рд▓реЗ рдкреГрд╖реНрда рд▓реЛрдб рдкрд░ рдПрд╕рдПрд╕рдЖрд░ рдЫреЛрдбрд╝ рджреЗрдЧрд╛ред

рдЬрд╝рд░рд╛ рд╕реБрдирд┐рдП рд╕рднреА!

рдореИрдВ next.js рдХреЗ рд╕рд╛рде рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдкрд░ рднреА рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдЗрд╕ рдореБрджреНрджреЗ рд╕реЗ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ @davibe + рд░реЗрдкреЛ рдФрд░ рдкреАрдЖрд░ рд╕реЗ рдХрд╛рдлреА рдорджрдж рдорд┐рд▓реА рд╣реИред

рдореЗрд░рд╛ рд╕рдорд╛рдзрд╛рди рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд░рддрд╛ рд╣реИ:

  • рд╕рдлрд▓ рд▓реЙрдЧрд┐рди рдкрд░, рдореЗрд░рд╛ рд░реЗрдбрдХреНрд╕ рд░реЗрдбреНрдпреВрд╕рд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдХреБрдХреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреБрдХреА рдореЗрдВ рдЯреЛрдХрди рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдбреЗрдЯрд╛ рд╕рд╣реЗрдЬрддрд╛ рд╣реИред
  • рдХреЛрдИ рднреА рдкреГрд╖реНрда / рдШрдЯрдХ рдЬрд┐рд╕реЗ рдЙрд╕ рдЬрд╛рдирдХрд╛рд░реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЙрд╕реЗ @timneutkens with-session.js рдХреЗ рд╕рдорд╛рди рдЙрдЪреНрдЪ-рдХреНрд░рдо рд╡рд╛рд▓реЗ рдШрдЯрдХ рдореЗрдВ рд▓рдкреЗрдЯрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ SSR, рдЯреЛрдХрди ctx.req.headers.cookie рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реЛрдЧрд╛, рдЕрдиреНрдпрдерд╛ рдЗрд╕реЗ рдХреЗрд╡рд▓ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ (рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдХреБрдХреА рд▓реЛрдб рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ)ред
  • рдПрдХ рдмрд╛рд░ рдореЗрд░реЗ рдкрд╛рд╕ рдЯреЛрдХрди рд╣реЛ рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдЬрдм рднреА рдореИрдВ рдЕрдиреБрд░реЛрдз рдХрд░рддрд╛ рд╣реВрдВ, рдореИрдВ рдЗрд╕реЗ рд╡рд╛рд╣рдХ/рдкреНрд░рд╛рдзрд┐рдХрд░рдг рд╢реАрд░реНрд╖рд▓реЗрдЦ рдореЗрдВ рд╕реЗрдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред

рдпрд╣ рдорджрдж рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдбреЙрдХрдЯрд░ рдХрдВрдЯреЗрдирд░ рдореЗрдВ рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ рдЬреЗрдбрдмреНрд▓реНрдпреВрдЯреА рдЯреЛрдХрди рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрд╡рд┐рд╕ рдЪрд▓ рд░рд╣рд╛ рд╣реИред
рд╢рд╛рдпрдж рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХреЗ рд╕рд╛рде рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЬреЗрдбрдмреНрд▓реНрдпреВрдЯреА рд╕реЗрд╡рд╛ рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛрдЧрд╛? рдЗрд╕ рдкреНрд░рдХрд╛рд░ server.js рдХреЛ рд╣реИрдХ рдХрд░рдиреЗ рд╕реЗ рдмрдЪрдирд╛ рдФрд░ рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ next.js рдмреЗрдХ-рдЗрди рд╣реЙрдЯ рд░реАрд▓реЛрдбрд┐рдВрдЧ, ssr рдФрд░ рд░реВрдЯрд┐рдВрдЧ рдХреЗ рд▓рд╛рднреЛрдВ рдХреЛ рдЦреЛрдирд╛?

рдореБрдЭреЗ рдпрд╣ рднреА рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╕реАрдПрд╕рдЖрд░рдПрдл/рдПрдХреНрд╕рдПрд╕рдПрд╕ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИ рдпрд╛ рдирд╣реАрдВред рдХрд┐рд╕реА рднреА рдЯрд┐рдкреНрдкрдгреА рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИред

рдЖрдкрдиреЗ рдЕрдм рддрдХ рдЬреЛ рдЕрджреНрднреБрдд рдХрд╛рдо рдХрд┐рдпрд╛ рд╣реИ, рдЙрд╕рдХреЗ рд▓рд┐рдП рдЖрдк рд╕рднреА рдХрд╛ рдзрдиреНрдпрд╡рд╛рджред рдореИрдВ рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ рдмрд╣реБрдд рдмрдбрд╝рд╛ рдкреНрд░рд╢рдВрд╕рдХ рд╣реВрдБ!

@jcsmesquita рдореИрдВ рдЙрджрд╛рд╣рд░рдг рдХреЗ рдПрдХ рдирдП рд╕рдВрд╕реНрдХрд░рдг рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдЬрд┐рд╕рдореЗрдВ рд╕рдм рдХреБрдЫ Next.js рд╕реЗ рдЕрд▓рдЧ рд╣реИ рдЬреИрд╕реЗ рдХрд┐ zeit.co рдкрд░ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдпрд╣ рдЙрдкрдпреЛрдЧреА рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ: https://hub.docker.com/r/rabbotio/nap/~/dockerfile/

@subsumo рдЙрд▓реНрд▓реЗрдЦ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдПрдирдПрдкреА рдореЗрд░рд╛ рд╣реИ, рд╡реЗрдм рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдСрдерди @iaincollins nextjs-starter рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ рдФрд░ рдЯреЛрдХрди рдХреЗ рд╕рд╛рде рдореВрд▓ рдХреНрд▓рд╛рдЗрдВрдЯ рд▓реЙрдЧрд┐рди рдкрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд░рддрд╛ рд╣реИред

@timneutkens рдЬрд┐рд╕ рд╕рдорд╛рдзрд╛рди рдкрд░ рдЖрдк рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ рд╡рд╣ рдЖрдкрдХреЛ рдПрдХ рдЕрд▓рдЧ рд╕реЗрд╡рд╛ рдХреА рдУрд░ рдкреНрд░рдорд╛рдгрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ?

рдореИрдВ рд╡рд░реНрддрдорд╛рди рд▓реЗрдЦ рдЙрджрд╛рд╣рд░рдг рдкреБрд▓ рдЕрдиреБрд░реЛрдз рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдБ https://github.com/zeit/next.js/pull/1141
рдореБрдЭреЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ рдЕрдЧрд▓реЗ.рдЬреЗрдПрд╕ рд╕рд░реНрд╡рд░ рдХреА рдУрд░ рдкреНрд░рдорд╛рдгрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдЗрд╕реЛрдореЛрд░реНрдлрд┐рдХ рд░реВрдк рд╕реЗ рдПрдХ рдЕрд▓рдЧ рд╕реЗрд╡рд╛ рдХреА рдУрд░ рдирд╣реАрдВред

рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдорд╛рди рд▓реЗрдВ рдХрд┐ рдЖрдк рдЕрдЧрд▓рд╛.рдЬреЗрдПрд╕ рд╕рд░реНрд╡рд░ рдФрд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдРрдк рдПрдкреАрдЖрдИ (рдЬреИрд╕реЗ рдЖрд░рдИрдПрд╕рдЯреА рдпрд╛ рдЧреНрд░рд╛рдлрдХреНрдпреВрдПрд▓) рдХреЛ рдЕрд▓рдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЬреЛ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рдХреНрд▓рд╛рдЗрдВрдЯ рдФрд░ рд╕рд░реНрд╡рд░ рдПрдкреАрдЖрдИ рдХреА рдУрд░ рдкреНрд░рдорд╛рдгрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИрдВред рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рд╕рдорд╛рдзрд╛рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрдкрдХреА рдорджрдж рдХрд░рддрд╛ рд╣реИред

рдореИрдВрдиреЗ рдПрдХ рдкреНрд░рд╡рд╛рд╣ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрд╛ред

рд╕рдВрд╕реНрдерд╛рдПрдВ:

  • рдЧреНрд░рд╛рд╣рдХ (рд╕реА)
  • Next.js рд╕рд░реНрд╡рд░ (рдПрд╕)
  • рдПрдкреАрдЖрдИ (рдП)

рд▓рдХреНрд╖реНрдп 3 рдХреБрдХреА-рдЖрдзрд╛рд░рд┐рдд рд╕рддреНрд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рд╣реИ:

  1. рд╕реАрдПрд╕
  2. рд╕реАрдП
  3. рдПрд╕рдП

рд╕рддреНрд░ 1) рдЗрд╕рд▓рд┐рдП рд╣реИ рдХрд┐ рдХреНрд▓рд╛рдЗрдВрдЯ рд╕рд░реНрд╡рд░ рдХреЛ рдкрд╣рдЪрд╛рдирддрд╛ рд╣реИ, рдФрд░ 2) 3) рдРрд╕рд╛ рд╣реИ рдХрд┐ рдХреНрд▓рд╛рдЗрдВрдЯ рдФрд░ рд╕рд░реНрд╡рд░ рджреЛрдиреЛрдВ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдПрдкреАрдЖрдИ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рд╕рдВрдмрдВрдзрд┐рдд рд╕рддреНрд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдпрд╣ рдкреНрд░рд╡рд╛рд╣ рд╣реИ:

  1. рд╕реАрдПрд╕ рдЖрд╕рд╛рдиреА рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХрд┐рд╕реА рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ
  2. рд╕реАрдП рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо/рдкрд╛рд╕рд╡рд░реНрдб рдХреЗ рд╕рд╛рде)ред рдЗрд╕рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд, рдПрдХ JWT рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ
  3. рдХреНрд▓рд╛рдЗрдВрдЯ рд╕рд░реНрд╡рд░ рдХреЛ JWT рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рдЙрд╕реЗ рдЫреЛрдбрд╝ рджреЗрддрд╛ рд╣реИ
  4. SA JWT рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдмрд╛рдж рдореЗрдВ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ

рдХреНрдпрд╛ рдЖрдкрдХреА рд░рд╛рдп? рдХреНрдпрд╛ рдХреЛрдИ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рд╣реИ? рдХреНрдпрд╛ рд╣рдореЗрдВ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдХреЗрд╡рд▓ API рдХреЛ next.js рд╕рд░реНрд╡рд░ рдХреЗ рд╕рд╛рде рдпреБрдЧреНрдорд┐рдд рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП, рддрд╛рдХрд┐ рдХреЗрд╡рд▓ рдПрдХ рд╕рддреНрд░ (CS) рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ?

@rauchg рдореИрдВ рдЖрдкрдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рдирд╣реАрдВ рдмреБрд▓рд╛рддрд╛, рд▓реЗрдХрд┐рди рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдпрд╣ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рднреА рд╣реИ рдХрд┐ рдЖрдЧреЗ рдХрд┐рд╕ рджрд┐рд╢рд╛ рдореЗрдВ рдЬрд╛рдирд╛ рд╣реИред рдЬреЗрдПрд╕ рдХреЛ рдЬрд╛рдирд╛ рд╣реИ - "рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рдлреНрд░рдВрдЯ-рдПрдВрдб" рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕реЗ рдбреЗрдЯрд╛ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдПрдкреАрдЖрдИ рд╕реЗ рдЕрд▓рдЧ рд╕реЗ рдЪрд▓рд╛рдирд╛ рдЪрд╛рд╣рд┐рдП? рдпрджрд┐ рд╣рд╛рдБ, рддреЛ рд╣рдореЗрдВ рдпрд╣ рдЕрдзрд┐рдХрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

@timneutkens рдЬрд┐рд╕ рд╕рдорд╛рдзрд╛рди рдкрд░ рдЖрдк рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ рд╡рд╣ рдЖрдкрдХреЛ рдПрдХ рдЕрд▓рдЧ рд╕реЗрд╡рд╛ рдХреА рдУрд░ рдкреНрд░рдорд╛рдгрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ?

рдпрд╣реА рд╡рд┐рдЪрд╛рд░ рд╣реИ рд╣рд╛рдБред Next.js рдкрд░ рдЕрдиреНрдп рдЪреАрдЬреЛрдВ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдореЗрдВ рд╡реНрдпрд╕реНрдд рд╣реИрдВред рдЗрд╕реЗ ASAP рд╡рд╛рдкрд╕ рдорд┐рд▓ рдЬрд╛рдПрдЧрд╛ред

рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдРрдк рдХреЗ рдЬреАрдердм-рдСрде-рд╡рд┐рд╢рд┐рд╖реНрдЯ рднрд╛рдЧреЛрдВ рдХреЛ рдПрдХ рд╕реБрдВрджрд░ рд╕реБрдкрд╛рдЪреНрдп рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рддреЛрдбрд╝ рджрд┐рдпрд╛ред рдХреБрдЫ рдХреЗ рд▓рд┐рдП рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдХреЛрдб рдпрд╛ рдкреНрд░рд╡рд╛рд╣ рдкрд░ рдХреЛрдИ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкрд╕рдВрдж рдХрд░реЗрдВрдЧреЗ: https://github.com/possibilities/next-github-auth-example

рдЕрджреНрдпрддрди: рдореИрдВрдиреЗ рдЙрджрд╛рд╣рд░рдг рдРрдк рдХреЛ рдШрдЯрдХреЛрдВ рдХреЗ рдкреБрди: рдкреНрд░рдпреЛрдЬреНрдп рд╕реЗрдЯ рдореЗрдВ рджреЛрдмрд╛рд░рд╛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджреА рдЬрд┐рд╕реЗ рдЕрдЧрд▓реЗ рдРрдкреНрд╕ рдореЗрдВ "рдЧрд┐рд░рд╛рдпрд╛" рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ

рдЕрдиреБрд╡рд░реНрддреА: рдореИрдВрдиреЗ рдУрде рдФрд░ рдПрдХ рдЧреНрд░рд╛рдлрдХреНрдпреВрдПрд▓ рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рдПрдХреАрдХрд░рдг рд▓рд┐рдЦрд╛ рдерд╛ред

https://medium.com/the-ideal-system/ooth-user-accounts-for-node-js-93cfcd28ed1a#.ykoj1dhil

рдпрд╣ рдореМрдЬреВрджрд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдгреЛрдВ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ, рдпрд╛рдиреА рдЕрдЧрд▓реЗ.рдЬреЗрдПрд╕ рд╕рд░реНрд╡рд░ рдХреА рдУрд░ рдкреНрд░рдорд╛рдгреАрдХрд░рдг, рдпрд╛рдиреА рдпрд╣ рдПрдкреАрдЖрдИ рдФрд░ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рд╕рд░реНрд╡рд░ рдХреЛ рдПрдХ рд╣реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╛рдирддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ рд╕рддреНрд░ рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛ред рд▓рд╛рдн: рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рд░реВрдк рд╕реЗ рдпрд╣ рдХрд┐рд╕реА рднреА рдкрд╛рд╕рдкреЛрд░реНрдЯ.рдЬреЗрдПрд╕ рд░рдгрдиреАрддрд┐ рдХреЗ рд▓рд┐рдП / рдХреЗ рд▓рд┐рдП рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓ рд╕реНрдЯреЛрд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

@timneutkens рдиреЗ рдЙрд╕ рдореЛрд░реНрдЪреЗ рдкрд░ рдХреЛрдИ рдкреНрд░рдЧрддрд┐ рдХреА рд╣реИ?

рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдЬреАрдердм рдСрде рдЙрджрд╛рд╣рд░рдг рдРрдк рдХреЛ рдЕрдЧрд▓реЗ рдРрдкреНрд╕ рдореЗрдВ "рдЧрд┐рдердм рдСрде рдХреЛ рдЫреЛрдбрд╝рдиреЗ" рдХреЗ рд▓рд┐рдП рд╕рдЬрд╛рд╡рдЯреА рдФрд░ рдкреЗрдЬ рдШрдЯрдХ рдХреЗ рдкреБрди: рдкреНрд░рдпреЛрдЬреНрдп рд╕реЗрдЯ рдореЗрдВ рджреЛрдмрд╛рд░рд╛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджреАред рдХреЛрдб рдФрд░ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рдХрд┐рдпрд╛ред https://github.com/possibilities/next-github-auth

рдореИрдВ _рдерд┐рдВрдХ_ рдпрд╣рд╛рдВ рдмреЛрд░реНрдбреЛрдВ рдХреЛ рдиреАрдЪреЗ рдХрд░рдирд╛ рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рдЕрдЧрд▓реЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рд▓реЗрдЦ рдврд╛рдВрдЪреЗ рдореЗрдВ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦ рд╕рдХрддрд╛ рд╣реИред

@timneutkens
рдЖрдкрдХреЛ рдкрд┐рдВрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЦреЗрдж рд╣реИ, рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдЖрдкрдиреЗ рдЗрд╕ рдкрд░ рдХреЛрдИ рдкреНрд░рдЧрддрд┐ рдХреА рд╣реИ? рдореИрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЦреЛ рдЧрдпрд╛ рд╣реВрдВ рдХрд┐ рдореБрдЭреЗ next.js рдХреЗ рд╕рд╛рде рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХреИрд╕реЗ рдареАрдХ рд╕реЗ рд╕реЗрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

@kolpav рдореИрдВрдиреЗ рдЗрд╕ рдкрд░ рдХреБрдЫ рдХрд╛рдо рдХрд┐рдпрд╛ рд╣реИ, рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЕрдиреНрдп рд╕рд╛рдорд╛рдиреЛрдВ рд╕реЗ рднрд░рд╛ рд╣реБрдЖ рд╣реИ рд╣рд░ рддрд░рд╣ рд╕реЗ рдпрд╣ рдЕрдЧрд▓реА рдХреЗ рд▓рд┐рдП рдореЗрд░реА рдкреНрд░рд╛рдердорд┐рдХрддрд╛рдУрдВ рдХреА рд╕реВрдЪреА рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╣реИ

рдПрдХ рдиреЗрдХреНрд╕реНрдЯ.рдЬреЗрдПрд╕ рдРрдк рдХреЗ рд╕рд╛рде рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╕реНрдкрд╖реНрдЯ, рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдкреНрд░рд▓реЗрдЦрд┐рдд рдФрд░ рд╕реБрд░рдХреНрд╖рд┐рдд рддрд░реАрдХрд╛ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕рдХреА рд╕рдлрд▓рддрд╛ рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред

рдореБрдЭреЗ рдпрд╛рдж рдирд╣реАрдВ рдЖ рд░рд╣рд╛ рд╣реИ рдХрд┐ рдкрд┐рдЫрд▓реА рдмрд╛рд░ рдореИрдВрдиреЗ рдХрдм рдРрд╕рд╛ рд╡реЗрдм рдмрдирд╛рдпрд╛ рдерд╛ рдЬрд┐рд╕рдореЗрдВ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдирд╣реАрдВ рдерд╛ред
рдЬреНрдпрд╛рджрд╛рддрд░ рд▓реЛрдЧреЛрдВ рдХреА рддрд░рд╣ рдореИрдВ рднреА рдХрд▓реНрдкрдирд╛ рдХрд░рддрд╛ рд╣реВрдВ, рдореИрдВ рднреА рдЕрдкрдиреЗ рд╕рдорд░реНрдерд┐рдд рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рд╕реБрд░рдХреНрд╖рд┐рдд рдХреЙрд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдЬреЗрдбрдмреНрд▓реНрдпреВрдЯреА рд╕реНрдкрд╖реНрдЯ рд╕рдорд╛рдзрд╛рди рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИред

рд▓реЗрдХрд┐рди рдореБрджреНрджреЛрдВ рдФрд░ рдЬрдирд╕рдВрдкрд░реНрдХ рдХреЗ рдмреАрдЪ рдЗрддрдиреА рдЪрд░реНрдЪрд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХрд╣рд╛рдВ рд╕реЗ рд╢реБрд░реВ рдХрд┐рдпрд╛ рдЬрд╛рдП!

@timneutkens
рдХреВрд▓ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рджреВрд╕рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдореВрд▓реНрдпрд╡рд╛рди рд╣реЛрдЧрд╛ред

@camstuart @kolpav рдКрдкрд░ рдХреБрдЫ рдЕрдЪреНрдЫреЗ, рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВ рдЬрд┐рдирдореЗрдВ рдУрдПрде рдФрд░ рдИрдореЗрд▓ рдЖрдзрд╛рд░рд┐рдд рдкреНрд░рдорд╛рдгреАрдХрд░рдг рд╢рд╛рдорд┐рд▓ рд╣реИрдВ рдЬреЛ рдпреЛрдЧрджрд╛рдирдХрд░реНрддрд╛рдУрдВ @jaredpalmer , @luisrudge , @improunciable , @possibilities рдФрд░ рд╕реНрд╡рдпрдВ рджреНрд╡рд╛рд░рд╛ JWT рдФрд░ HTTP рджреЛрдиреЛрдВ рдХреБрдХреАрдЬрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

рдХреБрдЫ рд▓рд┐рдВрдХ рдХреЛ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЪреЗрдХ рдЖрдЙрдЯ рдХрд░реЗрдВ:

(рд╕реВрдХреНрд╖реНрдо рд▓реЗрдЦ рдЙрджрд╛рд╣рд░рдг рдЕрдЪреНрдЫрд╛ рдерд╛ рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдЕрджреНрдпрддрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред)

рдЖрдЧреЗ рд╕реБрдзрд╛рд░ рдХреА рдЧреБрдВрдЬрд╛рдЗрд╢ рд╣реИ, рдЬрд┐рд╕ рдкрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рдЯрд┐рдкреНрдкрдгреАрдХрд╛рд░реЛрдВ рдиреЗ рдКрдкрд░ рдЯрд┐рдкреНрдкрдгреА рдХреА рд╣реИ - рдЬрд┐рд╕рдореЗрдВ рд╕рддреНрд░ рд╕реНрдЯреЛрд░ рдШрдЯрдХ рдФрд░ рд╕рд░реНрд╡рд░ рддрд░реНрдХ рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдирд╛ рд╢рд╛рдорд┐рд▓ рд╣реИ; рдФрд░ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдЬреЛ рдЪреАрдЬреЛрдВ рдХреЛ рдФрд░ рднреА рд╕рд░рд▓ рдмрдирд╛рддрд╛ рд╣реИ рдЬрд┐рд╕ рдкрд░ рдЯрд┐рдо рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИред

рд╕рд╛рдорд╛рдиреНрдпрддрд╛ рдХреЗ рд▓рд┐рдП рд╕рд░рд▓рддрд╛ рдпреВрдирд┐рд╡рд░реНрд╕рд▓ рдРрдкреНрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рдЪреБрдиреМрддреАрдкреВрд░реНрдг рдХреНрд╖реЗрддреНрд░ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП - рдпрд╛ рд╕реАрдзреЗ рдбреЗрдореЛ рдЖрдЬрд╝рдорд╛рдПрдВ - рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рд╡реЗ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдкрд░реЗрд╢рд╛рдиреА рдХреЗ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред

@iaincollins рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдЙрджрд╛рд╣рд░рдг рд╣реИред рд▓реЗрдХрд┐рди рдореИрдВ рдХреИрд╕реЗ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП) рд╕реНрдЯрд╛рд░реНрдЯрд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ? рддреЛ рдЕрдЧрд░ рдореИрдВ рдЕрдкрдирд╛ рдРрдк рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдореБрдЭреЗ рдЗрд╕ рд░реЗрдкреЛ рдХреЛ рдХреНрд▓реЛрди рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ? рдпрд╛ рдореБрдЭреЗ рд╕реНрдЯрд╛рд░реНрдЯрд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЦрдВрдб рд╕реЗ рдЕрдкрдиреЗ рдХреЛрдб рдореЗрдВ "рдХреЙрдкреА-рдкреЗрд╕реНрдЯ" рдХреЛрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ?

рдЕрдЧрд░ рд╕реНрдЯрд╛рд░реНрдЯрд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ - рдореБрдЭреЗ рдХреНрдпрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП?

@iaincollins
рдЕрдЪреНрдЫреЗ рдЙрджрд╛рд╣рд░рдг рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЖрдкрдХреЗред
рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА, рдореИрдВ рдЙрд╕ рдкрд░ рдЕрдиреБрдореЛрджрди рдХреА рдЬрд╝реАрдЯ рдореБрд╣рд░ рдХреЗ рд╕рд╛рде рдкреНрд░рд╛рдорд╛рдгрд┐рдХ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ - рд╕рднреА рдЖрдВрдЦреЗрдВ рдПрдХ рджрд┐рд╢рд╛ рдореЗрдВ рдЗрдВрдЧрд┐рдд рдХрд░реЗрдВрдЧреА рддрд╛рдХрд┐ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдпрд╛ рдЧрд▓рддреА рдХрд┐рд╕реА рдХрд╛ рдзреНрдпрд╛рди рди рдЬрд╛рдПред рдЕрднреА рдХреЗ рд▓рд┐рдП, рдореЗрд░реЗ рдкрд╛рд╕ рдЕрдкрдирд╛ рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рдЕрдзрд┐рдХрд╛рд░ рд╣реИ рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдХрд┐рддрдирд╛ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИред

рд╕рд╣рдордд @kolpav , рдЕрдкрдиреА рдЦреБрдж рдХреА рд╕реБрд░рдХреНрд╖рд╛ рд░реЛрд▓ рдХрд░рдирд╛ рдПрдХ рдореБрд╢реНрдХрд┐рд▓ рдХрд╛рдо рд╣реИред рд╡рд┐рд╢реЗрд╖рдЬреНрдЮреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдЫреЛрдбрд╝ рджрд┐рдпрд╛

рдореИрдВрдиреЗ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдЯреИрдХ рдмрдирд╛рдпрд╛ рд╣реИ рдЬреЛ рдЧреНрд░рд╛рдлрд╝рдХреНрдпреВрдПрд▓ рдХреЗ рд╕рд╛рде рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рд╕рдВрднрд╛рд▓ рд╕рдХрддрд╛ рд╣реИ: https://github.com/thebillkidy/MERGE-Stack

@salmazov рдореБрдЭреЗ рдЖрд░рдВрдн рдХрд░рдиреЗ рдФрд░ рд╕рдордЭрдиреЗ рдХрд╛ рдПрдХ рдЙрдкрдпреЛрдЧреА рддрд░реАрдХрд╛ рдорд┐рд▓ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдпрд╛ рд╕реНрдЯрд╛рд░реНрдЯрд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ, рдЗрд╕реЗ рдлреЛрд░реНрдХ рдХрд░рдирд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдлрд┐рд░ рдЙрди рдЪреАрдЬреЛрдВ рдХреЛ рд╣рдЯрд╛ рджреЗрдВ рдЬреЛ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдирд╣реАрдВ рд╣реИрдВ рдЬрдм рддрдХ рдХрд┐ рдЖрдк рдХреЗрд╡рд▓ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдХреЛрдб рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рдЫреЛрдбрд╝реЗ рдЬрд╛рддреЗ рдЖрдк рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ; рдФрд░ рдлрд┐рд░ рдЙрд╕ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рдХрд┐рд╕реА рдЕрдиреНрдп рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдкрд░ рдкреЛрд░реНрдЯ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред

@kolpav @camstuart рдЗрд╕ рдзрд╛рдЧреЗ рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рд╕реБрд░рдХреНрд╖рд╛ рдореЙрдбрд▓реЛрдВ рдХреА рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡реНрдпрд╛рдкрдХ рдЪрд░реНрдЪрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдХреБрдЫ рд╕рд╛рдорд╛рдиреНрдп рдЧрд▓рддрдлрд╣рдорд┐рдпреЛрдВ рдФрд░ рд╡реНрдпрд╛рдкрд╛рд░-рдирд╛рдкрд╕рдВрдж рдХреЛ рджреВрд░ рдХрд░рдирд╛ рд╢рд╛рдорд┐рд▓ рд╣реИред рдореИрдВ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдХреЗрд╡рд▓ HTTP рдХреБрдХреАрдЬрд╝ рдФрд░ рд╕реАрдПрд╕рдЖрд░рдПрдл рдЯреЛрдХрди (рдФрд░ рд╕рддреНрд░ рдЯреЛрдХрди рдХреЗ рд▓рд┐рдП рдЬреЗрдбрдмреНрд▓реНрдпреВрдЯреА рдФрд░/рдпрд╛ рд╡реЗрдм рд╕реНрдЯреЛрд░реЗрдЬ рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдкрд░ рдПрдХреНрд╕рдПрд╕рдПрд╕ рдФрд░ рд╕реАрдПрд╕рдЖрд░рдПрдл рдХреЗ рдЦрд┐рд▓рд╛рдл рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реБрд░рдХреНрд╖рд╛ рджреЗрддрд╛ рд╣реВрдВ) рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд┐рдВрджреБрдУрдВ рдХреЛ рдиреЛрдЯ рдХрд░рддрд╛ рд╣реВрдВред рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкрдврд╝рдиреЗ рд▓рд╛рдпрдХ рд╣реИред

@iaincollins рдХреНрдпрд╛ рдЖрдкрдХрд╛ рдорддрд▓рдм рдХреБрдЫ рд▓рд┐рдВрдХ рдХрд░рдирд╛ рдерд╛? :рдореБрд╕реНрдХреБрд░рд╛рдУ:

рд╣реИрд▓реЛ рджреЛрд╕реНрддреЛрдВ :)

рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рд╕рд╡рд╛рд▓ рд╣реИ, рдореИрдВ рдЖрдЧреЗ рдкрдврд╝ рд░рд╣рд╛ рдерд╛, рд╕реНрдерд╛рдиреАрдп рд╕реНрдЯреЛрд░реЗрдЬ рд╕реЗ jwt рдХреЗ рд╕рд╛рде рдСрде рдХреЗ рд▓рд┐рдП рдЯреЛрдХрди рдирд╣реАрдВ рдорд┐рд▓ рд╕рдХрддрд╛ред

рдЕрдЧрд░ рдореЗрд░реЗ рдкрд╛рд╕ рдЕрдЧрд▓реА рдХреЗ рд╕рд╛рде рдореЗрд░реА рд╕рд╛рдЗрдЯ рдХрд╛ рдкрд╣рд▓рд╛ рдЪрд╛рд░реНрдЬ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд░реНрд╡рд░ рд╣реИред рдФрд░ рдореЗрд░реЗ рдкрд╛рд╕ рдореЗрд░реЗ рдПрдкреАрдЖрдИ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рд╕рд░реНрд╡рд░ рд╣реИред рдпрд╣ рдЧреНрд░рд╛рд╣рдХ рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛/рдкрд╛рд╕ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдПрдХ jwt рджреЗрддрд╛ рд╣реИред рдХрд┐рди рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдореБрдЭреЗ рд╕рд░реНрд╡рд░ рдореЗрдВ рдЯреЛрдХрди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ ??

рдореБрдЭреЗ рд░реЗрдВрдбрд░ рд╕рд░реНрд╡рд░ (рдЕрдЧрд▓реЗ) рдореЗрдВ рдЯреЛрдХрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реЛрдЧреА?

рдпрджрд┐ рдХреНрд▓рд╛рдЗрдВрдЯ рдПрдкреАрдЖрдИ рд╕рд░реНрд╡рд░ рдХреЛ рдЯреЛрдХрди рдирд╣реАрдВ рднреЗрдЬрддрд╛ рд╣реИ, рддреЛ рдПрдкреАрдЖрдИ рдбреЗрдЯрд╛ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ, рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдирд┐рдЬреА рдЬрд╛рдирдХрд╛рд░реА рдирд╣реАрдВ рдорд┐рд▓ рд╕рдХрддреА рд╣реИред рдореБрдЭреЗ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖ рд░рд╣рд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рд░реЗрдВрдбрд░ рд╕рд░реНрд╡рд░ рдкрд░ рдЯреЛрдХрди рднреЗрдЬрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИред

@ kamilml

рдпрд╣ рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдЖрдкрдХреЗ рдкрд╛рд╕ рджреЛ рд╡рд┐рдХрд▓реНрдк рд╣реЛрддреЗ рд╣реИрдВ:

  1. рдЕрдЧрд▓рд╛ рд╕рд░реНрд╡рд░ рдЬреЗрдбрдмреНрд▓реНрдпреВрдЯреА рджреЗрдВ (рд╕рдВрднрд╡рддрдГ рдХреБрдХреА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ)ред рдпрд╣ рдиреЗрдХреНрд╕реНрдЯ рд╕рд░реНрд╡рд░ рдХреЛ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреА рдУрд░ рд╕реЗ рдПрдкреАрдЖрдИ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред рдЖрдк рдЗрд╕реЗ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдпрджрд┐ рдкреВрд░реНрдг рд╕рд░реНрд╡рд░ рд╕рд╛рдЗрдб рдкреНрд░рддрд┐рдкрд╛рджрди рдЖрдкрдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред

  2. рдХреНрд▓рд╛рдЗрдВрдЯ рд╕реНрдерд╛рдиреАрдп рд╕реНрдЯреЛрд░реЗрдЬ рдореЗрдВ рдЬреЗрдбрдмреНрд▓реНрдпреВрдЯреА рд╕реНрдЯреЛрд░ рдХрд░реЗрдВ рдФрд░ рдиреЗрдХреНрд╕реНрдЯ рд╕рд░реНрд╡рд░ рдХреЛ рдЗрд╕реЗ рдПрдХреНрд╕реЗрд╕ рди рджреЗрдВред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрдк рдмрд╕ рдПрдкреАрдЖрдИ рдХреЙрд▓ рд╕рд░реНрд╡рд░ рд╕рд╛рдЗрдб рдХреЛ рдмрд╛рдпрдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рд╕рд╛рдЗрдб рд▓реЛрдбрд┐рдВрдЧ рдкреВрд░реНрдг рд╣реЛрдиреЗ рддрдХ рдкреВрд░реНрдг рд░реЗрдВрдбрд░ рд╕реНрдердЧрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рдЦреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЦреЗрдж рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдХрд┐ рдореИрдВ рдЗрд╕ рдзрд╛рдЧреЗ рдореЗрдВ рдЕрдкрдиреЗ 2 рд╕реЗрдВрдЯ рдЬреЛрдбрд╝ рджреВрдВрдЧрд╛, рдФрд░ рдЗрд╕ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдореЗрд░рд╛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЖрд░ рдПрдВрдб рдбреА рдХреИрд╕реЗ рдмрдврд╝ рд░рд╣рд╛ рд╣реИред рдХрдо рдХреЛрдб рдЙрджрд╛рд╣рд░рдг, рдЕрдзрд┐рдХ рдЙрдЪреНрдЪ-рд╕реНрддрд░реАрдп рдкреНрд░рд╡рд╛рд╣ред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╕рдВрджрд░реНрдн рдХреЗ рд▓рд┐рдП, рд╣рдорд╛рд░рд╛ рдЕрдзрд┐рдХрд╛рдВрд╢ рдРрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рд┐рдореНрдлрдиреА 3 (PHP) рдореЗрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рд╣рд╛рдЗрдмреНрд░рд┐рдб рдЕрдиреБрднрд╡ рдХреЗ рд▓рд┐рдП Vue рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рд╕рд░реНрд╡рд░ рдПрдХ рд░реИрдкрд░ рдкреГрд╖реНрда рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдРрдк рдбреЗрдЯрд╛ рдХреЛ рдРрдк рдХреЛ рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП __INITIAL_STATE__ рдЕрд╕рд╛рдЗрди рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рд╕рд┐рдореНрдлрдиреА (рдПрд╕рдИрдУ рдХреЗ рд▓рд┐рдП) рдореЗрдВ рдорд╛рд░реНрдХреЗрдЯрд┐рдВрдЧ рдкреЗрдЬреЛрдВ рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдФрд░ рдЬреЗрдПрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдФрд░ рдЕрдзрд┐рдХ рдПрд╕рдкреАрдП-рдИрд╢ рдЕрдиреБрднрд╡ рдкреНрд░рджрд╛рди рдХрд░рдХреЗ рдЕрдиреНрдп рдХреНрд╖реЗрддреНрд░реЛрдВ рдореЗрдВ рдПрд╕рдИрдУ рдкрд░ рдпреВрдПрдХреНрд╕/рдпреВрдЖрдИ рдЪреБрдирдиреЗ рдХреЗ рдмреАрдЪ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рднреА рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ, рд╕рднреА рдкреГрд╖реНрда рдмрд╛рдЗрдирд░реА рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ/рдирд┐рдЬреА рдирд╣реАрдВ рд╣реИрдВ (рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдХреБрдЫ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рджреЗрдЦрд╛ рд╣реИ)ред рдХреБрдЫ рдкреГрд╖реНрда рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╣реЛрддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдкреНрд░рдорд╛рдгрд┐рдд рд╣реЛрдиреЗ рдкрд░ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рдкреНрд░рд╕реНрддреБрдд рд╣реЛрддреЗ рд╣реИрдВред рд╣рдо рд╕рд╛рдЗрдЯ рдХреЗ рдХреБрдЫ рд╣рд┐рд╕реНрд╕реЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдПрд╕рдкреАрдП рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░ рд░рд╣реЗ рдереЗ, рд▓реЗрдХрд┐рди рдХрдИ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рддрд░реАрдХреЛрдВ рд╕реЗ, рдпрд╣ рдПрдХ рдЦрд░рд╛рдм рдпреВрдПрдХреНрд╕/рдпреВрдЖрдИ (рдзреАрдорд╛ рдЯреАрдЯреАрдЖрдИ, рдкреНрд░рдЧрддрд┐ рдмрд╛рд░, рдЖрджрд┐) рдерд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рдПрд╕рдИрдУ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЬрдм рддрдХ рдХрд┐ рд╣рдо рдПрдлрдУрдпреВрд╕реА рдкреЗрд╢ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рджреЛ рдмрд╛рд░ рдкрд╛рда рдкреНрд░рд╕реНрддреБрдд рдХрд░рддреЗ рд╣реИрдВ (рдПрдХ рдмрд╛рд░ рд╕рд┐рдореНрдлрдиреА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ, рдПрдХ рдмрд╛рд░ рдлрд┐рд░ рдЬреЗрдПрд╕ рдШрдЯрдХреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ), рдЖрджрд┐ред

рдПрд╕рдПрд╕рдЖрд░ / рдпреВрдирд┐рд╡рд░реНрд╕рд▓ рдЬреЗрдПрд╕ рджрд░реНрдЬ рдХрд░реЗрдВ ...

рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдореИрдВрдиреЗ рдЬреЛ рдХрд┐рдпрд╛, рд╡рд╣ PHPSESSID рддрд░реНрдХ рдХреА рдирдХрд▓ рдХрд░рдирд╛ рдерд╛, рдПрдХ HttpOnly UJSSESSID рдХреБрдХреА рдмрдирд╛рдХрд░ (рдирд╛рдо рдмрдирд╛рдпрд╛), рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдорд╛рди рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬреЗрдбрдмреНрд▓реНрдпреВрдЯреАред рд╕рд┐рдореНрдлрдиреА рдРрдк рдкреНрд░рддреНрдпреЗрдХ рдкреГрд╖реНрда рдЕрдиреБрд░реЛрдз рдореЗрдВ рдЗрд╕реЗ рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рд╛рдЗрдЯ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдиреЗрд╡рд┐рдЧреЗрдЯ рдХрд░рддрд╛ рд╣реИред рдЬрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдпреВрдЬреЗрдПрд╕ рдкреГрд╖реНрдареЛрдВ рдХреЛ рд╣рд┐рдЯ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЙрди рдРрдкреНрд╕ рдХреЗ рд╕рд░реНрд╡рд░-рд╕рд╛рдЗрдб рдЕрдиреБрд░реЛрдз рдореЗрдВ рдХреБрдХреАрдЬрд╝ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗ (рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЗ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рдЕрдиреБрд╕рд╛рд░)ред рдпрджрд┐ UJSSESSID рдХреБрдХреА рд╕реЗрдЯ рдХреА рдЬрд╛рддреА рд╣реИ, рддреЛ рдРрдк рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдкреАрдЖрдИ рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП /api/v1/users/me Authentication рд╣реЗрдбрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЯреЛрдХрди рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде)ред рдмрд╛рдХреА рдХреЙрд▓реЗрдВ рдЙрд╕реА рдЯреЛрдХрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдкреАрдЖрдИ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХреА рдЬрд╛рддреА рд╣реИрдВред рд╕рд┐рдореНрдлрдиреА рд▓реЙрдЧрдЖрдЙрдЯ рддрдВрддреНрд░ UJSSESSID рдХреБрдХреА рдХреЛ рд╕рд╛рдл рдХрд░рддрд╛ рд╣реИред рдЕрдЧрд▓реА рдмрд╛рд░ UJS рдРрдк рд▓реЛрдб рд╣реЛрдиреЗ рдкрд░, рдпрд╣ рдЕрдирд╛рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдореЛрдб рдореЗрдВ рдкреГрд╖реНрдареЛрдВ рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░реЗрдЧрд╛ред рдПрдлрд╡рд╛рдИрдЖрдИ, рд╕рд┐рдореНрдлрдиреА рдмрдирд╛рдо рдпреВрдЬреЗрдПрд╕ рдкреЗрдЬ рд░реВрдЯрд┐рдВрдЧ рдЕрдкрд╛рдЪреЗ рдХреЗ ProxyPass рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕реНрдерд╛рдиреАрдп рд╕реНрдЯреЛрд░реЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЕрдВрддрд┐рдо рдкрд░рд┐рдгрд╛рдо рдПрдХ рдирд┐рд░реНрдмрд╛рдз рдпреВрдПрдХреНрд╕ рд╣реИ рдЬрд╣рд╛рдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреБрдЫ рдкреГрд╖реНрдареЛрдВ рдкрд░ рд╣реИ рдЬреЛ рдХреНрд▓рд╛рдЗрдВрдЯ-рд╕рд╛рдЗрдб рдЬреЗрдПрд╕ рдХреЗ рд╕рд╛рде PHP рд╣реИрдВ, рдФрд░ рдХреБрдЫ рдкреЗрдЬ рдпреВрдЬреЗрдПрд╕ рд╣реИрдВред рдпрд╣ рд╣рдореЗрдВ рдП / рдмреА рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдмрдирд╛рддрд╛ рд╣реИ, рдФрд░ рд╕рд╛рдЗрдЯ рдХреЛ рдмрд╛рд░-рдмрд╛рд░ рдЕрдкрдбреЗрдЯ рдХрд░рддрд╛ рд╣реИ - рд╣рд░ рдХрд┐рд╕реА рдХреЛ рдЦрд░реЛрдВрдЪ рд╕реЗ рд╢реБрд░реВ рдирд╣реАрдВ рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИ :)

рдЬрдмрдХрд┐ рдпрд╣ рд╕рд╣рдЬреАрд╡реА PHP/UJS рдХреЗ рдХрд╛рд░рдг рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИ, рдЙрд╕реА рд╕рд┐рджреНрдзрд╛рдВрдд рдХрд╛ рдЙрдкрдпреЛрдЧ API рдпрд╛ Node.js рд╕рд░реНрд╡рд░ рдорд┐рдбрд▓рд╡реЗрдпрд░ (рдЬреИрд╕реЗ рдПрдХреНрд╕рдкреНрд░реЗрд╕, рдПрдбреЛрдирд┐рд╕, рдЖрджрд┐) рдХреЗ рд╕рд╛рде рдкреВрд░реНрдг UJS рд╕рдорд╛рдзрд╛рди рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред PHP рдкреГрд╖реНрда рдЕрдиреБрд░реЛрдз ( HttpOnly рдзреНрд╡рдЬ) рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ UJSSESSID рдХреБрдХреА рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдЕрдкрдиреЗ рдПрд╕рдкреАрдП/рдпреВрдЬреЗрдПрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓реЙрдЧрд┐рди рдХрд░реЗрдВ, рдФрд░ рд╡рд╣рд╛рдВ рдХреБрдХреА рд╕реЗрдЯ рдХрд░реЗрдВред рдЖрдкрдХреЛ рдХреНрдпрд╛ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, JWT рдХреЛ рдбреАрдХреЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рдРрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ, рдпрд╛ рддреГрддреАрдп рдкрдХреНрд╖ рдХреЙрд▓ рдХрд░рдирд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП client_secret рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЙрд╕рдХреЗ рд▓рд┐рдП рд╕рд░реНрд╡рд░ рдкрд░ рд░рд╣рдиреЗ рд╡рд╛рд▓реЗ рдорд┐рдбрд▓рд╡реЗрдпрд░ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░реЗрдВред

рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрд┐рд╕реА рдХреА рдорджрдж рдХрд░рддрд╛ рд╣реИред рдореИрдВрдиреЗ рдЬреЛ рдЕрдиреНрдп рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗ рд╣реИрдВ, рд╡реЗ рдореЗрд░реЗ рд▓рд┐рдП рдереЛрдбрд╝реЗ рдмрд╣реБрдд рдкреЗрдЯреНрд░реА рдбрд┐рд╢ рдереЗред

@jaredpalmer рдЕрд░реЗ рдЙрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдореИрдВрдиреЗ рдЗрд╕реЗ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рдмрд╕ рдЕрдкрдиреЗ рд╕рднреА рдХреЛрдб рдХреЛ рдХреЙрдкреА-рдкреЗрд╕реНрдЯ рдХрд┐рдпрд╛ рдФрд░ рдЕрдкрдиреЗ рдбреИрд╢рдмреЛрд░реНрдб.рдЬреЗрдПрд╕ рдХреЛ рдореЗрд░реЗ рдЗрдВрдбреЗрдХреНрд╕.рдЬреЗрдПрд╕ рд╕реЗ рдмрджрд▓ рджрд┐рдпрд╛ рдЬреЛ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

const index = () =>
  <div>
    <span>WoooHoooo</span>
  </div>

export default withAuth(index)

рдФрд░ рд╕рд╛рде рдореЗрдВ рдореИрдВрдиреЗ рдЗрд╕реЗ рд╕рд╛рдЗрдирдЗрди рдкреЗрдЬ рдкрд░ рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрджрд▓ рджрд┐рдпрд╛ред
рд▓реЗрдХрд┐рди рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рдпрд╣ рд╕рд╛рдЗрди рдЗрди рдкреЗрдЬ рдкрд░ рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ рдХрд░рддрд╛ рд╣реИ, рдЗрдВрдбреЗрдХреНрд╕ рдкреЗрдЬ рдХреА рд╕рд╛рдордЧреНрд░реА рдЕрднреА рднреА рдереЛрдбрд╝реА рджреЗрд░ рдХреЗ рд▓рд┐рдП рдлреНрд▓реИрд╢ рд╣реЛрддреА рд╣реИред :рдПрд╕

рдЗрд╕ рдореБрджреНрджреЗ рдХреА рд╕реНрдерд┐рддрд┐ рдХреНрдпрд╛ рд╣реИ? рдореИрдВ

рдкреВрд░реА рдЪрд░реНрдЪрд╛ рдХреЛ рдкрдврд╝рдиреЗ рд╡рд╛рд▓реЗ рдирдП рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдпрд╣ рдереЛрдбрд╝рд╛ рднрд╛рд░реА рд╣реИред рдореИрдВрдиреЗ рдпрд╣рд╛рдВ рдмрд╣реБрдд рд╣реА рдмреБрдирд┐рдпрд╛рджреА рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ред рдХреЗрд╡рд▓ 2 рдкреГрд╖реНрда (рд╕реВрдЪрдХрд╛рдВрдХ, рд▓реЙрдЧрд┐рди), рдФрд░ рдПрдХ рдХрд╕реНрдЯрдо рд╕рд░реНрд╡рд░
https://github.com/trandainhan/next.js-example-authentication-with-jwt

рдореВрд▓ рд░реВрдк рд╕реЗ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрд░реЛрдз рдХреЗ рд╢реАрд░реНрд╖рд▓реЗрдЦ рдореЗрдВ рдЯреЛрдХрди рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд░реНрд╡рд░ рдореЗрдВ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдорд┐рдбрд▓рд╡реЗрдпрд░ рд╣реИред jwt-token рдХреБрдХреАрдЬрд╝ рдореЗрдВ рд╕реНрдЯреЛрд░ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИ, рд╕реАрдзреЗ рдЖрдЧреЗ рд╣реИ рдФрд░ рдмрд╣реБрдд рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

@trandainhan рдХреНрдпрд╛ рдЖрдк рдПрдХ рдкреЛрд╕реНрдЯ рдПрдВрдбрдкреЙрдЗрдВрдЯ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ

@sbking рд╕реАрдПрд╕рдЖрд░рдПрдл рд╣рдорд▓реЛрдВ рджреНрд╡рд╛рд░рд╛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ рдХреЗ рд╕рд╛рде рдЕрджреНрдпрддрди рд╕реНрд░реЛрдд рдХреЛрдб

рдХреНрдпрд╛ рдпрд╣ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИ?

рдХрд┐рд╕реА рдиреЗ redux-auth-рдЖрд╡рд░рдг рдХреЗ рд╕рд╛рде рдкреНрд░рдорд╛рдгрди рдХреА рдХреЛрд╢рд┐рд╢ рдХреА?

рд╕рднреА рдХреЛ рдирдорд╕реНрдХрд╛рд░! рдкрд┐рдЫрд▓реЗ рдорд╣реАрдиреЛрдВ рдореЗрдВ рдореИрдВрдиреЗ рдмрдирд╛рдпрд╛, рдФрд░ рдЕрдм рдкрд░рд┐рд╖реНрдХреГрдд рдХрд┐рдпрд╛ рдЧрдпрд╛

  • рдиреЛрдб.рдЬреЗрдПрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЦрд╛рддрд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЬрд┐рд╕реЗ рдУрде рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ: https://github.com/nmaro/ooth
  • рдПрдХ рдиреНрдпреВрдирддрдо рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдХреЗ рд╕рд╛рде рдЕрдЧрд▓реЗ рдФрд░ рдКрде рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдПрдХ рд╕реНрдЯрд╛рд░реНрдЯрд░ рд▓рд╛рдЗрдмреНрд░реЗрд░реА: https://github.com/nmaro/staart

рдЗрд╕рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ:

  • рдИрдореЗрд▓ рдФрд░ рдкрд╛рд╕рд╡рд░реНрдб рдХреЗ рд╕рд╛рде рдкрдВрдЬреАрдХрд░рдг
  • рдИрдореЗрд▓ рдпрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо рдФрд░ рдкрд╛рд╕рд╡рд░реНрдб рдХреЗ рд╕рд╛рде рд▓реЙрдЧрд┐рди рдХрд░реЗрдВ
  • рдЦрд╛рддрд╛ рдкреГрд╖реНрда рдЬрд╣рд╛рдВ рдЖрдк рдЕрдкрдирд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЕрдкрдирд╛ рдкрд╛рд╕рд╡рд░реНрдб рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдПрдХ рд╕рддреНрдпрд╛рдкрди рдИрдореЗрд▓ рднреЗрдЬ рд╕рдХрддреЗ рд╣реИрдВ
  • рдкрд╛рд╕рд╡рд░реНрдб рднреВрд▓ рдЧрдП/рдкрд╛рд╕рд╡рд░реНрдб рдкреГрд╖реНрда рд░реАрд╕реЗрдЯ рдХрд░реЗрдВ
  • рдИрдореЗрд▓ рдкреЗрдЬ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░реЗрдВ
  • рдореЛрдВрдЧреЛрдбреАрдмреА рд╕реЗ рдЬреБрдбрд╝рд╛ рдПрдХ рдмреБрдирд┐рдпрд╛рджреА рдЧреНрд░рд╛рдлрдХреНрдпреВрдПрд▓ рдПрдкреАрдЖрдИ (1 рдлрд╝рд╛рдЗрд▓, рдЖрд╕рд╛рдиреА рд╕реЗ рд╣рдЯрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ)
  • рдиреНрдпреВрдирддрдо рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ (рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЙрддрдирд╛ рддрд░реНрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдореЗрдВ рд╕рдордЭрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ)

рдпрд╣рд╛рдВ рд▓рд╛рдЗрд╡ рдбреЗрдореЛ рджреЗрдЦреЗрдВ :

рдореИрдВрдиреЗ рдЗрд╕реЗ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдЕрдкрдиреЗ рд▓рд┐рдП рд░реИрдкрд┐рдб рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдкрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдерд╛, рдПрдХ рд╕рд░рд▓, рдХрд╛рд░реНрдпрд╢реАрд▓ рдЦрд╛рддрд╛ рдкреНрд░рдгрд╛рд▓реА рдХреЗ рд╕рд╛рде рдПрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╕рд╛рде рдЬрд▓реНрджреА рд╕реЗ рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреЛ рдмрд╛рд╣рд░реА рд╕реЗрд╡рд╛рдУрдВ рдкрд░ рдирд┐рд░реНрднрд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдореИрдВ рдкрд░рд┐рдгрд╛рдореЛрдВ рд╕реЗ рдХрд╛рдлреА рдЦреБрд╢ рд╣реВрдВред рдореИрдВ рдЗрди рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдФрд░ рд░рдЦрд░рдЦрд╛рд╡ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рд╕реНрдерд╛рдкрд┐рдд рдЦрд╛рддрд╛ рдкреНрд░рдгрд╛рд▓реА + рдиреЛрдб рдХреЗ рд▓рд┐рдП рдпреВрдЖрдИ рдЕрднреА рднреА рдЧрд╛рдпрдм рд╣реИ рддреЛ рдЗрд╕реЗ рдЖрдЬрд╝рдорд╛рдПрдВред

@trandainhan рдзрдиреНрдпрд╡рд╛рдж, рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдЙрджрд╛рд╣рд░рдг рд╣реИ рдФрд░ рдмрд╣реБрдд рд╕реЗ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИ рдФрд░ рдХрдИ рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдореЗрдВ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред

рдореИрдВ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдореИрдВ рдиреЗрдХреНрд╕реНрдЯрдЬ-рд╕реНрдЯрд╛рд░реНрдЯрд░ рдореЗрдВ рд╡рд░реНрддрдорд╛рди рддрд░реНрдХ рдХреЛ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреИрд╕реЗ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ, рдЬрдмрдХрд┐ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреБрдирд┐рдпрд╛ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХреНрд╕рдкреНрд░реЗрд╕-рд╕рддреНрд░ рддрд░реНрдХ рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рд╡рдЬреВрдж рдореЗрд░реЗ рдкрд╛рд╕ рд╣реИ (рдЬреИрд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ Google oAuth API рдЬреИрд╕реА рдЪреАрдЬреЗрдВ рдЬрд╣рд╛рдВ рдореБрдЭреЗ рдкрд╣рд▓реЗ рд▓реЙрдЧрд┐рди рдкрд░ рджрд┐рдП рдЧрдП рдЯреЛрдХрди рдХреЛ рд░рдЦрдиреЗ рдФрд░ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд░реНрд╡рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ)ред

рдореБрдЭреЗ рдЕрднреА рддрдХ рдкрддрд╛ рдирд╣реАрдВ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рд╕рдВрднрд╡ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдРрд╕рд╛ рд╣реИ рддреЛ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдпрд╣ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реЛрдЧрд╛ред

рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рд▓реЛрдЧреЛрдВ рдХреЛ рд╡рд┐рднрд┐рдиреНрди рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдордЭрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣реАрдВ рди рдХрд╣реАрдВ рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рд▓рд┐рдЦрдиреЗ рд▓рд╛рдпрдХ рд╣реИред

@trandainhan : рдЕрдЧрд░ рдореИрдВ <Link href="/">Home</Link> рдЬреЛрдбрд╝рддрд╛ рд╣реВрдВ, рдФрд░ рдлрд┐рд░ рдЬреЗрдирд░реЗрдЯ рдХрд┐рдП рдЧрдП рд▓рд┐рдВрдХ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рдореИрдВ рд▓реЙрдЧ рдЗрди рдХрд┐рдП рдмрд┐рдирд╛ index.js рддрдХ рдкрд╣реБрдВрдЪ рд╕рдХрддрд╛ рд╣реВрдВред рдЖрдк рдЕрдкрдиреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рдХреИрд╕реЗ рджреЗрдВрдЧреЗ?

@iaincollins рдореБрдЭреЗ рдпрд╣рд╛рдВ рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕рдорд╛рдзрд╛рди рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВ рдЬреЛ рдПрдХ рдУрде рд╕реЗрд╡рд╛ рдХреЗ рд╡рд┐рд░реБрджреНрдз рдкреНрд░рдорд╛рдгрд┐рдд рд╣реЛрддреЗ рд╣реИрдВред рдХреНрдпрд╛ рдЬреЗрдбрдмреНрд▓реНрдпреВрдЯреА рдкрд░ рдирд┐рд░реНрднрд░ рдПрдкреАрдЖрдИ рдХреЗ рдЦрд┐рд▓рд╛рдл рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рд╣реИ?

@paulwehner рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реЛрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ @trandainhan рдиреЗ рдХреЗрд╡рд▓ рд╕рд░реНрд╡рд░ рд╕рд╛рдЗрдб

@ рдХрд╛рд░реНрд▓реЛрд╕-рдкреЗрд░реВ рд╣реБрдб рдХреЗ рддрд╣рдд, рд▓рд┐рдВрдХ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдЗрддрд┐рд╣рд╛рд╕ рдореЗрдВ рдирдП рдкрде рдХреЛ рдзрдХреНрдХрд╛ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдЧрд▓рд╛/рд░рд╛рдЙрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рдЪреАрдЬреЗрдВ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рджреНрд╡рд╛рд░рд╛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИрдВ, рд╕рд░реНрд╡рд░ рд╕рд╛рдЗрдб рдкрд░ рдорд┐рдбрд▓рд╡реЗрдпрд░ рдХреЗ рд▓рд┐рдП рдпрд╣рд╛рдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд░рдирд╛ рд╣реИред рдЕрдм рддрдХ, рдореИрдВ рдХреЗрд╡рд▓ рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ рд▓рд┐рдВрдХ рдШрдЯрдХ рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪ рд╕рдХрддрд╛ рд╣реВрдВ рдФрд░ рдЬрдм рднреА рд╣рдо рдпреВрдЖрд░рдПрд▓ рдмрджрд▓рддреЗ рд╣реИрдВ рддреЛ рдЕрдиреНрдп рдЪреАрдЬреЗрдВ рдХрд░рддреЗ рд╣реИрдВред

@ рдХрд╛рд░реНрд▓реЛрд╕-рдкреЗрд░реВ рд░реВрдЯрд┐рдВрдЧ рдкрд░ рдкреВрд░реНрдг рдирд┐рдпрдВрддреНрд░рдг рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк рд╣рдореЗрд╢рд╛ рдХрд╕реНрдЯрдо рд╕рд░реНрд╡рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдзрдиреНрдпрд╡рд╛рдж @trandainhan рдФрд░ @kolpav! рд╕рдкреНрддрд╛рд╣рд╛рдВрдд рдореЗрдВ рдХреБрдЫ рд╕рдордп рдмрд┐рддрд╛рдиреЗ рдХреЗ рдмрд╛рдж рдореБрдЭреЗ рдмреЗрд╣рддрд░ рд╕рдордЭ рдорд┐рд▓реАред рдореИрдВ рдПрдХ рд╕рдорд╛рдзрд╛рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдореЗрдВ рднреА рдХрд╛рдордпрд╛рдм рд░рд╣рд╛ рдЬреЛ рдПрдЪрдУрд╕реА рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдХреБрдХреА рдкрд░ рдЬреЗрдбрдмреНрд▓реНрдпреВрдЯреА рдЯреЛрдХрди рд░рдЦрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕рд░реНрд╡рд░ рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рджреЛрдиреЛрдВ рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрднреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

@nmaro рдореЗрд░реЗ рдкрд╛рд╕ next.js рдФрд░ рдПрдХ рдРрдк (рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдореВрд▓) рдореЗрдВ рдПрдХ рд╡реЗрдмрд╕рд╛рдЗрдЯ рдХреЗ рд▓рд┐рдП рдЬреЗрдбрдмреНрд▓реНрдпреВрдЯреА рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХреЗ рд╕рд╛рде рдмреИрдХрдПрдВрдб рд╣реИред

рдЗрд╕рд▓рд┐рдПред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдЧрд▓реЗ рдореЙрдбрд▓ рдореЗрдВ: рдХреНрд▓рд╛рдЗрдВрдЯ рдПрдХ рдлреЗрд╕рдмреБрдХ рдЯреЛрдХрди рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ (рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдлреЗрд╕рдмреБрдХ рд▓реЙрдЧрд┐рди рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ) рдФрд░ рдлрд┐рд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдмреИрдХрдПрдВрдб рдХреЛ рдЯреЛрдХрди рднреЗрдЬрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЯреЛрдХрди рдХреА рдЬрд╛рдВрдЪ рдФрд░ рд╕рддреНрдпрд╛рдкрди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ (рдиреЛрдб-рдЬреЗрдПрд╕ рдмреИрдХрдПрдВрдб рдореЗрдВ рдкрд╛рд╕рдкреЛрд░реНрдЯ-рдлреЗрд╕рдмреБрдХ-рдЯреЛрдХрди) . рдлрд┐рд░, рдпрджрд┐ рдЯреЛрдХрди рдЕрдЪреНрдЫрд╛ рд╣реИ, рддреЛ рдмреИрдХрдПрдВрдб рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдмреИрдХрдПрдВрдб рдореЗрдВ рдЙрддреНрдкрдиреНрди JWT рдХреЛ рднреЗрдЬрддрд╛ рд╣реИред

рд╕рдорд╕реНрдпрд╛? рдЖрдкрдХрд╛ рдЯреВрд▓ рдлреЗрд╕рдмреБрдХ рдФрд░ рдЧреВрдЧрд▓ рд╕реЗ рдХреБрдВрдЬреА рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ? рдореИрдВ hello.js рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди next.js рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд рдирд╣реАрдВ рд╣реИ рдФрд░ рдкреВрд░реА рджреБрдирд┐рдпрд╛ рдкрд╛рд╕рдкреЛрд░реНрдЯ-рдлреЗрд╕рдмреБрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдмрдбрд╝реА рдЧрд▓рддреА рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдПрдкреАрдЖрдИ рд╕рд░реНрд╡рд░ рдХреЛ рд╡реЗрдм рдХреНрд▓рд╛рдЗрдВрдЯ рдФрд░ рдореЛрдмрд╛рдЗрд▓ рдРрдк рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╢реБрдХреНрд░рд┐рдпрд╛

рдкреБрдирд╢реНрдЪ: рдореБрдЭреЗ рдЖрдкрдХреЗ рд╕реБрд╕реНрдд рдЪреИрдирд▓ рдореЗрдВ рдирд┐рдордВрддреНрд░рдг рдирд╣реАрдВ рдорд┐рд▓ рд░рд╣рд╛ рд╣реИред

@hmontes рдпрд╣рд╛рдБ - рдУрде рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП рд╕реБрд╕реНрдд рдЪреИрдирд▓ рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рдордВрддреНрд░рдг (рдиреЛрдб рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЦрд╛рддреЗ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ next.js) рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рдорд╣рд╕реВрд╕ рдХрд░реЗрдВред рдКрде рдкрд╛рд╕рдкреЛрд░реНрдЯ-рдлреЗрд╕рдмреБрдХ-рдЯреЛрдХрди (рдкрд╛рд╕рдкреЛрд░реНрдЯ-рдлреЗрд╕рдмреБрдХ рдирд╣реАрдВ) рдФрд░ рдкрд╛рд╕рдкреЛрд░реНрдЯ-рдЧреВрдЧрд▓-рдЖрдИрдбреА-рдЯреЛрдХрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд░рддрд╛ рд╣реИред

@nmaro рдореИрдВ рдЖрдкрдХреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдЖрдкрдХреА рдорджрдж рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдореЗрд░реЗ рдкрд╛рд╕ рдЧреНрд░рд╛рдлрд╝рд┐рдХрд▓ рдХреЗ рд╕рд╛рде рдкрд╛рд╕рдкреЛрд░реНрдЯ-рдлреЗрд╕рдмреЙрдХ рдФрд░ рдкрд╛рд╕рдкреЛрд░реНрдЯ-рдЧреВрдЧрд▓-рдЖрдИрдбреА-рдЯреЛрдХрди рдХреЗ рд╕рд╛рде рдмреИрдХрдПрдВрдб рднреА рд╣реИ !!!

рдкрд░рдВрддреБред рдХреНрдпрд╛ рдЖрдк next.js рдореЗрдВ рдХрдиреЗрдХреНрдЯ facebook/google рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдЧрдд рдкреИрдХреЗрдЬ рдЬрд╛рдирддреЗ рд╣реИрдВ?

рдХреНрд▓рд╛рдЗрдВрдЯ рд╕рд╛рдЗрдб рдкрд░ рдЖрдк рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рдпрд╣рд╛рдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдП рдЧрдП рд╕рдорд╛рди рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: https://github.com/nmaro/staart/blob/master/packages/staart/src/components/login-facebook.js https://github. com/nmaro/staart/blob/master/packages/staart/src/components/login-google.js
( oothClient.authenticate рдмрдЬрд╛рдп рдмрд╕ рдЕрдкрдиреЗ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдорд╛рд░реНрдЧ рдкрд░ рдПрдХ рдкреЛрд╕реНрдЯ рдЕрдиреБрд░реЛрдз рднреЗрдЬреЗрдВ)ред

@timneutkens рдХрдо рд╕реЗ рдХрдо рдУрде рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рдПрдХ рдкреАрдЖрд░ рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛?

рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ @nmaro ред рдЖрдк рдХрдВрдкреЛрдиреЗрдВрдЯрд╡рд┐рд▓рдорд╛рдЙрдВрдЯ рдХреЗ рдмрдЬрд╛рдп рдХрдВрдкреЛрдиреЗрдВрдЯрдбрд┐рдбрдорд╛рдЙрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрдпреЛрдВ рдХрд░рддреЗ рд╣реИрдВ?

рдореИрдВ Google рд▓реЙрдЧрд┐рди рдХреЗ рд▓рд┐рдП рдПрдХ рдПрдЪрдУрд╕реА (рдкреНрд░рджрд╛рддрд╛) рдШрдЯрдХ рдмрдирд╛ рд░рд╣рд╛ рд╣реВрдВред

рдХреНрдпрд╛ рдХреЙрдореНрдкреЛрдиреЗрдВрдЯрд╡рд┐рд▓рдорд╛рдЙрдВрдЯ рдХреЗрд╡рд▓ рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд░ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ? рддрдм рдпрд╣ рдареАрдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдареАрдХ рд╣реИред рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд-рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рджред рдЕрдВрдд рдореЗрдВ рдореИрдВ рд╕реЛрд╢рд▓ рдореАрдбрд┐рдпрд╛ рдХреЗ рд╕рд╛рде рдкреНрд░рдорд╛рдгреАрдХрд░рдг рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред

рдЖрдЦрд┐рд░реА рд╕рд╡рд╛рд▓ред рдореИрдВрдиреЗ рдПрдХ рдПрдХреНрд╕реЗрд╕_рдЯреЛрдХрди рдФрд░ рд░реАрдлреНрд░реЗрд╢_рдЯреЛрдХрди рдмрдирд╛рдпрд╛ рд╣реИ рдФрд░ рдореИрдВ рдбреЗрдЯрд╛ рдХреЛ рд╕рд╣реЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдерд╛рдиреАрдп рд╕реНрдЯреЛрд░реЗрдЬ рдореЗрдВ рд░рдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред

рдкреЗрдЬ рд░реАрдлреНрд░реЗрд╢ рд╣реЛрдиреЗ рдкрд░ рд▓реЙрдЧрд┐рди рдЬрд╛рдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдВ рдЗрд╕реЗ next.js рдореЗрдВ рдХрд╣рд╛рдВ рд░рдЦ рд╕рдХрддрд╛ рд╣реВрдВ? рдХреНрд░рд┐рдПрдЯ-рд░рд┐рдПрдХреНрд╢рди-рдРрдк рдореЗрдВ рдореИрдВрдиреЗ рдЗрд╕реЗ index.js . рдореЗрдВ рд░рдЦрд╛ рд╣реИ

...
import { loginUser } from './actions'
...
let accessToken = localStorage.getItem('access_token')
let refreshToken = localStorage.getItem('refresh_token')

if (accessToken && refreshToken) store.dispatch(loginUser({accessToken, refreshToken}))

ReactDOM.render(
  <ApolloProvider store={store} client={client}>
....

рд╢реБрдХреНрд░рд┐рдпрд╛

рдУрд╣ рдХреЗ рд╕рд╛рде, рдореИрдВ рдлреЗрд╕рдмреБрдХ рдЯреЛрдХрди рд╕реНрдЯреЛрд░ рдирд╣реАрдВ рдХрд░рддрд╛, рдореИрдВ рдХреЗрд╡рд▓ рдкрд╛рд╕рдкреЛрд░реНрдЯ рдХреЗ рд╕рд╛рде рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдлрд┐рд░ рд╕рд╛рдорд╛рдиреНрдп рдХреБрдХреА-рдЖрдзрд╛рд░рд┐рдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рддреНрд░ рдмрдирд╛рддрд╛ рд╣реВрдВред

рдЖрд╣ред рдареАрдХ рд╣реИред рдореИрдВ рд╕рддреНрд░ рдХреЗ рдмрдЬрд╛рдп рдЬреЗрдбрдмреНрд▓реНрдпреВрдЯреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдБред рддреЛ, рдореИрдВ рдмреИрдХрдПрдВрдб рдХреЛ access_token рднреЗрдЬрддрд╛ рд╣реВрдВ, рдпрд╣ рдЬрд╛рдВрдЪрддрд╛ рд╣реИ рдХрд┐ рдЯреЛрдХрди рд╕реЗрд╡рд╛ (рдЧреВрдЧрд▓, рдлреЗрд╕рдмреБрдХ) рдореЗрдВ рдорд╛рдиреНрдп рд╣реИ, рддреЛ рдпрджрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдореЗрд░реЗ рдРрдк рдореЗрдВ рдореМрдЬреВрдж рд╣реИ рдФрд░ рдореБрдЭреЗ рдПрдХ рдЬреЗрдбрдмреНрд▓реНрдпреВрдЯреА рд╡рд╛рдкрд╕ рднреЗрдЬрддрд╛ рд╣реИред

рд╢реБрдХреНрд░рд┐рдпрд╛ :)

рдореБрдЭреЗ рдпрд╣ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╕реНрдерд╛рдиреАрдп рд╕реНрдЯреЛрд░реЗрдЬ (рдПрдХреНрд╕рдПрд╕рдПрд╕ рдХреА рд╡рдЬрд╣ рд╕реЗ) рдореЗрдВ рдЬреЗрдбрдмреНрд▓реНрдпреВрдЯреА рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рдирд╛ рдЦрддрд░рдирд╛рдХ рд╣реИ, рдЕрдЧрд░ рдпрд╣ рд╕рдм рдПрдХ рд╕рд░реНрд╡рд░/рдбреЛрдореЗрди рдореЗрдВ рд╣реИ рддреЛ рдЙрдиреНрд╣реЗрдВ рдХреБрдХреАрдЬрд╝ рдХреЗ рд░реВрдк рдореЗрдВ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдХреНрд▓рд╛рдЗрдВрдЯ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛрдб рдЬреЗрдбрдмреНрд▓реНрдпреВрдЯреА рдирд╣реАрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдмреНрд░рд╛рдЙрдЬрд╝рд░ рднреЗрдЬ рджреЗрдЧрд╛ JWT рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдХреБрдХреАрдЬрд╝ рдХреЗ рд░реВрдк рдореЗрдВред рдЬреЗрдбрдмреНрд▓реНрдпреВрдЯреА рдореБрд╢реНрдХрд┐рд▓ рд╣реИрдВ (рдКрдкрд░ рд▓рдВрдмреА рдЪрд░реНрдЪрд╛ рджреЗрдЦреЗрдВ), рдЗрд╕рд▓рд┐рдП рдореИрдВ рд╕рддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред

рдореИрдВ рдПрдХ рдЬреЗрдбрдмреНрд▓реНрдпреВрдЯреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЗрд╡рд▓ рддрднреА рдХрд░рддрд╛ рд╣реВрдВ рдЬрдм рдУрде рдХреЛ рдмрд╛рд╣рд░реА рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрд╡рд┐рд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдХреНрдпреЛрдВрдХрд┐ рдХреБрдХреАрдЬрд╝ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рдбреЛрдореЗрди рдкрд░ рдХрд╛рдо рдХрд░рддреА рд╣реИрдВ), рдФрд░ рдлрд┐рд░ рднреА рдореИрдВ рдЗрд╕реЗ рд╕рд░реНрд╡рд░ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рддреНрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд┐рд▓реНрдХреБрд▓ рдПрдХ рдмрд╛рд░ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд░ рдХрд╣реАрдВ рднреА рд╕рдВрдЧреНрд░рд╣реАрдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ .

JWT рд╕реБрд░рдХреНрд╖рд╛ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк рдПрдХ рддрд╛рдЬрд╝рд╛ рдЯреЛрдХрди (oauth2 рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдПрдХ рдореЛрдмрд╛рдЗрд▓ рдРрдк рдХреБрдХреАрдЬрд╝ рдХреЛ рд╕рдВрднрд╛рд▓ рд╕рдХрддрд╛ рд╣реИ?

@рдирдорд╛рд░реЛ рдУрдХреЗред рдореИрдВ рддреБрдореНрд╣реЗрдВ рд╕рдордЭрддрд╛ рд╣реВрдВред рдореЗрд░реА рддреНрд░реБрдЯрд┐ рдХреЗ рд▓рд┐рдП рдХреНрд╖рдорд╛ рдХрд░реЗрдВред

рдХреНрдпрд╛ рдЖрдкрдХреЗ рдкрд╛рд╕ JWT рдЯреЛрдХрди рдХреЛ рдХреБрдХреА рдореЗрдВ рд╕рд╣реЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдпрд╛ рдХреЛрдб рд╣реИ? рдореИрдВ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдБ https://github.com/zeit/next.js/blob/master/examples/with-firebase-authentication (рдореЗрд░рд╛ рдСрде рд╕рд┐рд╕реНрдЯрдо рдЧреНрд░рд╛рдлрд╝рд┐рдХрд▓ рдХреЗ рд╕рд╛рде рд╣реИ)

рдирд╣реАрдВ, рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рдореИрдВрдиреЗ рдРрд╕рд╛ рдХрднреА рдирд╣реАрдВ рдХрд┐рдпрд╛ред

@hmontes @nmaro
рдореИрдВрдиреЗ рдЗрд╕реЗ рдЕрдкрдиреЗ рд▓рд┐рдП рд▓рд┐рдЦрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИ:
https://github.com/malixsys/mobazoo

рдЕрд░реЗ @malixsys рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдЖрдкрдХреЗ рдХреЛрдб рд╕реЗ рдореБрдЭреЗ рдХреБрдЫ рд╕рдордЭ рдирд╣реАрдВ рдЖ рд░рд╣рд╛ рд╣реИ: рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк API_BASE_URL рдХреЛ рдХрд┐рд╕реА рдмрд╛рд╣рд░реА рдЕрдзрд┐рдХрд╛рд░ рд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВрдЧреЗ? рдпрджрд┐ рдЖрдк рдЙрд╕ рдПрдкреАрдЖрдИ рдХреА рдУрд░ рдкреНрд░рдорд╛рдгрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреБрдХреА-рдЖрдзрд╛рд░рд┐рдд рд╕рддреНрд░ рд╢реБрд░реВ рдХрд░реЗрдЧрд╛, рд╣реИ рдирд╛? рд▓реЗрдХрд┐рди рдлрд┐рд░, рдЖрдк рдЙрд╕ рдХреБрдХреА рдХреЛ next.js рд╕рд░реНрд╡рд░ рдкрд░ рдХреИрд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдпрд╣ рдорд╛рдирддреЗ рд╣реБрдП рдХрд┐ рдЕрдЧрд▓рд╛.js рд╕рд░реНрд╡рд░ рдХрд┐рд╕реА рдЕрдиреНрдп рдбреЛрдореЗрди рдкрд░ рд╣реИ?

рдЖрд╣ рдирд╣реАрдВ, рдореИрдВ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдБ, рдЖрдк рдЙрд╕реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ /auth/signin рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВред рдареАрдХ рд╣реИ, рддреЛ рдпрд╣ рдореВрд▓ рд░реВрдк рд╕реЗ рд╡рд╣реА рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдореИрдВрдиреЗ рдЕрдЧрд▓реЗ.рдЬреЗрдПрд╕ / рд╕реНрдЯрд╛рд░ рдХреЗ рд╕рд╛рде рдУрде рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдерд╛ред

рдЕрд╕рд▓ рдореЗрдВ рдирд╣реАрдВ, рдореИрдВ рдЕрднреА рднреА рдЙрд▓рдЭрди рдореЗрдВ рд╣реВрдВ:/auth/signin рдореЗрдВ рдЖрдк рдПрдХ рдЬреЗрдбрдмреНрд▓реНрдпреВрдЯреА рд╡рд╛рдкрд╕ рджреЗрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЖрдк рдХреНрд▓рд╛рдЗрдВрдЯ рд╕рд╛рдЗрдб рдкрд░ рдЗрд╕рдХреЗ рд╕рд╛рде рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдмрд╛рдж рдореЗрдВ рдЖрдк "getUserFromCookie" рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдЖрдкрдиреЗ рдХреБрдХреА рдХрд╣рд╛рдВ рд╕реЗрдЯ рдХреА рд╣реИред

@nmaro рдореИрдВ рд╢реБрд░реБрдЖрдд рдореЗрдВ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╕ рдПрдХ рдмреБрдирд┐рдпрд╛рджреА рд▓реЙрдЧрд┐рди рдЪрд╛рд╣рддрд╛ рдерд╛ред рдореИрдВрдиреЗ рдЕрднреА рдХреЗ рд▓рд┐рдП рдПрдХ jwt рдФрд░ рдПрдХ рдХреБрдХреА рджреЛрдиреЛрдВ рд╕реЗрдЯ рдХреА рд╣реИрдВред рдХреБрдХреА рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдореИрдВрдиреЗ рдЕрднреА рддрдХ рдЗрд╕ рд░реЗрдкреЛ рдореЗрдВ рдХрд┐рд╕реА рдЕрдиреНрдп axios рдХреЙрд▓ рдореЗрдВ jwt рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИред рдореИрдВ рдПрдХ рдирд┐рдЬреА рдХрд╛рдВрдЯрд╛ рдореЗрдВ рдХрд░рддрд╛ рд╣реВрдВ рдЬрд╣рд╛рдВ API_BASE_URL рджреВрд╕рд░реЗ рдбреЛрдореЗрди рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ ...
рдпрд╣ рд╕рдм рдореЗрд░реА TODO рд╕реВрдЪреА рдореЗрдВ рд╣реИ, PWA рдХреЗ рд╕рд╛рдеред
рдХреГрдкрдпрд╛ рдмреЗрдЭрд┐рдЭрдХ рдХреЛрдИ рдореБрджреНрджрд╛ рдЦреЛрд▓реЗрдВ рдпрд╛ рдореБрдЭреЗ рдпрд╣рд╛рдВ рдкрд┐рдВрдЧ рдХрд░реЗрдВ...

@nmaro рдХреБрдХреА рдпрд╣рд╛рдВ saveUser() рдореЗрдВ рд╕реЗрдЯ рд╣реИ: https://github.com/malixsys/mobazoo/blob/master/utils/auth.js

@nmaro рдиреЗ https://github.com/malixsys/mobazoo/blob/master/pages/profile.js рдкрд░ рджреЛрдмрд╛рд░рд╛ рдХрд╛рдо рдХрд┐рдпрд╛

рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдореБрджреНрджрд╛ рдмрдВрдж рд╣реЛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдЕрдкрдирд╛ рд╕рдорд╛рдзрд╛рди рджрд┐рдЦрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред
https://next-auth.now.sh/
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреБрдЫ рд╣рдж рддрдХ zeit.co . рдХреА рд╡реЗрдмрд╕рд╛рдЗрдЯ рдХреЗ рд╕рдорд╛рди рд╣реИ

рдЕрдкреНрд░реИрд▓ 9

рдореИрдВрдиреЗ рдЗрд╕ рдкрд░ рдХреБрдЫ рдХрд╛рдо рдХрд┐рдпрд╛ рд╣реИ, рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЕрдиреНрдп рд╕рд╛рдорд╛рдиреЛрдВ рд╕реЗ рднрд░рд╛ рд╣реБрдЖ рд╣реИ рд╣рд░ рддрд░рд╣ рд╕реЗ рдпрд╣ рдореЗрд░реА рдкреНрд░рд╛рдердорд┐рдХрддрд╛рдУрдВ рдХреА рд╕реВрдЪреА рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╣реИ

рд╕рд┐рддрдореНрдмрд░ 22 #2974

рд╣рдо рдЬрд▓реНрдж рд╣реА рдПрдХ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдЙрджрд╛рд╣рд░рдг рдЬрд╛рд░реА рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВ, рдХреНрдпрд╛ рдЖрдк рдЗрд╕реЗ рдЕрд▓рдЧ рднрдВрдбрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЬрд╛рд░реА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рдерд╛рдВрдХреНрд╕!

@timneutkens

рдирдорд╕реНрддреЗ, рдЖрдкрдХреЛ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдлрд┐рд░ рд╕реЗ рдмрддрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЦреЗрдж рд╣реИ, рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдЖрдк рдХреГрдкрдпрд╛ рд╕рд╛рдЭрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд▓реЗрдЦ рдЙрджрд╛рд╣рд░рдг рдХреА рд╕реНрдерд┐рддрд┐ рдХреИрд╕реА рд╣реИ? рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдХреБрдЫ рдРрд╕рд╛ рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВ рджреЗрдЦрдирд╛ рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛ рдФрд░ рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рдЕрдиреНрдп рд▓реЛрдЧреЛрдВ рдХреА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рднреА рдирд┐рд░реНрдгрдп рдХрд░реВрдВрдЧрд╛ред рддреЛ рдпрд╣ рдкреНрд░рд╛рдердорд┐рдХрддрд╛рдУрдВ рдХреА рд╕реВрдЪреА рдореЗрдВ рдХрд┐рддрдирд╛ рдКрдВрдЪрд╛ рд╣реИ рдФрд░ рдХреНрдпрд╛ рд╣рдореЗрдВ рдЕрдкрдиреА рдЖрд╢рд╛рдУрдВ рдкрд░ рдЦрд░рд╛ рдЙрддрд░рдирд╛ рдЪрд╛рд╣рд┐рдП? рдореИрдВ

рдирдорд╕реНрддреЗ @kolpav , рдЙрдиреНрд╣реЛрдВрдиреЗ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рддреМрд░ рдкрд░ Next.js 5 рдХреЗ рд░реЛрдбрдореИрдк рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕рдХреА рдШреЛрд╖рдгрд╛ рдХреА рд╣реИред

рдЕрдВрдд рдореЗрдВ, рд╣рдо рдХреБрдЫ рдЕрддреНрдпрдзрд┐рдХ рдЕрдиреБрд░реЛрдзрд┐рдд рдЙрджрд╛рд╣рд░рдг (рдЬреИрд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреНрд░рдорд╛рдгреАрдХрд░рдг), Next.js рдЗрдВрдЯрд░реНрдирд▓ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдФрд░ рдЫреЛрдЯреА рд╕реБрд╡рд┐рдзрд╛рдПрдБ рдФрд░ рдмрдЧ рд╕рдорд╛рдзрд╛рди рдЬреЛрдбрд╝ рд░рд╣реЗ рд╣реИрдВред

https://zeit.co/blog/next-canary#the -roadmap

@babenzele рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫреА рдЦрдмрд░ рд╣реИред рдореБрдЭреЗ рдпрд╛рдж рдЖрдпрд╛ рд╣реЛрдЧрд╛ рдХрд┐

рд╣рдо Next.js 5 рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрд╣рд╛рдВ рдЕрдкрдбреЗрдЯ рд░рд╣ рд╕рдХрддреЗ рд╣реИрдВ? рдореИрдВ рдЗрд╕ рд╕рдордп auth0 рдХреЛ рдПрдХреАрдХреГрдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдПрдХ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ nextjs auth рдкрде/рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдкрд╛рд▓рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдиреЗрдХреНрд╕реНрдЯ.рдЬреЗрдПрд╕ рдХреЛ рдЬреЗрдбрдмреНрд▓реНрдпреВрдЯреА/рдХреБрдХреАрдЬрд╝/рд▓реЛрдХрд▓рд╕реНрдЯреЛрд░реЗрдЬ (рдпрд╛ рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рд╕рдВрдпреЛрдЬрди, рдЬрдм рддрдХ рдХрд┐ рдпрд╣ рдПрдХреНрд╕рдПрд╕рдПрд╕/рд╕реАрдПрд╕рдЖрд░рдПрдл рд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рдФрд░ рд╕рдВрд░рдХреНрд╖рд┐рдд рд╣реИ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдПрдХ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд╕реНрдерд╛рдиреАрдп рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдЙрджрд╛рд╣рд░рдг рдХреА рд╕рдЦреНрдд рдЬрд░реВрд░рдд рд╣реИ ... рдореИрдВрдиреЗ рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдореЗрдВ рдХрдИ рд╕рдкреНрддрд╛рд╣ рдмрд┐рддрд╛рдП рдПрдХ Passport.js рд╕реНрдерд╛рдиреАрдп рд░рдгрдиреАрддрд┐ рдХреЗ рд╕рд╛рде рдПрдХ рдЕрд▓рдЧ рдПрдХреНрд╕рдкреНрд░реЗрд╕ рдПрдкреАрдЖрдИ рд╕рд░реНрд╡рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕рдХреЗ рд╕рд╛рде рдЖрдПрдВред рдореИрдВрдиреЗ рд╕реНрдЯреЗрдЯрд▓реЗрд╕ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд▓рд┐рдП рдХреБрдХреА/рд▓реЛрдХрд▓рд╕реНрдЯреЛрд░реЗрдЬ рдореЗрдВ рдЬреЗрдбрдмреНрд▓реНрдпреВрдЯреА рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рдФрд░ рдЬрдм рдореИрдВрдиреЗ рдЕрдВрддрддрдГ рдЬреЗрдбрдмреНрд▓реНрдпреВрдЯреА рдФрд░ рд╕реНрдЯреЗрдЯрд▓реЗрд╕рдиреЗрд╕ рдХреЛ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рддреЛ рдореИрдВрдиреЗ рдПрдХреНрд╕рдкреНрд░реЗрд╕-рд╕реЗрд╢рди рдорд┐рдбрд▓рд╡реЗрдпрд░ рд╕реЗ рд╕рддреНрд░ рдЖрдИрдбреА рдХреЗ рд╕рд╛рде рдирд┐рдпрдорд┐рдд рдХреБрдХреА рдХреА рднреА рдХреЛрд╢рд┐рд╢ рдХреАред рдПрдХреНрд╕рдкреНрд░реЗрд╕-рд╕рддреНрд░ рдХреЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рдХрд╛рд░рдг рдПрдХреНрд╕рдкреНрд░реЗрд╕ рдПрдкреАрдЖрдИ рд╕рд░реНрд╡рд░ рдкрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рддреНрд░ рдмрдирд╛рдП рдЬрд╛ рд░рд╣реЗ рдереЗ, рдЬрд╣рд╛рдВ рдореИрдВ рд╕рдорд╕реНрдпрд╛рдУрдВ рдореЗрдВ рдЪрд▓ рд░рд╣рд╛ рдерд╛ (saveUninitialized: false рдХреЗ рд╕рд╛рде рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рдЧрдпрд╛)ред рдореИрдВрдиреЗ рдЕрдкрдиреЗ Next.js рдРрдк рдореЗрдВ рдПрдХреНрд╕рдкреНрд░реЗрд╕ рдХреЛрдб рдХреЛ server.js рдореЗрдВ рд▓реЗ рдЬрд╛рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕реЗ рдПрдХ рдЕрд▓рдЧ рд╕рд░реНрд╡рд░ рдмрдирд╛рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред рдореБрдЭреЗ рдкреВрд░рд╛ рдпрдХреАрди рд╣реИ рдХрд┐ рдореЗрд░рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди XSS/CSRF рдпрд╛ рдХреБрдХреА рдЕрдкрд╣рд░рдг рд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рдирд╣реАрдВ рд╣реИред рд╣рдореЗрдВ рдПрдХ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдЙрджрд╛рд╣рд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рд╕реНрдерд╛рдиреАрдп рдкреНрд░рдорд╛рдгреАрдХрд░рдг/рд▓реЙрдЧрд┐рди рдХреЗ рд▓рд┐рдП рд╕рд░реНрд╡реЛрддреНрддрдо рдкреНрд░рдерд╛рдУрдВ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рддрд╛ рд╣реИ, рдпрд╛ рд╢рд╛рдпрдж Next.js рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдореЙрдбреНрдпреВрд▓ рдЬреЛ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЬрдЯрд┐рд▓рддрд╛рдУрдВ рдХреЛ рд╕рдВрднрд╛рд▓реЗрдЧрд╛!

рдЬрдмрдХрд┐ рд╣рдо Next.js 5.x рдФрд░ рдЖрдЧреЗ рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЖрдк https://nextjs-starter.now.sh рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ рдЬреЛ рдЕрднреА рднреА рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рдмрдирд╛рдП рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдПрдХреНрд╕рдкреНрд░реЗрд╕, рдПрдХреНрд╕рдкреНрд░реЗрд╕ рд╕рддреНрд░, рд╕реАрдПрд╕рдЖрд░рдПрдл рдХреЗ рд╕рд╛рде рдиреЗрдХреНрд╕реНрдЯ.рдЬреЗрдПрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ ( рд╕реАрдЖрд░рдПрд╕рдПрдл рдЯреЛрдХрди), рдПрдХреНрд╕рдПрд╕рдПрд╕ (рд╕рддреНрд░ рдЯреЛрдХрди рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ HTTP рдХреБрдХреАрдЬрд╝) рдФрд░ рдУрдПрде рдФрд░ рдИрдореЗрд▓ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╛рд╕рдкреЛрд░реНрдЯ рдЬреЗрдПрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред

рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдСрде рдХреЛрдб рдХреЛ рд░реАрдлреИрдХреНрдЯрд░ рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рд╣реВрдВ, рдЬрд┐рд╕рд╕реЗ рдЙрдкрдпреЛрдЧ рдореЗрдВ рдЖрд╕рд╛рди рддрд░реАрдХреЗ рд╕реЗ Next.js рдкреНрд░реЛрдЬреЗрдХреНрдЯреНрд╕ рдореЗрдВ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдЬреЛрдбрд╝рдирд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрд╕рд╛рди рд╣реЛ рдЧрдпрд╛ рд╣реИред рд╕реНрдЯрд╛рд░реНрдЯрд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЙрджрд╛рд╣рд░рдг рд╕реЗ рдХреЛрдб рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рдХреЙрдкреА рдХрд┐рдП рдмрд┐рдирд╛, рдореЙрдбреНрдпреВрд▓ рдХреЛ рдЖрдкрдХреЛ рдХрд┐рд╕реА рднреА рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд╕рд╛рде рдЖрд╕рд╛рдиреА рд╕реЗ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреА рдЪрд╛рд╣рд┐рдПред рдореИрдВ рдЗрд╕ рд╕рдкреНрддрд╛рд╣ рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд┐рдП рдЬрд╛рдиреЗ рдХреА рдЙрдореНрдореАрдж рдХрд░ рд░рд╣рд╛ рд╣реВрдВред

рд╕рдВрджрд░реНрдн рдХреЗ рд▓рд┐рдП, "рдбрдмрд▓ рд╕рдмрдорд┐рдЯ рдХреБрдХреА" рд╡рд┐рдзрд┐ рд╕реАрдПрд╕рдЖрд░рдПрдл рд╕реБрд░рдХреНрд╖рд╛ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдПрдХ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИ рдпрджрд┐ рдЖрдк рдПрдХ рд╕рд░рд▓ рд▓реЗрдХрд┐рди рд╕реБрд░рдХреНрд╖рд┐рдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреА рддрд▓рд╛рд╢ рдореЗрдВ рд╣реИрдВред

рд╕реНрдерд╛рдиреАрдп рд╕реНрдЯреЛрд░реЗрдЬ рдореЗрдВ рдЬреЗрдбрдмреНрд▓реНрдпреВрдЯреА рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдХреНрд▓рд╛рдЗрдВрдЯ рд╕рд╛рдЗрдб рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реЗ рд╣рдореЗрд╢рд╛ рдкрдардиреАрдп рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд╕рд╛рдордЧреНрд░реА рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рд╕рдмрдорд┐рдЯ рдХреА рдЧрдИ рд╕рд╛рдордЧреНрд░реА рдпрд╛ рд╡рд┐рдЬреНрдЮрд╛рдкрди)ред

рдпрджрд┐ рдЖрдк рд╕рддреНрд░ рдЯреЛрдХрди рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ HTTP рдХреБрдХреАрдЬрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ - рдпрд╛ рдХреЗрд╡рд▓ HTTP рдореЗрдВ рдЯреЛрдХрди рдорд╛рди рдХреЗ рд╕рд╛рде JWT рдЬреИрд╕рд╛ рдХреБрдЫ (рдпрд╛ рд╕рдВрдкреВрд░реНрдг JWT рдХреЛ рдПрдиреНрдХреНрд░рд┐рдкреНрдЯ рдХрд░реЗрдВ рдФрд░ рд╕рд░реНрд╡рд░ рдкрд░ рдХреЗрд╡рд▓ HTTP рдЯреЛрдХрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕реЗ рдбрд┐рдХреНрд░рд┐рдкреНрдЯ рдХрд░реЗрдВ) - рддреЛ рд╕рддреНрд░ рдЙрддрдиреЗ рд╣реА рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИрдВ рдЬрд┐рддрдиреЗ рд╡реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рд╣реЛрдирд╛ред рд╡рд┐рдЪрд╛рд░ рд╕рд┐рд░реНрдл рдЗрддрдирд╛ рд╣реИ рдХрд┐, рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ, рд╕рддреНрд░ рдЯреЛрдХрди рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдХреНрд▓рд╛рдЗрдВрдЯ рд╕рд╛рдЗрдб рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрдардиреАрдп рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдмрд╣реБрдд рд╕реА рд╕рд╛рдЗрдЯреЗрдВ рдХреЗрд╡рд▓ HTTP рдХреБрдХреАрдЬрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреА рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕рд┐рдВрдЧрд▓ рдкреЗрдЬ рдРрдкреНрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рджрд░реНрдж рд╣реИ, рдФрд░ рдЗрд╕рдореЗрдВ рд╣рдореЗрд╢рд╛ рд╕рд╛рдордиреЗ рдХреЗ рдЕрдВрдд рдореЗрдВ рдХреБрдЫ рддрд░реНрдХ рддрд░реНрдХ рд╢рд╛рдорд┐рд▓ рд╣реЛрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрднреА рднреА рдЖрджрд░реНрд╢ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реИред

рдПрдХ рдЕрдиреНрдп рд╡рд┐рдХрд▓реНрдк рдЕрднреА рднреА https://github.com/nmaro/ooth рд╣реИ рдЬреЛ рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рдмрдирд╛рдП рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкреИрдХреЗрдЬ рдореЗрдВ рдЖрддрд╛ рд╣реИ рдФрд░ рдХреБрдЫ рдЙрддреНрдкрд╛рджрди рдРрдкреНрд╕ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред

@iaincollins рдореИрдВрдиреЗ Next.js рд╕реНрдЯрд╛рд░реНрдЯрд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ рдФрд░ рдЗрд╕реЗ рджреЗрдЦрдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛ред рдореБрдЭреЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕реБрд░рдХреНрд╖рд╛-рд╕рдВрдмрдВрдзреА (XSS/CSRF) рднрд╛рдЧреЛрдВ рдХреЛ рдЕрд▓рдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЕрдкрдиреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдПрдХреАрдХреГрдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдпрд╛ рдЬрдм рддрдХ рдЖрдк рдЕрд▓рдЧ рдореЙрдбреНрдпреВрд▓ рд╕рдорд╛рдкреНрдд рдирд╣реАрдВ рдХрд░ рд▓реЗрддреЗ, рддрдм рддрдХ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВред рдХреНрдпрд╛ рдХрд╣реАрдВ рдореИрдВ рдЙрд╕ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдкрд░ рдирдЬрд╝рд░ рд░рдЦ рд╕рдХрддрд╛ рд╣реВрдБ?

рд╣рд╛рдп @ рдХреЗрд▓реЗрдЧ1 ,

рдЕрдиреНрдп рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ рдореЙрдбреНрдпреВрд▓ рдЕрдм рдЕрдЧрд▓реЗ-рдкреНрд░рдорд╛рдгрд┐рдд рдореЙрдбреНрдпреВрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕рдореЗрдВ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╢рд╛рдорд┐рд▓ рд╣реИ рдЬреЛ рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдПред

рдЖрдЧреЗ рдХреЗ рд╕рдВрджрд░реНрдн рдХреЗ рд▓рд┐рдП, nextjs-starter.now.sh рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЕрдм рдиреЗрдХреНрд╕реНрдЯ-

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдЕрднреА рднреА рдХреБрдЫ рдЬрдЯрд┐рд▓ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рдореМрдЬреВрджрд╛ рдРрдк рд╣реИ рддреЛ рдЖрдкрдХреЛ рд╕рдВрджрд░реНрдн рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрджрд┐ рдРрд╕рд╛ рд╣реИ рддреЛ рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рдорджрдж рдХрд░рддрд╛ рд╣реИ

рдзреНрдпрд╛рди рджреЗрдВ: рд╕реАрдПрд╕рдЖрд░рдПрдл рдЕрднреА рднреА рдЗрд╕рдореЗрдВ рдХрд╛рдлреА рдордЬрдмреВрддреА рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИред рдпрд╣ рд▓реБрд╕реНрдХрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдЗрд╕рд▓рд┐рдП рдорд╛рдирддрд╛ рд╣реИ рдХрд┐ res.locals._csrf рд╕реЗрдЯ рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд┐рднрд┐рдиреНрди рд╕реАрдПрд╕рдЖрд░рдПрдл рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЕрд▓рдЧ-рдЕрд▓рдЧ рдирд┐рдЬреА рд╡рд░реНрд░реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

рдореИрдВ рд╕рд░рд╛рд╣рдирд╛ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдЕрднреА рднреА рдХрд┐рд╕реА рднреА рд╡реНрдпрдХреНрддрд┐ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИ, рд▓реЗрдХрд┐рди рдХрдо рд╕реЗ рдХрдо рдЕрдм рдСрде рдХреЛрдб рдХреЛ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдЕрд▓рдЧ рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рддрд╛рдХрд┐ рдореИрдВ рд░рд┐рдлреИрдХреНрдЯрд░ рд╢реБрд░реВ рдХрд░ рд╕рдХреВрдВред рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рд╕рдордп рдХреЗ рд╕рд╛рде рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рдПрдЧрд╛ (рд╡рд┐рднрд┐рдиреНрди рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╣реИрдВрдбрд▓рд░ рдФрд░ oAuth рдХреЗ рдЖрд╕рд╛рди рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рд╕рд╛рде)ред

@iaincollins рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ next.js рдкрд░ рдПрдХрдорд╛рддреНрд░ рдирд┐рд░реНрднрд░рддрд╛ https://github.com/iaincollins/next-auth/blob/master/index.js#L342 рд╣реИ ? рдпрджрд┐ рдРрд╕рд╛ рд╣реИ, рддреЛ рд▓рд┐рдм рдХреЛ рдЕрдЧрд▓рд╛ рдмрдирд╛рдирд╛ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред рдЬреЗрдПрд╕-рдЕрдЬреНрдЮреЗрдпрд╡рд╛рджреАред

@sedubois рдкреВрд░реА рддрд░рд╣ рд╕рд╣рдордд рд╣реИрдВ!

рд╣рд╛рд▓рд╛рдБрдХрд┐ рдпрд╣ рд╢рд╛рдпрдж рдпрд╣рд╛рдБ рдХреЗ рдмрдЬрд╛рдп рдЗрд╕рдХреЗ GitHub рд░реЗрдкреЛ рдореБрджреНрджреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫреА рдЪрд░реНрдЪрд╛ рд╣реИред ЁЯЩВ рдпрджрд┐ рдЖрдк рдРрд╕реЗ рддрд░реАрдХреЗ рд╕реБрдЭрд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рд╕реБрдзрд╛рд░рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд╕рд░рд▓ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рддреЛ рд╕рд╣рдпреЛрдЧ рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░реЗрдВрдЧреЗред

(рдХреБрдЫ рдРрд╕рд╛ рд╣реЛрдирд╛ рдЬреЛ рдЕрдЧрд▓реЗ рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЬрд┐рддрдирд╛ рдЖрд╕рд╛рди рд╣реЛ рд╕рдХреЗ, рдЕрднреА рднреА рдПрдХ рдкреНрд░рд╛рдердорд┐рдХ рд▓рдХреНрд╖реНрдп рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЗрд╕реЗ рдЕрдирдиреНрдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рднрд▓реЗ рд╣реА рдпрд╣ рдЕрдЧрд▓реЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХреЗрдВрджреНрд░рд┐рдд рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рд╕рд╛рде рднреА рд╕рдорд╛рдкреНрдд рд╣реЛред)

@timneutkens nextjs 5 рдХреА рд░рд┐рд▓реАрдЬрд╝ рдкрд░ рдмрдзрд╛рдИред рдирд┐рдХрдЯ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рд╣рдо рдЙрджрд╛рд╣рд░рдг рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдПрдХ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд╕реНрдерд╛рдиреАрдп рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдЙрджрд╛рд╣рд░рдг рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реБрдП рджреЗрдЦреЗрдВрдЧреЗ? рдпрд╛ рдпрд╣ рдЕрднреА рднреА рдмрд╛рдж рдореЗрдВ рд░рд┐рд▓реАрдЬ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ?

Ooth рдХреЗ рдкрд╛рд╕ рдЕрдм рдПрдХ рд╡реНрдпрд╛рдкрдХ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рд╣реИ, рдЬрд┐рд╕рдореЗрдВ next.js рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХреА рд╡рд┐рд╢рд┐рд╖реНрдЯрддрд╛рдПрдБ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред

@jaredpalmer рдореБрдЭреЗ рдЖрдкрдХрд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдкрд╕рдВрдж рд╣реИ, рдореИрдВрдиреЗ рдЖрдкрдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдХреБрдЫ рд╣рд┐рд╕реНрд╕реЛрдВ рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдИ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдХреНрдпрд╛ getUser рд╡рд┐рдзрд┐ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИ? рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдХреЛрдИ рд╕реНрдерд╛рдиреАрдп рд╕реНрдЯреЛрд░реЗрдЬ рдХреЗ рднреАрддрд░ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рд╣рд╛рде рд╕реЗ рдмрджрд▓рддрд╛ рд╣реИ, рддреЛ рдХреНрдпрд╛ рдпрд╣ рдЗрд╕ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡реЗрджрди рдХреЗ рд▓рд┐рдП рд╕реНрдорд╛рд░реНрдЯ рд╣реЛрдЧрд╛? рдХреНрдпрд╛ рдЗрд╕реЗ рдЙрд╕ рд╡рд┐рдзрд┐ рдореЗрдВ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рдЕрдзрд┐рдХ рд╕рдордЭрджрд╛рд░реА рд╣реЛрдЧреА рдЬреЛ рд╣рд░ рдмрд╛рд░ рдЯреЛрдХрди рдХреЗ рдЬреЗрдбрдмреНрд▓реНрдпреВрдЯреА рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╣рд┐рд╕реНрд╕реЗ рдХреЛ рдбреАрдХреЛрдб рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╡рд╣рд╛рдВ рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реНрдерд┐рддрд┐ рдкрдврд╝рддрд╛ рд╣реИ? рдЗрд╕ рддрд░рд╣ рд╣рдо рдЪреАрдЬреЛрдВ рдХреА рдЬреЗрдбрдмреНрд▓реНрдпреВрдЯреА рдкреНрд░рдХреГрддрд┐ рдХреЗ рдХрд╛рд░рдг рдЗрд╕ рд░рд╛рдЬреНрдп рдкрд░ рдЕрдзрд┐рдХ рднрд░реЛрд╕рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдкрдХреА рдХреНрдпрд╛ рд░рд╛рдп рд╣реИ?

рдЖрдкрдХреЛ рдЗрд╕реЗ рдХреБрдХреА рдореЗрдВ рд╕реНрдЯреЛрд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдореИрдВрдиреЗ рд▓рд┐рдЦрд╛ рд╣реИ рдХрд┐ рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдиреЗрдХреНрд╕реНрдЯ рдХреЗ рдкрд╛рд╕ рдХрд╕реНрдЯрдо рд╕рд░реНрд╡рд░ рдХреЗ рд▓рд┐рдП рд╕рдкреЛрд░реНрдЯ рдерд╛ред

@jaredpalmer рдХреНрдпрд╛ рдЖрдк рдореБрдЭреЗ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдФрд░ рдмрддрд╛ рд╕рдХрддреЗ рд╣реИрдВ? рдХреНрдпрд╛ рд╣рдореЗрдВ рд╕реНрдерд╛рдиреАрдп рднрдВрдбрд╛рд░рдг рдХреЗ рдмрдЬрд╛рдп рдХреБрдХреАрдЬрд╝ рдореЗрдВ рд╕рдм рдХреБрдЫ рд╕реНрдЯреЛрд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП? рдХреНрдпрд╛ рдЖрдкрдХрд╛ рдПрдЪрдУрд╕реА рднреА рдЕрд▓рдЧ рд╣реЛрдЧрд╛? рдХреНрдпрд╛ рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдЕрдм рд╣рдо рд╕рд░реНрд╡рд░ рд╕рд╛рдЗрдб рд░реЗрдВрдбрд░рд┐рдВрдЧ рдкреНрд░реЛрдЯреЗрдХреНрдЯреЗрдб рд╡реЗрдмрд╕рд╛рдЗрдЯреЛрдВ рдХреЗ рд▓рд┐рдП getInitialProps рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

рдмрд╕ рдзреНрдпрд╛рди рджреЗрдВ _рдЕрдЧрд░ рдЖрдк рдЬреЛ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХреА рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рд╡рд╣ рд╕реНрдерд╛рдиреАрдп рд╕реНрдЯреЛрд░реЗрдЬ/рд╡реЗрдм рд╕реНрдЯреЛрд░реЗрдЬ рдореЗрдВ рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдбреЗрдЯрд╛ рд╣реИ_:

"рд╡реЗрдм рд╕реНрдЯреЛрд░реЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдбреЗрдЯрд╛ рдХреЛ рдХрднреА рднреА рд╕реНрдЯреЛрд░ рди рдХрд░реЗрдВ: рд╡реЗрдм рд╕реНрдЯреЛрд░реЗрдЬ рд╕реБрд░рдХреНрд╖рд┐рдд рд╕реНрдЯреЛрд░реЗрдЬ рдирд╣реАрдВ рд╣реИред рдпрд╣ рдХреБрдХреАрдЬрд╝ рд╕реЗ "рдЕрдзрд┐рдХ рд╕реБрд░рдХреНрд╖рд┐рдд" рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рддрд╛рд░ рдкрд░ рдкреНрд░рд╕рд╛рд░рд┐рдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рдПрдиреНрдХреНрд░рд┐рдкреНрдЯреЗрдб рдирд╣реАрдВ рд╣реИред рдХреЛрдИ рд╕реБрд░рдХреНрд╖рд┐рдд рдпрд╛ HTTP рдХреЗрд╡рд▓ рдзреНрд╡рдЬ рдирд╣реАрдВ рд╣реИ рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╕рддреНрд░ рдпрд╛ рдЕрдиреНрдп рд╕реБрд░рдХреНрд╖рд╛ рдЯреЛрдХрди рд░рдЦрдиреЗ рдХрд╛ рд╕реНрдерд╛рди рдирд╣реАрдВ рд╣реИред"

рд▓реЙрдЧрд┐рди рдХреЗ рдмрд╛рдж рдХреБрдХреА рдореЗрдВ рдЯреЛрдХрди рд╕реЗрдЯ рдХрд░реЗрдВред рдХреБрдХреА-рдЬреЗрдПрд╕ рдХрд╛ рдкреНрд░рдпреЛрдЧ рдХрд░реЗрдВред рдлрд┐рд░ рд╕рд░реНрд╡рд░ рдкрд░ рдПрдХреНрд╕рдкреНрд░реЗрд╕ рдХреБрдХреА рдкрд╛рд░реНрд╕рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рддрд╛рдХрд┐ рдЖрдк req.headers.cookies.myToken рдпрд╛ рд╕рдордХрдХреНрд╖ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХреЗрдВред рдПрдХ рд╣реЙрдХ рдХреЗ getInitialProps рдореЗрдВ рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдХреНрдпрд╛ req рдореМрдЬреВрдж рд╣реИ, рдлрд┐рд░ req.cookies рд╕реЗ рдЯреЛрдХрди рд▓реЗрдВ, рдЕрдиреНрдпрдерд╛ рдЗрд╕реЗ рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд░ рдХреБрдХреАрдЬ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ ('mytoken')ред рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреНрд▓рд╛рдЗрдВрдЯ рдФрд░ рд╕рд░реНрд╡рд░ рдкрд░ рдЕрдкрдиреЗ рдЯреЛрдХрди рддрдХ рдкрд╣реБрдВрдЪ рд╣реЛрдЧреАред рдлрд┐рд░ рдЖрдк рдПрдХ рднреНрд░реВрдг/рдЕрдХреНрд╖реАрдп рдЖрд╡рд░рдг/рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ getInitialProps рдореЗрдВ рдЕрдЧрд▓реЗ рдХреЗ ctx рдХреЗ рд╕рд╛рде рдорд░реНрдЬ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдЖрдкрдХреЗ рд╕рднреА рдкреГрд╖реНрдареЛрдВ рдХреЗ рдкрд╛рд╕ рдкреНрд░рдорд╛рдгреАрдХреГрдд рдЖрдЗрд╕реЛрдореЛрд░реНрдлрд┐рдХ рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реЛред рдЖрдк рдЕрдкрдиреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рднреА рд╣реЙрдХ рдореЗрдВ рд▓рд╛рдирд╛ рдЪрд╛рд╣ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдЗрд╕реЗ рд╣рд░ рдЬрдЧрд╣ рджреЛрд╣рд░рд╛рдиреЗ рдХреА рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реИред рдпрджрд┐ рдЖрдкрдХреЛ рд╕рд╛рдорд╛рдиреНрдп рд╕рдВрд╕реНрдерд╛рдУрдВ рдЬреИрд╕реЗ рдХрд┐ withUser(withTeam(Page)) рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддреЛ рдЖрдк рдФрд░ рдЕрдзрд┐рдХ рд╣реЙрдХреНрд╕ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ

getUser рдПрдХ рдмреБрд░рд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ, рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рдЯреЛрдХрди рд╕реНрдЯреЛрд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

@jaredpalmer рдореИрдВрдиреЗ рд▓рдЧрднрдЧ рдЙрд╕реА рддрд░рд╣ рдПрдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдмрдирд╛рдпрд╛ рдФрд░ рд╕рдм рдХреБрдЫ рдареАрдХ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИред рдЬрд┐рд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдореИрдВ рдЕрднреА рд╣рд▓ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рд╡рд╣ рд╣реИ рдЯреЛрдХрди рдХреЛ рд░реАрдлреНрд░реЗрд╢ рдХреИрд╕реЗ рдХрд░реЗрдВред рдореИрдВ рдЬрд┐рд╕ рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рд╡рд╣ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдЕрд▓реНрдкрдХрд╛рд▓рд┐рдХ рдЯреЛрдХрди (2 рдШрдВрдЯреЗ) рд╣реИ рдФрд░ рдореИрдВ рдРрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд▓реЙрдЧ рдЗрди рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдЖрд╕рдкрд╛рд╕ рдЕрдкрдирд╛ рд╕рд┐рд░ рд▓рд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред
рдХреНрдпрд╛ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЙрд╕ рдкрд░ рдХреЛрдИ рдЗрдирдкреБрдЯ рд╣реИ?

рдЖрдк рдЕрдкрдиреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП next.js рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдбреЗрдЯрд╛ рдкрд╛рд╕ рди рдХрд░рдХреЗ рднреА рдкреНрд░рддреНрдпреЗрдХ рдкреГрд╖реНрда рд╕рдВрдХреНрд░рдордг рдкрд░ рдПрдХ рдЕрдиреБрд░реЛрдз рд╕рд╣реЗрдЬ рд╕рдХрддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк рд╕рд░реНрд╡рд░.рдЬреЗрдПрд╕ рдореЗрдВ рдХреБрдХреА рд╕реЗ рдЯреЛрдХрди рдкрдврд╝реЗрдВрдЧреЗ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд▓рд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВрдЧреЗ рдФрд░ рдЙрд╕реЗ рдЕрдЧрд▓реЗ рдЕрдиреБрд░реЛрдз рд╣реИрдВрдбрд▓рд░ рдХреЛ рднреЗрдЬ рджреЗрдВрдЧреЗред рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ, рдЗрд╕реЗ рдкреНрд░реЙрдкреНрд╕ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ рдФрд░ рдЗрд╕реЗ JSON рдореЗрдВ window.USER рдХреА рддрд░рд╣ рд╕реНрдЯреЛрд░ рдХрд░реЗрдВред рдлрд┐рд░ рдЕрдкрдиреЗ рд╣реЙрдХ рдореЗрдВ, рдЖрдк рдЗрд╕реЗ рдХреНрд▓рд╛рдЗрдВрдЯ рд▓реИрдВрдб рдореЗрдВ рд╡рд┐рдВрдбреЛ рд╕реЗ рдкрдврд╝рддреЗ рд╣реИрдВред рдЕрдВрдд рдореЗрдВ, рдЖрдкрдХреЛ рдПрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд░ рдХреЗ рд╕рд╛рде axios рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ 403 рдХреЛрдб рдкреНрд░рд╛рдкреНрдд рд╣реЛрдиреЗ рдкрд░ рдЖрдкрдХреА рдХреБрдХреА рдХреЛ рддреБрд░рдВрдд рдорд┐рдЯрд╛ рджреЗрддрд╛ рд╣реИ рдФрд░ рдкреГрд╖реНрда рдХреЛ рдкреБрдирдГ рд▓реЛрдб рдХрд░рддрд╛ рд╣реИ

@pbrandone рджреЛрд╣рд░рд╛рд╡ рдХреЗ рдмрд╛рд╡рдЬреВрдж, рд╕рдмрд╕реЗ рд╕рд░рд▓ рдФрд░ рд╕рдмрд╕реЗ рдЕрдиреБрдорд╛рдирд┐рдд рд╕рдорд╛рдзрд╛рди рд╣реИ рдХрд┐ рдЖрдк рдЕрдкрдиреЗ рдЯреЛрдХрди рдХреЛ рд╣рд░ рдЕрдиреБрд░реЛрдз рдХреЗ рд╕рд╛рде рднреЗрдЬреЗрдВ, рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд╣реЗрдбрд░/рдмреЙрдбреА рдореЗрдВ рдПрдХ рдирдпрд╛-рддрд╛рдЬрд╝рд╛ рдЯреЛрдХрди рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред рдЖрдкрдХрд╛ рдЧреНрд░рд╛рд╣рдХ рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрд░реЛрдз/рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЪрдХреНрд░ рдкрд░ рдЕрдкрдиреЗ рдЬреНрдЮрд╛рдд рдореВрд▓реНрдп рдХреЛ рдЕрджреНрдпрддрди рдХрд░рддрд╛ рд╣реИ, рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ рдПрдХрд▓-рдЙрдкрдпреЛрдЧ рд╡рд╛рд▓реЗ рдЯреЛрдХрди рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдХрднреА рдкреБрд░рд╛рдиреЗ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ рдФрд░ рдЬрд┐рдирдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдЖрдо рддреМрд░ рдкрд░, рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде, /token/refresh рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЗрд╡рд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдкреНрд░рд╛рд░рдВрднрд┐рдХ "рд╡реЗрдХ рдЕрдк" рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рд╕реЛрдЪреЗрдВ componentWillMount рд╣реБрдХ <App/> ), рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рдВрдЪ рдХрд░ рд░рд╣рд╛ рд╣реИ рдХрд┐ рдЕрдВрддрд┐рдо рд╕рд╣реЗрдЬрд╛ рдЧрдпрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ рдЯреЛрдХрди рдЕрднреА рднреА рдорд╛рдиреНрдп рдФрд░ рдкреНрд░рдпреЛрдЧ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИред

рд░реАрдлреНрд░реЗрд╢ рдЯреЛрдХрди рд╕реЗ рдХрднреА рднреА рдирд┐рдкрдЯрдирд╛ рдирд╣реАрдВ рдерд╛, рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕реЗ рдПрдХ рдЕрдХреНрд╖реАрдп рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд░ рдореЗрдВ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реВрдВред рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдФрд░ рд╕реЛрдЪрдирд╛ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ рдЖрдк рдПрдХ рдЦрд░рд╛рдм рд░рд┐рдХ рдХреЛ рд░реЛрдХреЗрдВрдЧреЗ, рдлрд┐рд░ рдирдпрд╛ рдЯреЛрдХрди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░реАрдлреНрд░реЗрд╢ рдЯреЛрдХрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдХреБрдХреА рдХреЛ рдирдП рдЯреЛрдХрди рдХреЗ рд╕рд╛рде рд╕реЗрдЯ рдХрд░реЗрдВ, рдФрд░ рдирдП рдЯреЛрдХрди рдХреЗ рд╕рд╛рде рдкрд╣рд▓реЗ рдЕрдиреБрд░реЛрдз рдХреЛ рджреЛрдмрд╛рд░рд╛ рджреЛрд╣рд░рд╛рдПрдВред Axios рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдЖрдкрдХреЛ рдЗрд╕ рддрд░рд╣ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдЕрдкрдиреЗ рдЙрддреНрдкрд╛рдж рдХреЛрдб рд╕реЗ рдЕрдореВрд░реНрдд рдФрд░ рджреГрд╖реНрдЯрд┐ рд╕реЗ рдмрд╛рд╣рд░ рд░рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред рдЖрдкрдХреЛ рдПрдХ рдЕрдиреБрд░реЛрдз рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд░ рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ рдФрд░/рдпрд╛ рдкреНрд░рдЧрддрд┐ рд╡рд╕реНрддреБ/рдорд╛рдирдЪрд┐рддреНрд░ рдореЗрдВ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╕реНрдЯреЗрдЯрдлреБрд▓ рдкрдХрдбрд╝ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдмрд╛рд▓реЛрдВ рд╡рд╛рд▓реА рд╣реЛ рд╕рдХрддреА рд╣реИред рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рдорджрдж рдХрд░рддрд╛ рд╣реИ

рдпрд╛ рд╡рд╣реА рдХрд░реЛ рдЬреЛ рд▓реВрдХрд╛ рдиреЗ рдХрд╣рд╛ рдерд╛ред рдмрд╣реБрдд рдЖрд╕рд╛рдиред

рдпрджрд┐ рдЖрдк рдЯреЛрдХрди рд░реАрдлреНрд░реЗрд╢ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдХрд╕реНрдЯрдо рд╕рд░реНрд╡рд░ рд╕реЗрдЯрдЕрдк рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХреБрдХреА (рдпрджрд┐ рдЖрдк рдХреБрдХреАрдЬрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ) рдХреЛ рд░реЛрдХрдирд╛ рд╣реЛрдЧрд╛ред рдореИрдВрдиреЗ рдПрдХреНрд╕рдкреНрд░реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдРрд╕рд╛ рдХрд┐рдпрд╛ред рдЕрдиреНрдпрдерд╛ рдЖрдк рдЬреЗрдбрдмреНрд▓реНрдпреВрдЯреА рдЯреЛрдХрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕реЗ рд╕рднреА рдХреНрд▓рд╛рдЗрдВрдЯ рд╕рд╛рдЗрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЪреВрдВрдХрд┐ рдореИрдВ рдХреБрдХреАрдЬрд╝ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдкрдирд╛ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рдерд╛, рдореЗрд░реЗ рдкрд╛рд╕ 2 рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдереЗ - рдХреНрд▓рд╛рдЗрдВрдЯ рд╕рд╛рдЗрдб рдкрд░ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдирд╛, рдФрд░ рд╕рд░реНрд╡рд░-рд╕рд╛рдЗрдб рдкрд░ рдкреЗрдЬ рдЕрдиреБрд░реЛрдз (рдХрднреА рднреА рдХреЛрдИ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдпреВрдЖрд░рдПрд▓ рдореЗрдВ рдЯрд╛рдЗрдк рдХрд░рддрд╛ рд╣реИ рдпрд╛ рдкреЗрдЬ рд░реАрдлреНрд░реЗрд╢ рд╣рд┐рдЯ рдХрд░рддрд╛ рд╣реИред) рд▓реЗрдХрд┐рди рдореВрд▓ рд░реВрдк рд╕реЗ рд╡реЗ рдПрдХ рд╣реА рдкреНрд░рд╡рд╛рд╣ рд╣реИрдВ рдПрдХ рдХреНрд▓рд╛рдЗрдВрдЯ-рд╕рд╛рдЗрдб рд╣реИ рдФрд░ рдПрдХ рд╕рд░реНрд╡рд░-рд╕рд╛рдЗрдб рд╣реИ, рдмрд╕ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╕рд░реНрд╡рд░-рд╕рд╛рдЗрдб рдкрд░ рдЬрдм рд╕реЗ рдореИрдВрдиреЗ рдПрдХреНрд╕рдкреНрд░реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ, рдореИрдВрдиреЗ рдХреБрдХреА рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ, рдЙрд╕рдХреЗ рдЕрдВрджрд░ рдЬреЗрдбрдмреНрд▓реНрдпреВрдЯреА рдХреЛ рдбреАрдХреЛрдб рдХрд░рдиреЗ рдФрд░ рд╕рдорд╛рдкреНрддрд┐ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрднреА рдПрдХ рдорд┐рдбрд▓рд╡реЗрдпрд░ рдмрдирд╛рдпрд╛ рд╣реИред рдпрджрд┐ рдпрд╣ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдпрд╛ рдерд╛, рддреЛ рдирдпрд╛ рдЯреЛрдХрди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░реЗрдВ рдФрд░ рдбрд┐рдХреЛрдб рдХрд┐рдП рдЧрдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд░ рд░рд┐рдбрдХреНрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╛рд╕ рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦреЗрдВред рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд░ рдореЗрд░реЗ рдкрд╛рд╕ рд╕реБрд░рдХреНрд╖рд┐рдд рд▓рд┐рдВрдХ рдХреЗ рд▓рд┐рдП рдПрдХ рдПрдЪрдУрд╕реА рд░реИрдкрд░ рд╣реИ рдЬреЛ рд▓рдЧрд╛рддрд╛рд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рдЬрд╛рдВрдЪ рдХрд░ рд░рд╣рд╛ рд╣реИ, рд╣рд░ рдмрд╛рд░ рдЬрдм рдЖрдк рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд░ рдХрд╣реАрдВ рднреА рдиреЗрд╡рд┐рдЧреЗрдЯ рдХрд░рддреЗ рд╣реИрдВред рдПрдЪрдУрд╕реА рдЖрдкрдХреА рдХреБрдХреА рдпрд╛ рдЬреЗрдбрдмреНрд▓реНрдпреВрдЯреА рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдЧрд╛, (рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдореЗрд░рд╛ рдЬреЗрдбрдмреНрд▓реНрдпреВрдЯреА рдПрдХ рдХреБрдХреА рдореЗрдВ рд╣реИ) рдФрд░ рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдпрд╣ рдЕрднреА рднреА рдЬрд▓реНрджреА рд╕реЗ рд╡реИрдз рд╣реИ рдпрд╛ рдирд╣реАрдВред рдпрджрд┐ рдпрд╣ рдорд╛рдиреНрдп рдирд╣реАрдВ рд╣реИ, рддреЛ рдпрд╣ рдПрдХ рддрд╛рдЬрд╝рд╛ JWT/рдХреБрдХреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдЧрд╛, рдФрд░ рдЬрд╛рд░реА рд░рдЦреЗрдЧрд╛, рдЕрдиреНрдпрдерд╛ рдпрд╣ рдЖрдкрдХреЛ рд▓реЙрдЧ рдЖрдЙрдЯ рдХрд░ рджреЗрдЧрд╛ред рд╣рд╛рдБ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓, рд▓реЗрдХрд┐рди рдЕрдзрд┐рдХ рд╕реБрд░рдХреНрд╖рд┐рдд рднреАред рдЙрдореНрдореАрдж рд╣реИ рдХреА рд╡реЛ рдорджрдж рдХрд░рджреЗ! рдпрджрд┐ рдЖрдк рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ рддреЛ рдмреЗрдЭрд┐рдЭрдХ рдкреНрд░рд╢реНрди рдкреВрдЫреЗрдВ - рдпрд╣ рд╕рдм рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдореЗрдВ рдореБрдЭреЗ рдХреБрдЫ рд╕рдордп рд▓рдЧрд╛ред рдореИрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдЬреАрдердм рдпрд╛ рдПрдлрдмреА рдЖрджрд┐ рдХреЗ рд╕рд╛рде рд▓реЙрдЧрдЧрд┐рди рд▓реЛрдЧреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрддрд╛ рд╣реВрдВ - рд╢рд╛рдпрдж рдмрд╣реБрдд рд╕рд╛рд░реЗ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдареАрдХ рд╣реИ рд▓реЗрдХрд┐рди рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдпрд╣ рд╕рд┐рд░реНрдл рдкреЗрд╢реЗрд╡рд░ рдирд╣реАрдВ рд╣реИред рдореБрдЭреЗ рдЕрднреА рддрдХ рдХреЛрдИ рдмреИрдВрдХ, рд╕реНрд╡рд╛рд╕реНрдереНрдп рд╕реЗрд╡рд╛, рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рднреБрдЧрддрд╛рди рдХрд┐рдП рдЧрдП рдХрд┐рд╕реА рднреА рдмрд┐рд▓ рдЖрджрд┐ рдХреЛ рджреЗрдЦрдирд╛ рд╣реИ - рдореБрдЭреЗ рдЕрдкрдиреЗ рдПрдлрдмреА рдЦрд╛рддреЗ рд╕реЗ рд▓реЙрдЧ рдЗрди рдХрд░реЗрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдмрд╕ рд╕рдордп рдХреА рдмрд╛рдд рд╣реЛ рд╕рдХрддреА рд╣реИ;)

рдкрд╣реБрдВрдЪ рдЯреЛрдХрди рдХреЛ рддрд╛рдЬрд╝рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП;
рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдХрд░рдиреЗ рдХрд╛ рдпрд╣ рдПрдХ рдЙрдЪрд┐рдд рддрд░реАрдХрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореЗрд░реА рдкрд╣реБрдВрдЪ рдЯреЛрдХрди рдмрд╣реБрдд рд╣реА рдЕрд▓реНрдкрдХрд╛рд▓рд┐рдХ (рдПрдХ рдорд┐рдирдЯ рдпрд╛ рдЙрд╕рд╕реЗ рднреА рдЕрдзрд┐рдХ) рд╣реИрдВред рдХреНрд▓рд╛рдЗрдВрдЯ-рд╕рд╛рдЗрдб рдЯреЛрдХрди рд╕рдорд╛рдкреНрддрд┐ рд╕рдорд╕реНрдпрд╛рдУрдВ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдВрдиреЗ рдпрд╣ рддрд░реАрдХрд╛ рдЕрдкрдирд╛рдпрд╛ рд╣реИ;
рд╣рд░ рдмрд╛рд░ рдЬрдм рдХреЛрдИ рдкреГрд╖реНрда рд▓реЛрдб рд╣реЛрддрд╛ рд╣реИ рддреЛ рдпрд╣ рдЬрд╛рдВрдЪрддрд╛ рд╣реИ рдХрд┐ рдЯреЛрдХрди рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдпрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ, рдпрджрд┐ рдРрд╕рд╛ рд╣реИ, рддреЛ рдпрд╣ рдЗрд╕реЗ рд░реАрдлреНрд░реЗрд╢ рдХрд░рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЕрдЧрд░ рдпрд╣ рдЕрднреА рднреА рдорд╛рдиреНрдп рд╣реИ рддреЛ рдпрд╣ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЬрд╛рдВрдЪрддрд╛ рд╣реИ рдХрд┐ рд╕рдорд╛рдкреНрддрд┐ рддрдХ рдХрд┐рддрдирд╛ рд╕рдордп рд╣реИ, рдФрд░ рдЯрд╛рдЗрдордЖрдЙрдЯ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рд╕рдорд╛рдкреНрддрд┐ рдкрд░ рдкрд╣реБрдВрдЪ рдЯреЛрдХрди рд░реАрдлреНрд░реЗрд╢ рдХрд░реЗрдЧрд╛ред рдФрд░ рдлрд┐рд░ рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рддрдм рддрдХ рджреЛрд╣рд░рд╛рддрд╛ рд╣реИ рдЬрдм рддрдХ рдЖрдЧрдВрддреБрдХ рд╕рд╛рдЗрдЯ рдкрд░ рд╣реИред

callRefreshAuthenticationLater(){
    clearTimeout(this.accessTokenRefreshmentTimeout)
    this.accessTokenRefreshmentTimeout = setTimeout(() => {
      this.refreshAuthentication()
    }, this.authService.howMuchUntilExpiration(this.authService.getToken('access_token')))
  }

рдпрд╣ рд╕рдорд╛рдкреНрддрд┐ рддрдХ рдорд┐рд▓реАрд╕реЗрдХрдВрдб рд▓реМрдЯрд╛рддрд╛ рд╣реИ:

howMuchUntilExpiration(token){
    return normalizeTimestamp(jwtDecode(token).exp) - Date.now()
  }

рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рднреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛

@ рдХреБрдиреЛрдХрджреЗрд╡ - рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдЕрдЪреНрдЫреА рд╢реБрд░реБрдЖрдд рд╣реИред рдореИрдВрдиреЗ рдПрдХ рд╕рдорд╛рди func рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рджрд┐рдпрд╛, рдореБрдЭреЗ рд╢реЗрд╖ рд╕рдордп рдХреА рдЧрдгрдирд╛ рдПрдХ func рдкрд░ рдХрд░рдиреА рдкрдбрд╝реА рдЬреЛ рдХрд┐ рдпрд╣ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдпрд╛ рдерд╛ рдпрд╛ рдирд╣реАрдВ, рдЗрд╕ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдмреВрд▓рд┐рдпрди рд▓реМрдЯрд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рд╕реЗ рдореЗрд░рд╛ рдХреЛрдб рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рдкрдардиреАрдп рдФрд░ рд╕рд░рд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдореБрдЭреЗ рдЯрд╛рдЗрдорд░ рд░реАрд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред рдлрд┐рд░ рдореИрдВ рд╕рд┐рд░реНрдл рдпрд╣ рдЬрд╛рдВрдЪрддрд╛ рд╣реВрдВ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рд╕рдордп рд╕реАрдорд╛ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдИ рд╣реИ рдпрд╛ рдирд╣реАрдВ, рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрдиреБрд░реЛрдз рдкрд░ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЕрдЧрд░ рдореЗрд░реЗ рдкрд╛рд╕ рдЙрд▓рдЯреА рдЧрд┐рдирддреА рдЯрд╛рдЗрдорд░ рдпрд╛ рдРрд╕рд╛ рдХреБрдЫ рд╣реИ рдЬреЛ рдХреНрд▓рд╛рдЗрдВрдЯ рдпрд╛ рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рджреГрд╢реНрдпрдорд╛рди рдерд╛ рддреЛ рдЖрдкрдХрд╛ рдХрд╛рд░реНрдп рдЖрджрд░реНрд╢ рд╣реЛрдЧрд╛ред рд╡рд╣ рдореЗрд░реЗ 2 рд╕реЗрдВрдЯ

рдХреНрдпрд╛ рд▓реЗрдЦ/рд▓реЙрдЧрд┐рди рдЙрджрд╛рд╣рд░рдг рд╕рдмрд╕реЗ рдмреБрдирд┐рдпрд╛рджреА рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП? рдпрд╛рдиреА рдореЗрдореЛрд░реА рд╕реНрдЯреЛрд░ рдФрд░ рдХреЛрдИ рдЬреЗрдбрдмреНрд▓реНрдпреВрдЯреА рдпрд╛ рдЕрдЬреАрдм рдЯреЛрдХрди рдЪреАрдЬреЗрдВ рдирд╣реАрдВред рдЖрдо рддреМрд░ рдкрд░ рдЬрдм рдЖрдк рдХрд┐рд╕реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрддреЗ рд╣реИрдВ "рд▓реЙрдЧ рдЗрди" рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЙрдирдХреЗ рдкрд╛рд╕ рдХреБрдХреА/рд╕рдХреНрд░рд┐рдп рд╕рддреНрд░ рд╣реИред

рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рд▓реЙрдЧрд┐рди рдПрдЪрдУрд╕реА рд╡рд░реНрдХрд┐рдВрдЧ рдХреНрд▓рд╛рдЗрдВрдЯ рдФрд░ рд╕рд░реНрд╡рд░ рд╕рд╛рдЗрдб рд╣реИред рдпрд╣ рдПрдХ рдЬреЗрдбрдмреНрд▓реНрдпреВрдЯреА рдФрд░ рдмреИрдХрдПрдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ (рдиреЛрдб, рдбреАрдЬреЗрдВрдЧреЛ, рдЬреЛ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ)ред

рдЗрд╕реЗ рджреЗрдЦреЗрдВ рдФрд░ рдХрд┐рд╕реА рднреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреА рдЕрддреНрдпрдзрд┐рдХ рд╕рд░рд╛рд╣рдирд╛ рдХреА рдЬрд╛рддреА рд╣реИ

https://github.com/hugotox/AppStarter

рдпрд╣рд╛рдВ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдХреЛрдб https://github.com/hugotox/AppStarter/blob/master/src/components/auth/login-required.js

@hugotox рдореБрдЭреЗ store.dispatch рд╕реЗ getInitialProps рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдХрдИ рдмрд╛рд░ рдЕрд╡рд╛рдВрдЫрд┐рдд рд╕рд╛рдЗрдб рдЗрдлреЗрдХреНрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд░рд╣реЗрдВ, рдЬрдм рд╕рдЬрд╛рдП рдЧрдП рдШрдЯрдХ рдХреЛ рдСрде рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдмрд╛рд╡рдЬреВрдж рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЕрднреА рд╕рдорд╛рдкреНрдд рдирд╣реАрдВ рд╣реБрдЖ рд╣реИред рдЖрдЗрдП рдЕрдкрдиреЗ рдХреЛрдб рд╕реЗ рдЙрдкрдпреЛрдЧ рдЙрджрд╛рд╣рд░рдг рд▓реЗрдВ:

export default withRedux(initStore, mapStateToProps)(
   loginRequired([PUBLIC])(MyPage)
)

getInitialProps рдЖрдк verifyToken рд╕реЗ рдкрд╣рд▓реЗ verificationOk рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП MyPage.mapStateToProps рдХреЛ 2 рдмрд╛рд░ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ (рдпрджрд┐ рдпрд╣ store.auth.user рдХреЗ рд▓рд┐рдП рд╕реБрдирддрд╛ рд╣реИ) рдФрд░ рдкрд╣рд▓реА рдмрд╛рд░ store.auth.user рдЙрд╕ рдкреГрд╖реНрда рдХреЗ рд▓рд┐рдП рднреА рд╢реВрдиреНрдп рд╣реЛрдЧрд╛ рдЬрд┐рд╕рдореЗрдВ рд▓реЙрдЧ рдЗрди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

рдХрд▓ рдореИрдВрдиреЗ рдЕрдкрдиреЗ Next.js рд╕рдВрдЪрд╛рд▓рд┐рдд рд╕реНрдЯрд╛рд░реНрдЯрд░ рдХрд┐рдЯ рдХрд╛ рдкрд╣рд▓рд╛ WIP рд╕рдВрд╕реНрдХрд░рдг рднреА рдЬрд╛рд░реА рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ Docker, Flow рдФрд░ Fast-redux рдХреЗ рд╕рд╛рде рд╢реБрд░реБрдЖрдд рдХреА: https://github.com/dogada/microchain

рдореИрдВ рдПрдкреАрдЖрдИ рд╕рд░реНрд╡рд░ рдФрд░ рд╡реЗрдмрдПрдк рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдкрд┐рдд рдбреЙрдХрд░ рдЫрд╡рд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ рдЬреЛ рд╡рд┐рднрд┐рдиреНрди рдбреЛрдореЗрди рдкрд░ рдЪрд▓ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЕрднреА рднреА рдПрдХ рдХрд╛рдордХрд╛рдЬреА рд╕рдорд╛рдзрд╛рди рдХреА рддрд▓рд╛рд╢ рдореЗрдВ рд╣реВрдВ рдЬреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рд▓реЙрдЧрд┐рди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ рд▓реЗрдХрд┐рди рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдореЛрдмрд╛рдЗрд▓ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рд▓рд┐рдП рдУрдПрде рдмрд┐рдпрд░рд░ рдЯреЛрдХрди рднреА рдЬрд╛рд░реА рдХрд░реЗрдЧрд╛ред

@spencersmb рдЙрддреНрдХреГрд╖реНрдЯ рдЪреАрдпрд░реНрд╕! рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рд╡реИрд╕рд╛ рд╣реА рд╣реИ рдЬреИрд╕рд╛ рдореИрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛ рд░рд╣рд╛ рдерд╛ред рдкрд╣рд▓реА рдмрд╛рд░ рдХрд┐рд╕реА рдпреВрдЖрд░рдПрд▓ рдХреЗ рд▓рд┐рдП рд╕рд░реНрд╡рд░ рд╕рд╛рдЗрдб рд░реЗрдВрдбрд░рд┐рдВрдЧ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ (рдХрднреА рд▓реЙрдЧ рдЗрди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛), рдХреНрдпрд╛ рдЖрдк рдЗрд╕реЗ рдХреЗрд╡рд▓ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рдХреЛрдИ рдХреБрдХреА рдирд╣реАрдВ рд╣реИ рдФрд░ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдкреЗрдЬ/рд▓реЙрдЧрд┐рди.рдЬреЗрдПрд╕ рдЯрд╛рдЗрдк рдкреЗрдЬ рдкрд░ рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ рдХрд░ рд░рд╣рд╛ рд╣реИ?

@ James-ff рдЗрд╕реЗ рдкреЛрд╕реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рднрд▓реЗ рд╣реА рдпрд╣ рд╢реВрдиреНрдп рдореЗрдВ рдЪрд┐рд▓реНрд▓рд╛рдиреЗ рдЬреИрд╕рд╛ рд▓рдЧрддрд╛ рд╣реЛред

рдпрд╣ рдЗрд╕ рдзрд╛рдЧреЗ рдореЗрдВ рдХреБрдЫ рдмрд╛рд░ рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ рд▓реЗрдХрд┐рди рд╣рд░ рдХреЛрдИ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЕрднреА рднреА рдЕрдирджреЗрдЦрд╛ рдХрд░ рд░рд╣рд╛ рд╣реИ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рд╕реНрдерд╛рдиреАрдп рд╕реНрдЯреЛрд░реЗрдЬ рдпрд╛ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реБрд▓рдн рдХреБрдХреАрдЬрд╝ рдХреЗ рд╕рд╛рде рдЬреЗрдбрдмреНрд▓реНрдпреВрдЯреА рдореЗрдВ рд╕рддреНрд░ рдЯреЛрдХрди рд╕рдВрдЧреНрд░рд╣реАрдд рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдХрдо рд╕реБрд░рдХреНрд╖рд┐рдд рддрд░реАрдХреЗ рд╕реЗ рд╕рддреНрд░реЛрдВ рдФрд░ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХреЛ рдлрд┐рд░ рд╕реЗ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ рдХрд╛ рдЗрд░рд╛рджрд╛ рд╣реИред (рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреНрд▓рд╛рдЗрдВрдЯ рд╕рд╛рдЗрдб рдЬреЗрдПрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ)ред тАНтЩВя╕П

рдЗрд╕ рдкреЛрд╕реНрдЯ рдХреЗ рд▓реЗрдЦрдХ рдХрд┐ рдЪреАрдЬреЛрдВ рдореЗрдВ рд╕реБрдзрд╛рд░ рдирд╣реАрдВ рд╣реБрдЖ рд╣реИ:

рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд▓реЛрдЧреЛрдВ рдиреЗ рдкрдврд╝рдирд╛ рдмрдВрдж рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдореБрдЭреЗ рд▓реЗрдЦ рдХреА рд▓рдВрдмрд╛рдИ рдкрд░ рдКрдкрд░реА рд╕реАрдорд╛ рдорд┐рд▓ рдЧрдИ рд╣реИ - рд░реЗрдбрд┐рдЯ рдФрд░ рд╣реИрдХрд░ рдиреНрдпреВрдЬ рдкрд░ рдХрдИ рдЯрд┐рдкреНрдкрдгреАрдХрд╛рд░реЛрдВ рдиреЗ рдмрд╛рд░-рдмрд╛рд░ рдПрдХ рд╣реА "рд╕рдорд╛рдзрд╛рди" рдХрд╛ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛, рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдирджреЗрдЦрд╛ рдХрд░ рджрд┐рдпрд╛ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдкрд╣рд▓реЗ рд╣реА рд╕рдВрдмреЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдЕрд╡реНрдпрд╡рд╣рд╛рд░рд┐рдХ рдкрд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ рд▓реЗрдЦ рдореЗрдВ рд╣реАред

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореВрд▓ рд▓реЗрдЦ рдФрд░ рдЕрдиреБрд╡рд░реНрддреА рдЖрд░реЗрдЦ рджреЛрдиреЛрдВ рд╣реА рдмрд╣реБрдд рдмрдврд╝рд┐рдпрд╛ рд╣реИрдВред

@iaincollins JWTs рдФрд░ рд╕рддреНрд░-рд░рд╣рд┐рдд рдРрдкреНрд╕/рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХреЗ рдЕрдкрдиреЗ рдлрд╛рдпрджреЗ рд╣реИрдВ рдФрд░ рдмрд╣реБрдд рд╕реЗ рд▓реЛрдЧ/рдХрдВрдкрдирд┐рдпрд╛рдВ (Google рд╕рд╣рд┐рдд) рдЕрднреА рднреА рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЬреЗрдбрдмреНрд▓реНрдпреВрдЯреА рдХреЗ рдЦрд┐рд▓рд╛рдл рдорд╛рдорд▓реЗ рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рдмрд╛рдж, рдореБрдЭреЗ рдЕрднреА рднреА рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рджреЛ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдЕрдЧрд▓реА-рд▓реЗрдЦрдХ рдЙрджрд╛рд╣рд░рдг/рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП, рдПрдХ рд╕рддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ (рдЬреИрд╕реЗ рдЕрдЧрд▓реА-рд▓реЗрдЦрдХ) рдФрд░ рдПрдХ рдЬреЗрдбрдмреНрд▓реНрдпреВрдЯреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛, рдпрд╛ рд╢рд╛рдпрдж рдХреЗрд╡рд▓ рдПрдХ рдЬреЛ рдпрд╛ рддреЛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЖрдзрд┐рдХрд╛рд░рд┐рдХ Next.js рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдкреЗрдЬ рдФрд░/рдпрд╛ рдореЙрдбреНрдпреВрд▓ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдкрд░ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд▓рд┐рдП рдлрд╛рдпрджреЗ, рдиреБрдХрд╕рд╛рди рдФрд░ рдЪреЗрддрд╛рд╡рдирд┐рдпреЛрдВ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕рдордЭрд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЬрдм рддрдХ рдХреЛрдИ рдмреЗрд╣рддрд░ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ/рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдирд╣реАрдВ рдХрд░рддрд╛, рдореИрдВ рд╢рд╛рдпрдж рдиреЗрдХреНрд╕реНрдЯрдЬ-рд╕реНрдЯрд╛рд░реНрдЯрд░ рдФрд░ рдиреЗрдХреНрд╕реНрдЯ-рдСрде рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦреВрдВрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреЗ рд╣реИрдВ рдЬреЛ рдореБрдЭреЗ рдорд┐рд▓реЗ рд╣реИрдВред

рдореИрдВ рдЗрд╕ рдкрд░ рдХреЗрд╡рд▓ рд▓рд╛рдкрд░рд╡рд╛рд╣реА рд╕реЗ рдирдЬрд░ рд░рдЦрддрд╛ рд░рд╣рд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдпреВрдирд┐рд╡рд░реНрд╕рд▓ рдЬреЗрдПрд╕ рдСрде рдХреЗ рд╕рд╛рде рдореЗрд░рд╛ рдЕрдиреБрднрд╡ рдПрдХ рдЬреЗрдбрдмреНрд▓реНрдпреВрдЯреА рдХреЛ HttpOnly рдХреБрдХреА рдореЗрдВ рд╕реНрдЯреЛрд░ рдХрд░рдирд╛ рд╣реИред рдЬрдм рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреБрдХреА рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдРрдк рдХреЗ рд╕рд░реНрд╡рд░-рд╕рд╛рдЗрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рдХрд▓реНрдк рд╣реЛрддрд╛ рд╣реИ, рддреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ localStorage рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдХрд╛рд░рдг рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдкрдХреЛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдХреНрд░реЙрд╕-рдУрд░рд┐рдЬрд┐рдирд▓ рдПрдкреАрдЖрдИ рдХреЙрд▓ рдХреЗ рд▓рд┐рдП рдЬреЗрдбрдмреНрд▓реНрдпреВрдЯреА рддрдХ рдкрд╣реБрдВрдЪ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЖрдк рдЬреЗрдбрдмреНрд▓реНрдпреВрдЯреА рдХреЛ __INITIAL_STATE__ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкрд░рд┐рджреГрд╢реНрдп рдореЗрдВ рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдПрдХреНрд╕рдПрд╕рдПрд╕ рдХрдордЬреЛрд░рд┐рдпреЛрдВ рд╕реЗ рдЕрд╡рдЧрдд рд░рд╣реЗрдВ, рд▓реЗрдХрд┐рди рдХрдо рд╕реЗ рдХрдо рдЖрдк "рд╕реНрдЯреЛрд░рд┐рдВрдЧ" рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдпрд╣ рдХреНрд▓рд╛рдЗрдВрдЯ-рд╕рд╛рдЗрдб)ред рд╕рдорд╛рди-рдореВрд▓ рдкрд╣реБрдВрдЪ рдХреЗ рд▓рд┐рдП, рдХреБрдХреА рдХреЛ рдЖрдЧреЗ рдФрд░ рдкреАрдЫреЗ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ (рдпрд╣ рдорд╛рдирддреЗ рд╣реБрдП рдХрд┐ рдЖрдк withCredentials рдХрд╛ рдЙрдкрдпреЛрдЧ axios рдХреЗ рд▓рд┐рдП рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдпрд╛ credentials: 'include' рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП), JWT рдХреЛ JS рдореЗрдВ рдбрд╛рд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рдирдХрд╛рд░рддреЗ рд╣реБрдП . рдЖрдк HttpOnly рдХреБрдХреА рдореЗрдВ рд╕реЗ JWT рдХреЛ рд╣рдерд┐рдпрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдРрдк рдХреЗ рд╕рд░реНрд╡рд░-рд╕рд╛рдЗрдб рдкрд░ рдПрдХ рдкреНрд░реЙрдХреНрд╕реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, _then_ рдЕрдкрдиреА рдХреНрд░реЙрд╕-рдУрд░рд┐рдЬрд┐рдирд▓ API рдХреЙрд▓ рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдк рдЙрд╕ рдкрд░рд┐рджреГрд╢реНрдп рдореЗрдВ рднреА рдкреНрд░реАрдлреНрд▓рд╛рдЗрдЯ рдХреЙрд▓ рдХреЛ рдирдХрд╛рд░рддреЗ рд╣реИрдВред рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд▓рд┐рдП, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рдРрдкреНрд╕ рдХреЗ рд▓рд┐рдП рд╕реНрдерд╛рдиреАрдп рд╕реНрдЯреЛрд░реЗрдЬ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

@bjunc рд╣рд╛рдВ, рд╕рднреА рд╡рд┐рдХрд▓реНрдкреЛрдВ рдореЗрдВ рд╕реЗ рдЬрд╣рд╛рдВ рдПрдХ рдЬреЗрдбрдмреНрд▓реНрдпреВрдЯреА рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП (

рдореИрдВрдиреЗ рдиреЗрдХреНрд╕реНрдЯрдЬ-рд╕реНрдЯрд╛рд░реНрдЯрд░ рдФрд░ рдиреЗрдХреНрд╕реНрдЯ-рдСрде рдХреЛ рдЕрдкрдирд╛рдирд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдХрдореЛрдмреЗрд╢ рд╡рд╣реА рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рдЬреЛ рдЖрдкрдиреЗ рдореЗрд░реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдХрд╣рд╛ рдерд╛ред рдпрд╣ рдПрдХ рд╕рдордп рд╣реЛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдореБрдЭреЗ рд╕рд╣реА рд╕реЗ рдпрд╛рдж рд╣реИ рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдЬрд┐рд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛ рд╡рд╣ рдпрд╣ рдерд╛ рдХрд┐ рдореЗрд░рд╛ рдПрдХреНрд╕рдкреНрд░реЗрд╕ рдПрдкреАрдЖрдИ рд╕рд░реНрд╡рд░ рдЬрд┐рд╕реЗ рдореИрдВ рдкреНрд░рдорд╛рдгрд┐рдд рдХрд░ рд░рд╣рд╛ рдерд╛ (рдЬреЛ рдПрдХреНрд╕рдкреНрд░реЗрд╕-рд╕рддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рдерд╛) рд╕рддреНрд░ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдкреНрд░рд╛рд░рдВрдн/рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рдерд╛ред рдореБрдЭреЗ рдЕрдЬреАрдм рд╡реНрдпрд╡рд╣рд╛рд░ рдорд┐рд▓реЗрдЧрд╛ рдЬрд╣рд╛рдВ рд╕рддреНрд░ рдХрдИ рдмрд╛рд░ рд╢реБрд░реВ рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗред рдЕрдЧрд░ рдореИрдВ рдЗрд╕реЗ рдареАрдХ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рддреЛ рдореИрдВрдиреЗ рдЬреЛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рд╣реИ рдЙрд╕реЗ рдХрдо рдпрд╛ рдЬреНрдпрд╛рджрд╛ рдХрд░рдирд╛ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдореИрдВ рдиреЗрдХреНрд╕реНрдЯрдЬ-рд╕реНрдЯрд╛рд░реНрдЯрд░ рдФрд░ рдиреЗрдХреНрд╕реНрдЯ-рдСрде рдХреЗ рд╕рд╛рде рднреА рдХрд╛рдо рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦреВрдВрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рд╕рддреНрд░ рдЬреЗрдбрдмреНрд▓реНрдпреВрдЯреА рдХреА рдХрдИ рдЕрдиреНрдп рдЪрд┐рдВрддрд╛рдУрдВ рдХреЛ рджреВрд░ рдХрд░рддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐ рдЯреЛрдХрди рдХреЛ рдХреИрд╕реЗ рдЕрдорд╛рдиреНрдп рдХрд░рдирд╛ рд╣реИред

рджреЛрдмрд╛рд░рд╛, рдПрдХ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдЙрджрд╛рд╣рд░рдг (рдпрд╛ рдЙрджрд╛рд╣рд░рдг) рд╕рд╣рд╛рдпрдХ рд╣реЛрдЧрд╛ред рдореБрдЦреНрдп рд╢рдмреНрдж: рдЖрдзрд┐рдХрд╛рд░рд┐рдХ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ Next.js рдХреЗ рд▓реЗрдЦрдХреЛрдВ рдиреЗ рд╕рднреА рд╕рдВрднрд╛рд╡рдирд╛рдУрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рд╕рд░реНрд╡реЛрддреНрддрдо рд╡рд┐рдЪрд╛рд░реЛрдВ рдФрд░ рдкреНрд░рдерд╛рдУрдВ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рд╣реИред рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ рдЖрдзреБрдирд┐рдХ ES6/ES7/ES8 рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдЬреИрд╕реЗ рд╡рд╛рджреЗ рдФрд░ async/рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред

@ kelleg1 рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рдореБрджреНрджреЗ рдХреБрдХреА рдирд┐рд░реНрдорд╛рдг рдХреА рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ ( HttpOnly , рдбреЛрдореЗрди, рдкрде, рд╕рдорд╛рдкреНрддрд┐, рдЖрджрд┐) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЧрд▓рддреА рд╕реЗ рдПрдХ рд╣реА рдирд╛рдо рдХреЗ рд╕рд╛рде рдХрдИ рдХреБрдХреАрдЬрд╝ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ; рдЬреЛ рдЕрдЬреАрдм рджреБрд╖реНрдкреНрд░рднрд╛рд╡ рдкреИрджрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬреИрд╕реЗ рдЖрдк рд╡рд░реНрдгрди рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдбрд┐рдмрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдпрд╣ рд╣реИ рдХрд┐ рджреЗрд╡ рдЯреВрд▓реНрд╕ рдПрдкреНрд▓рд┐рдХреЗрд╢рди-> рдХреБрдХреАрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПред рдпрджрд┐ рдЖрдк рдПрдХ рд╣реА рдирд╛рдо рд╕реЗ рдХреБрдХреАрдЬрд╝ рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдЖрдкрдХреЛ рд╕рд╣реА рджрд┐рд╢рд╛ рдореЗрдВ рдЗрдВрдЧрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рд╡реИрд╕реЗ рднреА, рдореИрдВ рдХреЛрд░ рдЯреАрдо рдореЗрдВ рдирд╣реАрдВ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВ "рдЖрдзрд┐рдХрд╛рд░рд┐рдХ" рдпреЛрдЧрджрд╛рди рдХреЗ рд╕рд╛рде рдорджрдж рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ (рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдореИрдВ Nuxt.js рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, Next.js рдХрд╛ рдирд╣реАрдВ), рд▓реЗрдХрд┐рди рд╕рд┐рджреНрдзрд╛рдВрдд рд╕рдорд╛рди рд╣реИрдВред рдореИрдВрдиреЗ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рдХреБрдЫ рдЕрд▓рдЧ рддрд░реАрдХреЛрдВ рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдХрд┐рдпрд╛ (рдЬреЗрдбрдмреНрд▓реНрдпреВрдЯреА, рдХреБрдХреАрдЬрд╝, рд╕реАрдПрд╕рдПрдлрдЖрд░, рд╡реЗрдмрд╕реЛрдХреЗрдЯ рд╕реАрдПрд╕рдбрдмреНрд▓реНрдпреВрдПрд╕рдПрдЪ, рд╕реНрдерд╛рдиреАрдп рд╕реНрдЯреЛрд░реЗрдЬ, рдЖрджрд┐ рдХреЗ рдкреЗрд╢реЗрд╡рд░реЛрдВ/рд╡рд┐рдкрдХреНрд╖реЛрдВ рдХрд╛ рд╡рдЬрди)ред рдореИрдВ рдЕрдВрддрддрдГ рдЗрд╕ рдирд┐рд╖реНрдХрд░реНрд╖ рдкрд░ рдкрд╣реБрдВрдЪрд╛ рдХрд┐ рдиреЗрдХреНрд╕реНрдЯ/рдирдХреНрд╕реНрдЯ рдХреА рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рдкреНрд░рдХреГрддрд┐ рдиреЗ рдЦреБрдж рдХреЛ HttpOnly JWT рдХреБрдХреАрдЬрд╝ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЙрдзрд╛рд░ рджрд┐рдпрд╛ред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЕрдиреНрдп рд▓реЛрдЧ рдПрдХ рдЕрд▓рдЧ рдирд┐рд╖реНрдХрд░реНрд╖ рдкрд░ рдЖрдПрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рд╢рд┐рд╡рд┐рд░ рдореЗрдВ рдирд╣реАрдВ рд╣реВрдВ "рд╣реЗ рднрдЧрд╡рд╛рди, рдЬреЗрдбрдмреНрд▓реНрдпреВрдЯреА рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░реЗрдВ, рдХреНрдпрд╛ рдЖрдкрдиреЗ рд╡рд╣ рд▓реЗрдЦ рдирд╣реАрдВ рдкрдврд╝рд╛ рдЬреЛ рдХрд╣рддрд╛ рд╣реИ рдХрд┐ рдЬреЗрдбрдмреНрд▓реНрдпреВрдЯреА рдЖрдкрдХреЛ рдХреИрдВрд╕рд░ рджреЗрддрд╛ рд╣реИ!"ред

@iaincollins рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рд╡рд╛рдкрд╕ рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЦреЗрдж рд╣реИ, рд▓реЗрдХрд┐рди рд╡реЗрдм рдкрд░ рд╣рд░ рдПрдХ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдЯреЛрдХрди рдХреЛ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП

рдХреБрдХреАрдЬрд╝! :рдбреА
рд╣рдо рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ:

// auth.js
async signIn(res, info) {
    const { email, password } = info;
    const result = await this.service.signIn(email, password);
    if (!result) {
      res.status(HttpStatus.BAD_REQUEST).json({ success: false, message: 'Wrong email and/or password' });
      return;
    }
  const payload = {
    scope: 'appUser',
    userId: user.email,
    language: user.language,
    iat: moment().unix(),
    exp: moment().add(7, 'days').unix(),
    type: user.type,
    status: user.status
  };
    const token = jwt.sign(payload, ...);

    res.cookie('token', token, { domain: 'yourdomain.com', path: '/', secure: true, httpOnly: true, maxAge: 24 * 60 * 60 * 1000 * 7, signed: true });

    res.status(HttpStatus.OK).json({});
  }

// pages/index.js

class Index extends PureComponent {
  render() {
    return (
      <Layout title="home">
        <Home />
      </Layout>
    );
  }
}

Index.getInitialProps = async ({ req, res }) => {
  const auth = req ? getServerSideToken(req) : getClientSideToken();
  return { auth };
}
export default Index;

// utils/auth.js
const decode = ({ token }) => {
  const decoded = jwt.decode(token);
  const { userId, type = 'anonymous', status, language = 'en' } = decoded || {};
  return { user: { email: userId, type, status, language } };
};

export const getServerSideToken = (req) => {
  const { signedCookies } = req;

  if (!signedCookies) {
    return {};
  }
  try {
    return decode(signedCookies);
  } catch (parseError) {
    console.error(parseError, signedCookies);
    return {};
  }
};

export const getClientSideToken = () => {
  if (typeof window !== 'undefined') {
    const user = window.__USER__ || {};
    return { user };
  }
  return { user: {} };
};

// pages/_document.js
export default class extends Document {
  static async getInitialProps(ctx) {
    const props = await Document.getInitialProps(ctx);
    const info = getServerSideToken(ctx.req);
    return { ...props, ...info };
  }

  render() {
    const { user = {} } = this.props;
    const json = JSON.stringify(user);
    return (
      <html lang="en">
        <Head>
          <meta name="viewport" content="width=device-width, initial-scale=1" />
          <meta charSet="utf-8" />
          <link href="//fonts.googleapis.com/css?family=Kadwa:400,700|Work+Sans:100,300,600" rel="stylesheet" />
          <link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/semantic-ui/2.2.14/semantic.min.css" />
          <link rel="stylesheet" href="/static/site.css" />
        </Head>
        <body>
          <Main />
          <script
            dangerouslySetInnerHTML={{ __html: `__USER__ = ${json};` }}
          />
          <NextScript />
        </body>
      </html>
    );
  }
}

// somewhere.js
import axios from 'axios';
axios.defaults.withCredentials = true;
axios.post(`${apiBaseUrl}/some/path`, data)...

// somemiddleware.js
      const { signedCookies = {} } = req;
      const { token = '' } = signedCookies;
      if (token) {
        try {
          const info = jwt.verify(token, ...);
          req.user = await this.getUser(info.userId);
          if (req.user) {
            next();
            return;
          }
        } catch (err) {
          console.error({ permissionError: err });
          return res.status(500).json({...});
        }
      }
      return res.status(403).json({...});

рдХреНрд▓рд╛рдЗрдВрдЯ рд╕рд╛рдЗрдб рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрднреА рднреА рдЯреЛрдХрди рдирд╣реАрдВ рджреЗрдЦрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдмрд╣реБрдд рд╕реБрд░рдХреНрд╖рд┐рдд рд▓реЗрдХрд┐рди рдмрд╣реБрдд рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИ httpOnly, рд╕реБрд░рдХреНрд╖рд┐рдд, рд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рдФрд░ axios рдпрд╛ рдЕрдиреНрдп рджреНрд╡рд╛рд░рд╛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ ...

рд╕реАрдПрдл https://github.com/zeit/next.js/pull/3955

рд╣рд╛рдп рд╕рдм, рдЕрднреА рдХреБрдХреАрдЬрд╝ рдФрд░ redux рдХреЗ рд╕рд╛рде рдПрдХ рдкреНрд░рд╛рдорд╛рдгрд┐рдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдпрд╛ рд╣реИред рдпрд╣рд╛рдВ рджреЗрдЦреЗрдВ https://github.com/zeit/next.js/pull/4011

рд░реБрдХреЛ рддреЛ рдпрд╣ рдореБрджреНрджрд╛ рдХрд╣рд╛рдБ рд╕рдорд╛рдкреНрдд рд╣реБрдЖ? рдореБрдЭреЗ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд░реЗрдкреЛ рдореЗрдВ рдПрдХреНрд╕рдкреНрд░реЗрд╕ рдСрде рдЙрджрд╛рд╣рд░рдг рдХрднреА рдирд╣реАрдВ рдорд┐рд▓рд╛ред

рдореБрдЭреЗ рдХреБрдХреАрдЬрд╝ рдФрд░ рд╕рддреНрд░реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реА рдмрд╛рддреЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдореЗрд░реЗ рдореВрд▓ рдореЛрдмрд╛рдЗрд▓ рдРрдк рдХреЗ рд▓рд┐рдП рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬрдм рдЗрд╕реЗ рдПрдкреАрдЖрдИ рдХреЛ рд╣рд┐рдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ?

@jackjwilliams рдХреЛ рдореЛрдмрд╛рдЗрд▓ рдРрдк HTTP рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рднреА рдХреБрдХреАрдЬрд╝ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП?
https://stackoverflow.com/questions/1660927/iphone-make-post-request-handle-cookie
https://stackoverflow.com/questions/678630/how-do-i-make-an-http-request-use-cookies-on-android

рдпрд╣ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЬреЗрдбрдмреНрд▓реНрдпреВрдЯреА рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣реИ: рдкреА

рдореИрдВрдиреЗ рдЕрднреА-рдЕрднреА рдЗрд╕ рдкреВрд░реЗ рд╕реВрддреНрд░ рдХрд╛ рд╡рд┐рд╕реНрддреГрдд рдЕрдзреНрдпрдпрди рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рдЕрдкрдиреЗ рдирд┐рд╖реНрдХрд░реНрд╖реЛрдВ рдХреЛ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдмрддрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдп рдорд╣рд╕реВрд╕ рдХрд░ рд░рд╣рд╛ рд╣реВрдБред

рдРрд╕рд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдареЛрд╕ рдСрде рдореЙрдбреНрдпреВрд▓ рдХреЗ рд╕рд╛рде рджреЛ рд╡реНрдпрд╡рд╣рд╛рд░реНрдп рд╕реНрдЯрд╛рд░реНрдЯрд░ рдкрд░рд┐рдпреЛрдЬрдирд╛рдПрдВ рд╣реИрдВ:

@iaincollins рдФрд░ @nmaro рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдХреГрд╖реНрдЯ рдХрд╛рд░реНрдп!

рдзрдиреНрдпрд╡рд╛рдж @ рдХрд░рди :)

рдореИрдВрдиреЗ рдЗрд╕ рдкреБрд▓ рдЕрдиреБрд░реЛрдз https://github.com/iaincollins/nextjs-starter/pull/86 рдореЗрдВ рдиреЗрдХреНрд╕реНрдЯрдЬ-рд╕реНрдЯрд╛рд░реНрдЯрд░ рдХреЗ рдмрд╛рд╣рд░реА рдкрд╣рд▓реБрдУрдВ рдХреЛ рдЯрдЯреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдП рдЧрдП рд╕рднреА рдХреЛрдб рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХрд╛ рджрд╕реНрддрд╛рд╡реЗрдЬреАрдХрд░рдг рдХрд┐рдпрд╛ред

рдпрд╣ рдиреЗрдХреНрд╕реНрдЯ.рдЬреЗрдПрд╕ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЗ рд▓рд┐рдП рдПрдХ рдареЛрд╕ рдирдВрдЧреЗ-рд╣рдбреНрдбрд┐рдпреЛрдВ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдЙрджрд╛рд╣рд░рдг рдХреЗ рдХрд░реАрдм рд╣реЛ рд░рд╣рд╛ рд╣реИред

рдореБрдЭреЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ Office 365 рдХреЗ рд╕рд╛рде OAuth рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдХрд┐ рдореИрдВ рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рд╕рд╛рдЭрд╛ рдХрд░реВрдБрдЧрд╛ рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рдпрд╣рд╛рдБ рдПрдХ рд╕рд╛рде рд░рдЦрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ ред рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ, рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдХрд┐ рдЕрдЧрд░ рдХреЛрдИ рдорд╛рдЗрдХреНрд░реЛрд╕реЙрдлреНрдЯ рдХреЗ рд╕рд╛рде (рд╢рд╛рдпрдж) рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рддреНрд╡рд░рд┐рдд рдЙрджрд╛рд╣рд░рдг рдЪрд╛рд╣рддрд╛ рд╣реИ рддреЛ рдореИрдВ рд╕рд╛рдЭрд╛ рдХрд░реВрдВрдЧрд╛ред

рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЬреЗрдбрдмреНрд▓реНрдпреВрдЯреА рдЯреЛрдХрдирдпреБрдХреНрдд рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдкреА рд░рдЦрдиреЗ рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рднреА рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП рдЬреЛ рдХреНрд▓рд╛рдЗрдВрдЯ рдФрд░ рд╕рд░реНрд╡рд░ рд╕рд╛рдЗрдб рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдореБрдЭреЗ рд╕реНрдкреЗрдХреНрдЯреНрд░рдо рдЪреИрдЯ рдореЗрдВ рдХреБрдЫ рдорджрдж рдорд┐рд▓реА рдФрд░ рдореБрдЭреЗ рд▓рдЧрд╛ рдХрд┐ рдореИрдВ рдЗрд╕реЗ рдЖрдк рд╕рднреА рдХреЗ рд╕рд╛рде рд╕рд╛рдЭрд╛ рдХрд░реВрдВрдЧрд╛ред рдХрд┐рд╕реА рднреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреА рд╣рдореЗрд╢рд╛ рд╕рд░рд╛рд╣рдирд╛ рдХреА рдЬрд╛рддреА рд╣реИред

https://github.com/bgold0/nextjs-auth-skeleton

рд╣рд╛рдп рджреЛрд╕реНрддреЛрдВ!
рдЕрдЧрд▓реЗ.рдЬреЗрдПрд╕ рдХреЗ рд╕рд╛рде рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХрд╛ рдПрдХ рдФрд░ рдЙрджрд╛рд╣рд░рдг рдпрд╣рд╛рдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рдХреБрдЫ рдорд╣реАрдиреЗ рдкрд╣рд▓реЗ рдмрдирд╛рдпрд╛ рд╣реИ, рд╢рд╛рдпрдж рдХрд┐рд╕реА рдХреЛ рдпрд╣ рдЙрдкрдпреЛрдЧреА рд▓рдЧреЗрдЧрд╛:

https://github.com/alan2207/nextjs-jwt-authentication

Ooth 2.0 рдирдП рдФрд░ рдмреЗрд╣рддрд░ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рдХреЗ рд╕рд╛рде рдЖ рдЧрдпрд╛ рд╣реИ

Ooth рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкрд╣рдЪрд╛рди рдкреНрд░рдмрдВрдзрди рдкреНрд░рдгрд╛рд▓реА рд╣реИ рдЬрд┐рд╕реЗ node.js (рдЕрдЧрд▓реЗ.js рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП) рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред

рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╕рдорд░реНрдерд┐рдд рд░рдгрдиреАрддрд┐рдпрд╛рдБ:

  • рдкреНрд░рд╛рдердорд┐рдХ: рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо/рдкрд╛рд╕рд╡рд░реНрдб (рдИрдореЗрд▓ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░реЗрдВ, pw рднреВрд▓ рдЧрдП рдЖрджрд┐), рдЕрддрд┐рдерд┐, facebook, google
  • рдорд╛рдзреНрдпрдорд┐рдХ: рдХреБрдХреА-рдЖрдзрд╛рд░рд┐рдд рд╕рддреНрд░, JWTs

рдЗрд╕ рд▓рд╛рдЗрд╡ рдЙрджрд╛рд╣рд░рдг рдХреЛ рджреЗрдЦреЗрдВ рдЬреЛ рдЗрд╕реЗ next.js ( рд╕реНрд░реЛрдд рдХреЛрдб ) рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд╛рде рд░рдЦрддрд╛ рд╣реИред

рдпрд╣рд╛рдВ рдХрдИ рд▓реЗрдЦ рдирдореВрдиреЗ (рдФрд░ рдЙрджрд╛рд╣рд░рдг рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ) рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рддреНрд░/рдЯреЛрдХрди/рдЖрджрд┐ рдХреЛ getInitialProps рд╕реЗ рд▓реМрдЯрд╛рддреЗ рд╣реИрдВред рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛрдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ, рдЬрдм рдкреГрд╖реНрда рдХреЛ рд╕рд░реНрд╡рд░-рд╕рд╛рдЗрдб рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЗрд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рддреНрд░ рдХреА рдЬрд╛рдирдХрд╛рд░реА рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЛ HTML рдкреГрд╖реНрда рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ ( NEXT_DATA рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ) рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ рднреЗрдЬреА рдЬрд╛рдПрдЧреАред

рдЬрдм getInitialProps рд╕рд░реНрд╡рд░-рд╕рд╛рдЗрдб рдЪрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдореБрдЭреЗ рдЗрд╕ рдкреИрдЯрд░реНрди рдХреЗ рд╕рд╛рде рджреЛ рд╕реБрд░рдХреНрд╖рд╛ рд╕рдорд╕реНрдпрд╛рдПрдВ рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИрдВ:
1) рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рддреНрд░ рд╕рд░реНрд╡рд░ рд╕реЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рдкреНрд░рд╕рд╛рд░рд┐рдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рдРрд╕рд╛ рдХреЛрдИ рдЕрдиреБрд░реЛрдз http:// рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИ рдФрд░ https:// , рддреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдЯреЛрдХрди рдЖрджрд┐ рдХреЛ рд╕рд╛рджреЗ-рдкрд╛рда рдореЗрдВ рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

2) рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рддреНрд░ рдХреЛ HTML рдкреГрд╖реНрда рдХреЗ рднрд╛рдЧ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рд░реНрд╡рд░ рд╕реЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рд╡рд╛рдкрд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ ( NEXT_DATA рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЯреИрдЧ рдореЗрдВ)ред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдЯреЛрдХрди/рдЖрджрд┐ рдХрд╛ рд╕реАрдзреЗ HTML рдкреГрд╖реНрда рдкрд░ рдмреИрдардирд╛ рдЬреЛрдЦрд┐рдо рднрд░рд╛ рд▓рдЧрддрд╛ рд╣реИ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдПрдХ рдмрд╛рд░ рдЬрдм рдкреГрд╖реНрда рдХреЛ рдкрд╛рд░реНрд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдмреНрд░рд╛рдЙрдЬрд╝рд░ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЕрдиреНрдп рддреГрддреАрдп-рдкрдХреНрд╖ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЕрдм рдЪрд▓ рд░рд╣реА рд╣реЛ рд╕рдХрддреА рд╣реИрдВред

рдХреНрдпрд╛ рдЗрди рдореБрджреНрджреЛрдВ рдХреЛ рдкрд╣рд▓реЗ рд╣реА рд╕рдВрдмреЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рдЪреБрдХрд╛ рд╣реИ? рдХреНрдпрд╛ рдЗрди рдЦрддрд░реЛрдВ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╢рдорди рд╣реИ?

рдЗрд╕рд▓рд┐рдП рдореИрдВ рдХреБрдХреАрдЬрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред рдореЗрд░рд╛ рдЙрджрд╛рд╣рд░рдг рдпрд╣рд╛рдВ рджреЗрдЦреЗрдВ https://github.com/hugotox/nextjs-starter/blob/master/pages/_app.js

рдЖрдЦрд┐рд░рдХрд╛рд░! рдпрд╣рд╛рдВ рдЖрдк рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрдВрдЯреЗрдирд░реЛрдВ рдХреЗ рд╕рд╛рде рдкреВрд░реА рддрд░рд╣ рд╕реЗ dockerized next.js auth рдЙрджрд╛рд╣рд░рдг рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ:

  • рдЕрдЧрд▓рд╛.рдЬреЗрдПрд╕
  • рдкреНрд░рд╛рдорд╛рдгрд┐рдХ рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрд╡рд┐рд╕ (рдКрде)
  • рдПрдкреАрдЖрдИ (рдЧреНрд░рд╛рдлрдХреНрд▓)
  • рд╕рддреНрд░ рднрдВрдбрд╛рд░рдг (рд░реЗрдбрд┐рд╕)
  • рдЫреЛрдЯрд╛ рд░рд┐рд╡рд░реНрд╕ рдкреНрд░реЙрдХреНрд╕реА

рдбреЙрдХрдЯрд░-рдХрдВрдкреЛрдЬрд╝ рдХреЗ рд╕рд╛рде рд╕рдм рдХреБрдЫ рдПрдХ рд╕рд╛рде рдЦреАрдВрдЪрд╛ рдЬрд╛рддрд╛ рд╣реИред

JWTs рдкрд░ рддреНрд╡рд░рд┐рдд рдЯрд┐рдкреНрдкрдгреАред рдпрджрд┐ рдЖрдкрдХреЛ рдПрдХ рдбреЛрдореЗрди рд╕реЗ рджреВрд╕рд░реЗ рдбреЛрдореЗрди рдореЗрдВ рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддреЛ рдЬреЗрдбрдмреНрд▓реНрдпреВрдЯреА рдХреЗ рдкрд╛рд╕ рд╕реНрдЯреЗрдЯрд▓реЗрд╕, рдореЛрдмрд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рдФрд░ рдЕрдЪреНрдЫрд╛ рд╣реЛрдиреЗ рдХреЗ рдлрд╛рдпрджреЗ рд╣реИрдВред рдореБрдЦреНрдп рдиреБрдХрд╕рд╛рди рдпрд╣ рд╣реИ рдХрд┐ рд╡реЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЛ рдПрдХреНрд╕рдПрд╕рдПрд╕ рдореЗрдВ рдмреЗрдирдХрд╛рдм рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдореИрдВрдиреЗ рдПрдХ рд╢реБрджреНрдз рдХреБрдХреА-рд╕рддреНрд░ рдЖрдзрд╛рд░рд┐рдд рд╕рдорд╛рдзрд╛рди рдХрд╛ рд╡рд┐рдХрд▓реНрдк рдЪреБрдирд╛ред рдореИрдВ рдЕрднреА рднреА рд░рд┐рд╡рд░реНрд╕ рдкреНрд░реЙрдХреНрд╕реА (рдПрдХ рд╣реА рдбреЛрдореЗрди рдХреЗ рддрд╣рдд рдЪрд▓рдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрд╡рд┐рд╕реЗрдЬ) рдФрд░ рд╕рд╛рдЭрд╛ рд╕рддреНрд░ рднрдВрдбрд╛рд░рдг рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрд╡рд┐рд╕реЗрдЬ рдореЗрдВ рдЪреАрдЬреЛрдВ рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣рд╛ред

https://github.com/nmaro/staart/tree/master/examples/staart
рд▓рд╛рдЗрд╡ рдЙрджрд╛рд╣рд░рдг рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣ рд╣реИ: https://staart.nmr.io

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдХрд░рдирд╛ рд╡рд┐рд╡реЗрдХрдкреВрд░реНрдг рд╣реИ, рдЬреЗрдбрдмреНрд▓реНрдпреВрдЯреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЖрдкрдХреЛ рдПрдХреНрд╕рдПрд╕рдПрд╕ рдХреЗ рд▓рд┐рдП рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ "рдЙрдЬрд╛рдЧрд░" рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рдпрджрд┐ рдЖрдкрдХреА рд╕рд╛рдЗрдЯ рдореЗрдВ XSS рднреЗрджреНрдпрддрд╛ рд╣реИ (рд╕реНрд╡рдпрдВ JWT рдХреЗ рдХрд╛рд░рдг рдирд╣реАрдВ), рддреЛ JWT рд╕реЗ рд╕рдордЭреМрддрд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдХрд┐рд╕реА рднреА рдЕрдиреНрдп рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреА рдкрд╣реБрдВрдЪ рдпреЛрдЧреНрдп рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╕рд╛рде); рдЬрдмрдХрд┐ httpOnly рдХреБрдХреАрдЬ рдХреЛ рдПрдХреНрд╕реЗрд╕ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗрдЧрд╛ред рдХреЛрдИ рдмрд╛рдд рдирд╣реАрдВ рдХрд┐ рдЖрдк httpOnly рдХреБрдХреА рдХреЗ рдореВрд▓реНрдп рдХреЗ рд░реВрдк рдореЗрдВ JWT рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ!

рдХреБрдХреА-рдУрдирд▓реА рд╕рдорд╛рдзрд╛рди рд╕рдорд╛рди-рдбреЛрдореЗрди рд╕рдВрдЪрд╛рд░ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рд╣реЗрдбрд▓реЗрд╕ рдПрдкреАрдЖрдИ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП example.com рдХреЙрд▓рд┐рдВрдЧ api.example.com ), рддреЛ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдЖрдк рдкреНрд░реЙрдХреНрд╕реА рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╕реЗ рдЕрдиреБрд░реЛрдз example.com рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП api.example.com рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рдПрдкреАрдЖрдИ рдХреЙрд▓ рдХрд░рдХреЗ example.com рдФрд░ рдЙрди рдкрд░ рдЖрдЧреЗ рдХреБрдХреА рдЕрдиреБрд░реЛрдз (рдЬреЛ рдкреЗрд╢реЗрд╡рд░реЛрдВ / рд╡рд┐рдкрдХреНрд╖ рдХреЗ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╕реЗрдЯ рдХреЗ рд╕рд╛рде рдЖрддрд╛) рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝ рджрд┐рдпрд╛ рд╕рд╛рде .

рдореИрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдорд╣рд╕реВрд╕ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдЬреЗрдбрдмреНрд▓реНрдпреВрдЯреА рдХреЗ рд╡рд┐рдкрдХреНрд╖ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╣реИрдВ, рдФрд░ рдЖрдорддреМрд░ рдкрд░ рд▓рд╛рдЧреВ рд╕реБрд░рдХреНрд╖рд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдмрд╣реБрдд рдЖрд╕рд╛рдиреА рд╕реЗ рдХрдо рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред рдЗрдирдореЗрдВ рд╕реЗ рдХрдо рд╕реЗ рдХрдо, рдПрдХ рдЯреЛрдХрди рдмреНрд▓реИрдХрд▓рд┐рд╕реНрдЯ jti рджрд╛рд╡реЗ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд╕рдВрд╕реНрдХрд░рдг 4 рдпреВрдпреВрдЖрдИрдбреА) рдХрд╛ рд╕рдВрджрд░реНрдн рджреЗрддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдЯреЛрдХрди рдХреА рд╕рдорд╛рдкреНрддрд┐ рд╕реЗ рдкрд╣рд▓реЗ рд╕рдордЭреМрддрд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдЕрд░реЗ @bjunc рд╣рд╛рдБ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рд╕рд╣реА рд╣реИ, рдЬреЗрдбрдмреНрд▓реНрдпреВрдЯреА рд╕реНрд╡рдпрдВ рдЖрдкрдХреЛ рдПрдХреНрд╕рдПрд╕рдПрд╕ рдореЗрдВ рдЙрдЬрд╛рдЧрд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЖрдкрдХреА рдЕрдиреНрдп рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ, рдореИрдВ рдпрд╣ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдХрд┐ рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рдЕрдкрдиреЗ рдиреБрдХрд╕рд╛рди рд╣реИрдВред

рдХреЛрдИ рдмрд╛рдд рдирд╣реАрдВ рдХрд┐ рдЖрдк JWT рдХрд╛ рдЙрдкрдпреЛрдЧ httpOnly рдХреБрдХреА рдХреЗ рдорд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ!

рд╣рд╛рдВ, рдмрд╕ рдпрд╣ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ рдХрд┐ рдбреЛрдореЗрди рдХреЗ рдмреАрдЪ рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓реНрд╕ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рдЬреЗрдбрдмреНрд▓реНрдпреВрдЯреА рдХреЗ рдПрдХ рд▓рд╛рдн рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рдПред

рдПрдХ рдЯреЛрдХрди рдмреНрд▓реИрдХрд▓рд┐рд╕реНрдЯ

рд╡рд╣, рдФрд░ рд░реАрдлреНрд░реЗрд╢ рдЯреЛрдХрди рдХрд╛ рдЕрдиреНрдп рд╕рд╛рдорд╛рдиреНрдп рдЕрднреНрдпрд╛рд╕ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕реНрдЯреЗрдЯрд▓реЗрд╕ рд╣реЛрдиреЗ рдХреЗ рдЬреЗрдбрдмреНрд▓реНрдпреВрдЯреА рдХреЗ рдЕрдиреНрдп рд▓рд╛рдн рдХреЛ рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реИред

рдпрд╣ рд╕реНрдерд┐рддрд┐ рдХреА рдореЗрд░реА рд╕рдордЭ рд╣реИ:

  • рдпрджрд┐ рдЖрдкрдХреЛ рдХреНрд░реЙрд╕ рд▓реЛрдХреЗрд╢рди рдСрде рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддреЛ JWT <- рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рд▓реЗрдХрд┐рди рдпрджрд┐ рд╕рдВрднрд╡ рд╣реЛ рддреЛ рд╕реБрд░рдХреНрд╖рд╛ рдХреЗ рдХрд╛рд░рдг рдмрдЪреЗрдВ
  • рдпрджрд┐ рдЖрдкрдХреЛ рдХрд┐рд╕реА рдРрд╕реЗ рдХреНрд▓рд╛рдЗрдВрдЯ рд╕реЗ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдирд╣реАрдВ рд╣реИ рдФрд░ рдЬрд┐рд╕рдореЗрдВ XSS рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдбреЗрд╕реНрдХрдЯреЙрдк рдпрд╛ рдореЛрдмрд╛рдЗрд▓ рдРрдк) JWT рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ
  • рдЕрдиреНрдпрдерд╛ рдХреБрдХреА-рдЖрдзрд╛рд░рд┐рдд рд╕рддреНрд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдХреНрдпреЛрдВрдХрд┐ JWT рдЖрдзрд╛рд░рд┐рдд рд╕рдорд╛рдзрд╛рди рдпрд╛ рддреЛ рдХрдо рд╕реБрд░рдХреНрд╖рд┐рдд (XSS) рд╣реЛрдЧрд╛ рдпрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕реНрдЯреЗрдЯрд▓реЗрд╕ (рдмреНрд▓реИрдХрд▓рд┐рд╕реНрдЯ) рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдпрд╛ рдлрд┐рд░ рднреА рдЖрдкрдХреЛ рдПрдХ рд╣реА рдбреЛрдореЗрди рдХреЗ рддрд╣рдд рд╕рдм рдХреБрдЫ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЙрдХреНрд╕реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред

рдореИрдВрдиреЗ Next.js рдкреНрд░рдорд╛рдгреАрдХрд░рдг/рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЦрд╛рддреЛрдВ рдкрд░ рдПрдХ рдордзреНрдпрдо рд▓реЗрдЦ рд▓рд┐рдЦрд╛ рдерд╛ред
рдпрд╣ рд▓рдЧрднрдЧ рджреЛ рд╡рд░реНрд╖реЛрдВ рдХреЗ рдЦрд╛рд▓реА рд╕рдордп рдХреЗ рд╡рд┐рдХрд╛рд╕ рдФрд░ рд╕реЛрдЪ рд╕реЗ рдПрдХ рд╡реНрдпрд╛рдкрдХ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдФрд░ рдореЗрд░рд╛ рдмреНрд░реЗрдирдбрдВрдк рд╣реИ (рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рдореЗрд░реА рдкрд╣рд▓реА рдЯрд┐рдкреНрдкрдгреА рдлрд░рд╡рд░реА 2017 рд╕реЗ рд╣реИ)ред

https://medium.com/the-ideal-system/user-accounts-with-next-js-an-extensive-tutorial-6831cdaed16b

рдЖрдк JWT рдХреЛ рдХрдо рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реЛрдиреЗ рдХреЗ рд╕рд╛рде рд╕рд╣рд╕рдВрдмрдВрдзрд┐рдд рдХрд░рддреЗ рд░рд╣рддреЗ рд╣реИрдВред JWT рдЖрдкрдХреА рд╕рд╛рдЗрдЯ рдХреЛ рдХрдо рд╕реБрд░рдХреНрд╖рд┐рдд рдирд╣реАрдВ рдмрдирд╛рддрд╛ рд╣реИред рдпрд╣ рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдПрдХ XSS рднреЗрджреНрдпрддрд╛ рдирд╣реАрдВ рд╣реИред рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рдПрдХреНрд╕рдПрд╕рдПрд╕ рд╢реЛрд╖рдг рд╣реИ, рддреЛ рдЖрдк рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛ рд╕рдорд╛рди рдкрд░реЗрд╢рд╛рдиреА рдореЗрдВ рд╣реИрдВред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ httpOnly рдХреБрдХреА рдХреЗ рд╕рд╛рде рднреА, рд╣рдорд▓рд╛рд╡рд░ рдХреБрдХреА рдореВрд▓реНрдп рдХреЛ рдкрдврд╝рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рд╕реЗ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдордирдорд╛рдиреА рдХреЛрдб рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ - рдЬреИрд╕реЗ рдПрдХреНрд╕рдПрдЪрдЖрд░ рдЕрдиреБрд░реЛрдз рдЬреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╕рддреНрд░ рдХреБрдХреАрдЬрд╝ рдкрд╛рд╕ рдХрд░реЗрдВрдЧреЗ (рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдХрд╛рд░реНрдп рдХрд░рдирд╛ рдПрдХ рд╕реАрдПрд╕рдЖрд░рдПрдл рд╣рдорд▓рд╛)ред рдпрджрд┐ рдЖрдкрдХрд╛ рдПрдкреАрдЖрдИ рдХреНрд░реЙрд╕-рдбреЛрдореЗрди рд╣реИ, рдФрд░ рдЖрдк рдмреНрд░рд╛рдЙрдЬрд╝рд░-рд╕реЗ-рд╕рд░реНрд╡рд░ рдЕрдиреБрд░реЛрдз рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЬреЗрдбрдмреНрд▓реНрдпреВрдЯреА рдХреЛрдб рдореЗрдВ рдХрд╣реАрдВ рднреА рд╣реИ (рдЪрд╛рд╣реЗ рд╡рд╣ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕реНрдерд┐рддрд┐ рд╣реЛ, рдпрд╛ рд╕реНрдерд╛рдиреАрдп рд╕реНрдЯреЛрд░реЗрдЬ)ред рдпрджрд┐ рдЖрдк рдПрдХреНрд╕рд┐рдпреЛрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдиреЗ рд╡реИрд╢реНрд╡рд┐рдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рднреА рд╕реЗрдЯ рдХрд┐рдпрд╛ рд╣реЛ, рдЬрд╣рд╛рдВ рд╣рдорд▓рд╛рд╡рд░ рдХреЛ рдХреЗрд╡рд▓ рдПрдХреНрд╕рд┐рдпреЛрд╕ рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдСрде рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреА рдЪрд┐рдВрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕реАрдПрд╕рдЖрд░рдПрдл рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд┐рдП рдмрд┐рдирд╛ рдПрдХреНрд╕рдПрд╕рдПрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ; рдЬрд╣рд╛рдВ рдкреНрд░рд╛рдорд╛рдгрд┐рдХ рдХреБрдХреАрдЬрд╝ рдХреЛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд▓рдХреНрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдПрдХ рд░рд┐рд╡рд░реНрд╕ рдкреНрд░реЙрдХреНрд╕реА рд╕реЗрдЯрдЕрдк рдХреЗ рд╕рд╛рде, рдПрдХ рд╕реАрдПрд╕рдЖрд░рдПрдл рд╣рдорд▓рд╛ рд╣рдорд▓рд╛рд╡рд░ рдХреЛ рдЖрдкрдХреЗ рдПрдкреАрдЖрдИ рдХреЗ рдЦрд┐рд▓рд╛рдл рдкреНрд░рдорд╛рдгрд┐рдд рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред

рдмреАрдЯреАрдбрдмреНрд▓реНрдпреВ, рд╕рд┐рд░реНрдл рдЗрд╕рд▓рд┐рдП рдХрд┐ рдЖрдкрдиреЗ рдЬреЗрдбрдмреНрд▓реНрдпреВрдЯреА рдХреЛ рдХреБрдХреА рдореЗрдВ рд░рдЦрд╛ рд╣реИ (рдХрд╣рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЬрд╛рдирдирд╛ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд▓реЙрдЧ рдЗрди рд╣реИ рдпрд╛ рдирд╣реАрдВ), рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдХреНрд░реЙрд╕-рдбреЛрдореЗрди рд╕рд░реНрд╡рд░-рдЯреВ- рдХреЗ рд▓рд┐рдП рдХреБрдХреА рд╡реИрд▓реНрдпреВ (рдЬреИрд╕реЗ рдЬреЗрдбрдмреНрд▓реНрдпреВрдЯреА) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдкреЗрдЬ рд▓реЛрдб рдкрд░ рдПрдкреАрдЖрдИ-рд╕рд░реНрд╡рд░ рдПрдХреНрд╕реЗрд╕ (рдЬреЛ рд░рд┐рд╡рд░реНрд╕ рдкреНрд░реЙрдХреНрд╕реА рдкрд░рд┐рджреГрд╢реНрдп рдХреЗ рд▓рд┐рдП рднреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ)ред рди рд╣реА рдЖрдк рд╣реИрдВ рдпрд╛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЕрд╡рд╕реНрдерд╛ рдореЗрдВ JWT рдкрд╛рд╕ рдХрд░рдиреЗ рд╕реЗ рдФрд░ рд╕рд╛рде рд╣реА рдмреНрд░рд╛рдЙрдЬрд╝рд░-рд╕реЗ-рдПрдкреАрдЖрдИ-рд╕рд░реНрд╡рд░ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд▓рд┐рдП рднреА рдЖрдкрдХреЛ рд░реЛрдХрд╛ рдирд╣реАрдВ рдЧрдпрд╛ рд╣реИред рд╡реЗ рдкрд░рд╕реНрдкрд░ рдЕрдирдиреНрдп рдирд╣реАрдВ рд╣реИрдВред

рдПрдХ рддрд░рдл рдХреЗ рд░реВрдк рдореЗрдВ, рдореБрдЭреЗ "рд╕реНрдЯреЗрдЯрд▓реЗрд╕" рдЬреЗрдбрдмреНрд▓реНрдпреВрдЯреА рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдЕрдзрд┐рдХрд╛рдВрд╢ рдЙрдкрдпреЛрдЧ-рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдЖрд╡реЗрджрди рдореЗрдВ рдУрд╡рд░рд░реЗрдЯреЗрдб рдФрд░ рд╕реАрдорд┐рдд рджреЛрдиреЛрдВ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдорд┐рд▓рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

  • рд╕рдВрд╕рд╛рдзрди рдЖрдзрд╛рд░рд┐рдд / рдЧрддрд┐рд╢реАрд▓ рдЕрдиреБрдорддрд┐рдпрд╛рдБ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рди рдХреЗрд╡рд▓ " can edit Post ", рдмрд▓реНрдХрд┐ " can edit Post:1634 ")ред
  • рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд╛ рдЦрд╛рддрд╛ рдЕрд╡рд░реБрджреНрдз / рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ?
  • рдЙрдирдХреА рдорд╛рд╕рд┐рдХ рд╕рджрд╕реНрдпрддрд╛ рдХрд╛ рднреБрдЧрддрд╛рди рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ; рдХреМрди рд╕реА рдереНрд░реЙрдЯрд▓ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛?
  • рдЯреЛрдХрди рдХреЛ рдмреНрд▓реИрдХрд▓рд┐рд╕реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ (рдкреНрд░рддрд┐ рдКрдкрд░)?

рдЖрдк рд╡рд╣ рд╕рдм JWT рдореЗрдВ рдмреЗрдХ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдбреЛрдореЗрди рд▓реЗрдпрд░ (рдпрд╛рдиреА рдбреЗрдЯрд╛рдмреЗрд╕) рдореЗрдВ рдбреБрдмрдХреА рд▓рдЧрд╛рдиреА рд╣реЛрдЧреАред рдЖрдкрдиреЗ рдЕрднреА-рдЕрднреА рд╕рдВрд╕рд╛рдзрди рд▓реЛрдб рдХрд┐рдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рд╡рд╣реАрдВ рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд╣рд╛рдБ рдмрд╛рдХреА рдРрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЕрдм рдЖрдкрдХреЗ рдкрд╛рд╕ рд░рд╛рдЬреНрдп рд╣реИред рдореБрдЭреЗ рдпрд╣ рд╕реЛрдЪрдирд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореВрд░реНрдЦрддрд╛рдкреВрд░реНрдг рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡рд┐рд╖рдп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрдкрдХреЛ рдЬреЛ рдХреБрдЫ рднреА рдЬрд╛рдирдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рдЙрд╕реЗ рдЯреЛрдХрди рдореЗрдВ рдмреЗрдХ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛; рдПрдХ рд╕рд╛рде рдЗрд╕реЗ рдЬреНрдпрд╛рджрд╛рддрд░ рдЧреБрдордирд╛рдо рдФрд░ рд╣рд▓реНрдХрд╛ рд░рдЦрддреЗ рд╣реБрдПред рдмрд╣реБрдд рдЕрдзрд┐рдХ рдкрдЪрд╛рдП рдмрд┐рдирд╛, рдЕрдВрддрд░-рд╕реЗрд╡рд╛ рд╕рдВрдЪрд╛рд░ рдореЗрдВ "рд╕реНрдЯреЗрдЯрд▓реЗрд╕" рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рддрд░реНрдХ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдореБрдЭреЗ рдЕрд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд▓рдЧрддрд╛ рд╣реИ (рдХрдо рд╕реЗ рдХрдо рдпрд╣ рдмреЗрдХрд┐рдВрдЧ рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ рдЬрд┐рд╕реЗ рдЖрдкрдХреЛ рдЬреЗрдбрдмреНрд▓реНрдпреВрдЯреА рдореЗрдВ рд╡рд┐рд╖рдп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ) .. .

рдЗрд╕ рдмреАрдЪ рдЙрдкрд▓рдмреНрдз рдУрде рдкреНрд░рдорд╛рдгреАрдХрд░рдг рд░рдгрдиреАрддрд┐рдпрд╛рдБ (рдмреЛрд▓реНрдб рдореЗрдВ рдирдИ):

  • рд╕реНрдерд╛рдиреАрдп (рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо/рдИрдореЗрд▓/рдкрд╛рд╕рд╡рд░реНрдб)
  • рдлреЗрд╕рдмреБрдХ
  • рдЧреВрдЧрд▓
  • рдЕрддрд┐рдерд┐
  • рдкреИрдЯреНрд░рд┐рдпрди
  • рдЯреНрд╡рд┐рдЯрд░
  • Authy (Twilio) - рдПрд╕рдПрдордПрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд╛рд╕рд╡рд░реНрдб рд░рд╣рд┐рдд

@jaredpalmer рдЖрдкрдиреЗ рд▓рд┐рдЦрд╛
Php рдХреА рддрд░рд╣, Next рдХреА рдкрд░рдорд╛рдгреБ рдЗрдХрд╛рдИ рдкреГрд╖реНрда рд╣реИред рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдЖрд▓рд╕реА рдкреНрд░рддреНрдпреЗрдХ рдкреГрд╖реНрда рдХреЛ рдХреЗрд╡рд▓ рддрднреА рд▓реЛрдб рдХрд░рддрд╛ рд╣реИ рдЬрдм рдЙрд╕рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдХреНрд▓рд╛рдЗрдВрдЯ-рд╕рд╛рдЗрдб рдХреЗрд╡рд▓ рдСрде рдХреЗ рд╕рд╛рде рд▓реЗрдХрд┐рди рд╕рд░реНрд╡рд░-рд░реЗрдВрдбрд░рд┐рдВрдЧ рдХреЗ рд╕рд╛рде, рдЙрд╕ рд╕рдВрд░рдХреНрд╖рд┐рдд рдкреГрд╖реНрда рдХреЗ рд▓рд┐рдП рдЬреЗрдПрд╕ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рджреНрд╡рд╛рд░рд╛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЬрдм рдиреЗрдХреНрд╕реНрдЯ рд╕рд░реНрд╡рд░ рд╡рд░реНрдХрдлреНрд▓реЛ рдЬреЛрдбрд╝рддрд╛ рд╣реИ, рддреЛ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЖрдк рдЗрд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд░реНрд╡рд░ рдкрд░ рд░реЗрдВрдбрд░ рдФрд░ рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ рдХреЛ рдмреНрд▓реЙрдХ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдВрдЧреЗред рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреБрдХреАрдЬрд╝, рд╕рддреНрд░ рдФрд░ AFAIK рд╕рддреНрд░ рд╕реНрдЯреЛрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рд▓реЗрдХрд┐рди рдпрд╣ рдЗрд╕ рддрд░рд╣ рдХреЗ рд╣рд╛рдЗрдмреНрд░рд┐рдб рдРрдкреНрд╕ рдХрд░рдиреЗ рдХреА рд▓рд╛рдЧрдд рд╣реИред

рд╣рдо 2 рд╕рд╛рд▓ рдмрд╛рдж рд╣реИрдВред рдХреНрдпрд╛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдкреГрд╖реНрдареЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЗрдПрд╕ рд▓реЛрдб рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╕рд░реНрд╡рд░ рд╡рд░реНрдХрдлрд╝реНрд▓реЛ рд╣реИ?
@timneutkens рд╢рд╛рдпрдж рджреВрд╕рд░реЗ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд╕рдВрд░рдХреНрд╖рд┐рдд рд╕рд╛рдордЧреНрд░реА рдбрд╛рд▓ рд░рд╣реЗ рд╣реИрдВ?
рдореИрдВ рд╕реБрд░рдХреНрд╖рд┐рдд рд╕рд╛рдордЧреНрд░реА рддрдХ рдкрд╣реБрдВрдЪ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХреИрд╕реЗ рд░реЛрдХреВрдВ?

@lishine рдЖрдкрдХреЗ рдкрд╛рд╕ рдЕрдкрдиреЗ рдкреГрд╖реНрда рдХреЗ getInitialProps рдореЗрдВ рдПрдХ ServerResponse рд╣реИ - рдЖрдк рдЖрд╕рд╛рдиреА рд╕реЗ рдХрд┐рд╕реА рдЕрдирдкреЗрдХреНрд╖рд┐рдд рд╡реНрдпрдХреНрддрд┐ рдХреЛ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдХреНрдпрд╛ Redux рдХреЗ рд╕рд╛рде auth рдХрд╛ рдХреЛрдИ рдЙрджрд╛рд╣рд░рдг рд╣реИ?

рдХреНрдпрд╛ Redux рдХреЗ рд╕рд╛рде auth рдХрд╛ рдХреЛрдИ рдЙрджрд╛рд╣рд░рдг рд╣реИ?

рдЖрдк рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЛ рдЖрдЬрдорд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд░реЗрдбрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдФрд░ рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдпрд╣ рдЖрдкрдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ ...
рдЖрдк рдЗрд╕реЗ рдЗрд╕ рд╡рд┐рд╖рдп рдореЗрдВ рдХрд╣реАрдВ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рдирд╣реАрдВ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдпрд╣рд╛рдБ рд╣реИ:
https://github.com/alan2207/nextjs-jwt-authentication

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рд░реНрд╡рд░ рд╕рд╛рдЗрдб рдПрдкреАрдЖрдИ рдХреЙрд▓ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдпрд╣ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╕рдорд╕реНрдпрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╡рд░реНрдЪреБрдЕрд▓ рдбреЛрдо рд▓реЙрдЧрдЖрдЙрдЯ-рд▓реЙрдЧрд┐рди рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреЗ рдмрд╛рдж рдкреБрд░рд╛рдиреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдореИрдВ рд╕рдорд╛рдзрд╛рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪ рд░рд╣рд╛ рд╣реВрдБ

_рд╕рдВрдкрд╛рджрд┐рдд_
рдФрд░ рдпрд╣рд╛рдБ рдореЗрд░рд╛ рдЬрд╡рд╛рдм redux-рдЕрд╡рд▓реЛрдХрди рдпреЛрдЧреНрдп рдХреЗ рд╕рд╛рде рд╣реИ

|рдкрдХреНрд╖|рдкреНрд░рд╛рдорд╛рдгрд┐рдХ|TODO|
|---|---|---|
|рд╕рд░реНрд╡рд░|рд╕рдЪ|рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ (рдЕрдиреБрд░реЛрдз рдХреБрдХреА рдкреНрд░реЙрдХреНрд╕реА рдХреЗ рд╕рд╛рде)ред|
|рд╕рд░реНрд╡рд░|рдЭреВрдард╛|рд▓реЙрдЧрд┐рди рдкреЗрдЬ рджрд┐рдЦрд╛рдПрдБ, рдФрд░ рд▓реЙрдЧрд┐рди рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ||
|рдХреНрд▓рд╛рдЗрдВрдЯ|рд╕рдЪ|рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ||
|рдХреНрд▓рд╛рдЗрдВрдЯ|рдЧрд▓рдд|рд▓реЙрдЧрд┐рди рдкреЗрдЬ рджрд┐рдЦрд╛рдПрдБ, рдФрд░ рд▓реЙрдЧрд┐рди рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред (рдпрд╣ рддрднреА рд╣реЛрддрд╛ рд╣реИ рдЬрдм рд╕рддреНрд░ рдкреГрд╖реНрда рджрд░ рдкреГрд╖реНрда рд╕реНрдерд╛рдирд╛рдВрддрд░рдг рдореЗрдВ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ)|

  static async getInitialProps({ store, query: { rowsPerPage, pageIndex }, req, auth }) {
    store.dispatch(TemporaryStoryActions.initPageState());

    const isAuthenticated = () => req ? req.isAuthenticated()
      : store.getState().auth.isAuthenticated;

    if (isAuthenticated()) {
      // fetch initial data
      const TemporaryStoryApiProxy = withCookieProxy(req, TemporaryStoryApi);
      await TemporaryStoryApiProxy.fetchTemporaryStories({
        rowsPerPage: rowsPerPage || 15,
        pageIndex: pageIndex || 0,                                                                                                                                  }).then(json => {
        store.dispatch(TemporaryStoryActions.loadTemporaryStories(
          json.rowsPerPage, json.pageIndex, json.count, json.rows));
      }).catch(error => {
        if (error.response && error.response.status === 403) {
          store.dispatch(AuthActions.initState(false, null));
          return;
        }
        throw error;
      });
    }

    if (!isAuthenticated()) {
      // => if client side fetch failed with 403, isAuthenticated() turns off to false
      // register logined action for client side login succeeded
      const reloadAction = TemporaryStoryActions.fetchTemporaryStories({
        rowsPerPage: rowsPerPage || 15,
        pageIndex: pageIndex || 0,
      });
      store.dispatch(AuthActions.addLoginedAction(reloadAction));
    }

    return {
      ...store.getState(),
    }                                                                                                                                                           }                                                                                             }
export const withLogin = Page => class SecurePage extends React.Component {
  static async getInitialProps (ctx) {
    if (ctx.req && ctx.store) {
      // server side
      const isAuthenticated = ctx.req.isAuthenticated();
      const { user } = ctx.req;
      ctx.store.dispatch(AuthActions.initState(isAuthenticated, user));
    }
    return Page.getInitialProps && await Page.getInitialProps(ctx)
  }

  render () {
    const { auth } = this.props;
    return auth.isAuthenticated ? <Page {...this.props} /> : <LoginPage />
  }                                                                                                                                                           }
// when [front-end server] => [api server]
// on Server Side Rendering,
// needs to proxy Cookies which sent to Next.js page request
export const withCookieProxy = (req, targetApi) => {
  if (!req) {
    return targetApi;
  }
  targetApi.client.interceptors.request.use(config => {
    const cookieString = Object.keys(req.cookies).map(key => `${key}=${req.cookies[key]}`).join('; ');
    const headers = {
      ...(config.headers || {}),
      Cookie: cookieString,
    };
    return {
      ...config,
      headers: headers,
    };
  }, error => {
    return Promise.reject(error);
  });
  return targetApi;
};
const loginEpic = (action$, state$) => action$.pipe(
  ofType(AuthActionTypes.login),
  mergeMap(action => {
    const email = action.payload.email;
    const password = action.payload.password;
    return from(AuthApi.login(email, password))
      .mergeMap(json => {
        const user = json.user;
        const loginedActions = state$.value.auth.loginedActions;
        const successActions = [
          AuthActions.removeAllLoginedActions(),
          ...loginedActions,
          AuthActions.loginSuccess(user.id, user.name, user.last_login_date),
        ];
        return from(successActions);
      }).pipe(catchError(error => {
        return of$(AuthActions.loginFail(error));
      }));
  }));

рдЬрдЯрд┐рд▓ рд▓рдЧрддрд╛ рд╣реИ рдЬрдм рдХреБрдЫ рд╕рд░рд▓ рд╣реЛрдЧрд╛, рдХреА рддрд░реНрдЬ рдкрд░:

export const withAuthSync = WrappedComponent => class extends Component {
  componentDidMount() {
    window.addEventListener('storage', this.syncLogout);
  }

  componentWillUnmount() {
    window.removeEventListener('storage', this.syncLogout);
    window.localStorage.removeItem('logout');
  }

    syncLogout = (event) => {
      if (event.key === 'logout') {
        console.log('logged out from storage!');
        window.location.reload();
      }
    };

    render() {
      return <WrappedComponent {...this.props} />;
    }
};

рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЛ Next.js 8 рдХреЗ рднрд╛рдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдорд┐рд▓рд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛
https://github.com/zeit/next.js/tree/canary/examples/with-cookie-auth

@timneutkens рд▓рд┐рдВрдХ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

https://github.com/zeit/next.js/blob/canary/examples/with-cookie-auth/www/utils/auth.js#L26 -L34 ... рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЪреЗрдХ рдХреЗ рдмрд╛рдж auth() рдХреЛ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛?

рдХреБрдХреА рдХреЗ рдмрд┐рдирд╛ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рд╕реЗ Profile.getInitialProps() рдХрд╣рд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рдЬрдмрдХрд┐ рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдерд╛ рдХрд┐ рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ рдЕрдзрд┐рдХ "рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдкреНрд░реЛрдк" рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╣реЛрдЧрд╛ ...

рдореИрдВрдиреЗ рдпрд╣рд╛рдВ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдпрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╕рд░реНрд╡рд░-рд╕рд╛рдЗрдб рдкреНрд░реА-рд░реЗрдВрдбрд░рд┐рдВрдЧ + рдкреНрд░рдорд╛рдгреАрдХрд░рдг w/рдЕрдкреЛрд▓реЛ рд╣реИ

https://github.com/HorizonShadow/apolo-next-now-test

рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рд░рдЦреЗрдВ рдХрд┐ OWASP рд╕реБрд░рдХреНрд╖рд╛ рджрд┐рд╢рд╛рдирд┐рд░реНрджреЗрд╢ рд╕реНрдерд╛рдиреАрдп рд╕рдВрдЧреНрд░рд╣рдг рдореЗрдВ JWT рдЯреЛрдХрди рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд╡рд┐рд░реБрджреНрдз рдЕрдиреБрд╢рдВрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рдд "рдЗрди рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдореЗрдВ рд╕рднреА рдбреЗрдЯрд╛ рдХреЛ рдЪреБрд░рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдПрдХрд▓ рдХреНрд░реЙрд╕ рд╕рд╛рдЗрдЯ рд╕реНрдХреНрд░рд┐рдкреНрдЯрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдлрд┐рд░ рд╕реЗ рд╕реНрдерд╛рдиреАрдп рд╕рдВрдЧреНрд░рд╣рдг рдореЗрдВ рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдЬрд╛рдирдХрд╛рд░реА рд╕рдВрдЧреНрд░рд╣реАрдд рди рдХрд░рдиреЗ рдХреА рдЕрдиреБрд╢рдВрд╕рд╛ рдХреА рдЬрд╛рддреА рд╣реИред"

рдпрд╣рд╛рдБ Auth0 рд╣реИ: рдЯреЛрдХрди рдФрд░ рдЯреЙрдо рдПрдмреЙрдЯ рдХреЛ рдХрд╣рд╛рдБ рд╕реНрдЯреЛрд░ рдХрд░реЗрдВ: рдЕрдкрдиреЗ JWTs рдХреЛ рдХрд╣рд╛рдБ рд╕реНрдЯреЛрд░ рдХрд░реЗрдВ - рдХреБрдХреАрдЬрд╝ рдмрдирд╛рдо HTML5 рд╡реЗрдм рд╕реНрдЯреЛрд░реЗрдЬ ред

рдпрд╣рд╛рдБ Nuxt.js + Express.js рдкреНрд░реЙрдХреНрд╕реА рд╕рд░реНрд╡рд░ + Django рдмреИрдХрдПрдВрдб рдХреЗ рд╕рд╛рде рдПрдХ рдЙрджрд╛рд╣рд░рдг рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЬрд╣рд╛рдВ рдПрдХреНрд╕рдкреНрд░реЗрд╕ рд╕рд░реНрд╡рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдмреИрдХрдПрдВрдб рдХреЗ рд▓рд┐рдП рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдЕрдиреБрд░реЛрдз рдХреЛ рдкреНрд░реЙрдХреНрд╕реА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдХреБрдХреА рдореЗрдВ рдЬреЗрдбрдмреНрд▓реНрдпреВрдЯреА рдЯреЛрдХрди рднрдВрдбрд╛рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рд╕реАрдПрд╕рдЖрд░рдПрдл рд╕реБрд░рдХреНрд╖рд╛ рдХреЛ рд╕рдВрднрд╛рд▓ рд░рд╣рд╛ рд╣реИ (рдЯреЛрдХрди рдХреА рд▓рдВрдмрд╛рдИ рдкрд░ рдХреБрдЫ рдкреНрд░рддрд┐рдмрдВрдз рд▓рдЧрд╛рддрд╛ рд╣реИ/рдЬреЗрдбрдмреНрд▓реНрдпреВрдЯреА рдЯреЛрдХрди рдореЗрдВ рдХрд┐рддрдиреА рдЬрд╛рдирдХрд╛рд░реА рд╕рдВрдЧреНрд░рд╣реАрдд рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ): https:/ /github.com/danjac/nuxt-python-secure-example

@timneutkens рдореБрдЭреЗ рдХреБрдХреА рд╕реЗ SSR рдХрд╕реНрдЯрдо рд░реЗрдбрдХреНрд╕ рдорд┐рдбрд▓рд╡реЗрдпрд░ рдореЗрдВ рдЯреЛрдХрди рднреЗрдЬрдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдЪрд╛рд╣рд┐рдПред рдореБрдЭреЗ _app.js рдХреЗ рдЕрдВрджрд░ рдХреБрдХреАрдЬрд╝ рдорд┐рд▓ рд░рд╣реА рд╣реИрдВред рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕реЗ customApimiddleware рдкрд░ рдХреИрд╕реЗ рдкрд╛рд╕ рдХрд░реВрдВред рдЬрд╣рд╛рдВ рдореИрдВрдиреЗ рдлрд╝реЗрдЪ рдЕрдиреБрд░реЛрдз рд▓рд┐рдЦрд╛ рд╣реИред рдзрдиреНрдпрд╡рд╛рдж

рдореИрдВрдиреЗ Next.js рдкреНрд░рдорд╛рдгреАрдХрд░рдг/рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЦрд╛рддреЛрдВ рдкрд░ рдПрдХ рдордзреНрдпрдо рд▓реЗрдЦ рд▓рд┐рдЦрд╛ рдерд╛ред
рдпрд╣ рд▓рдЧрднрдЧ рджреЛ рд╡рд░реНрд╖реЛрдВ рдХреЗ рдЦрд╛рд▓реА рд╕рдордп рдХреЗ рд╡рд┐рдХрд╛рд╕ рдФрд░ рд╕реЛрдЪ рд╕реЗ рдПрдХ рд╡реНрдпрд╛рдкрдХ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдФрд░ рдореЗрд░рд╛ рдмреНрд░реЗрдирдбрдВрдк рд╣реИ (рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рдореЗрд░реА рдкрд╣рд▓реА рдЯрд┐рдкреНрдкрдгреА рдлрд░рд╡рд░реА 2017 рд╕реЗ рд╣реИ)ред

https://medium.com/the-ideal-system/user-accounts-with-next-js-an-extensive-tutorial-6831cdaed16b

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ nextj.js рдРрдк рдореЗрдВ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреЗ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред рдореИрдВрдиреЗ рд╕реНрдерд╛рдиреАрдп рд╕реНрдЯреЛрд░реЗрдЬ (рдПрдХреНрд╕рдПрд╕рдПрд╕) рдореЗрдВ рдЯреЛрдХрди рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ, рдХреБрдХреАрдЬрд╝ рдореЗрдВ рдЯреЛрдХрди рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ (рд╕реАрдПрд╕рдЖрд░рдПрдл рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рдмрд┐рдирд╛), рдФрд░ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╕реЗ рдХреБрдХреАрдЬрд╝ рдореЗрдВ рдЯреЛрдХрди рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдЬреИрд╕реА рдЪреАрдЬреЗрдВ рджреЗрдЦреА рд╣реИрдВ (рдПрдХреНрд╕рдПрд╕рдПрд╕ рдФрд░ рд╕реАрдПрд╕рдЖрд░рдПрдл рджреЛрдиреЛрдВ рдХрдордЬреЛрд░)ред

рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд░рд┐рд╡рд░реНрд╕ рдкреНрд░реЙрдХреНрд╕реА рдХреЗ рд╕рд╛рде рдЖрдкрдХрд╛ рд╕рдорд╛рдзрд╛рди рдкрд╕рдВрдж рд╣реИ рдФрд░ рд╡рд┐рднрд┐рдиреНрди рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рдмреАрдЪ рд╕рддреНрд░ рдЬрд╛рдирдХрд╛рд░реА рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ред рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ next.js рдРрдк рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╕реНрдЯрдо рд╕рд░реНрд╡рд░ рдирд╣реАрдВ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддрд╛, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рддреНрд░реЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдФрд░ рд╕реАрдПрд╕рдЖрд░рдПрдл рдХреЛ рд░реЛрдХрдиреЗ (рдФрд░ рд╢рд╛рдпрдж рд░рд┐рд╡рд░реНрд╕ рдкреНрд░реЙрдХреНрд╕реА рдЬреЛрдбрд╝рдиреЗ) рджреЛрдиреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рд╕рд░рд▓ рддрд░реАрдХрд╛ рд╣реИред рдореИрдВ рдПрдХ рдореЛрдиреЛрд▓рд┐рде рдкреНрд░реЛрдЬреЗрдХреНрдЯ рднреА рдмрдирд╛ рд╕рдХрддрд╛ рд╣реВрдВ (рджреЛрдиреЛрдВ рдРрдк рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдФрд░ рдбреАрдмреА рдСрдкрд░реЗрд╢рдВрд╕ рдЗрддреНрдпрд╛рджрд┐ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП)ред

рдореИрдВрдиреЗ рджреЗрдЦрд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рд▓реЛрдЧ (ZEIT рд╕рд╣рд┐рдд) API рдХреЛ рд╕реНрдЯреЗрдЯрд▓реЗрд╕ рд░рдЦрддреЗ рд╣реИрдВ рдФрд░ next.js рдРрдк рдХреЛ рд╕рддреНрд░ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рджреЗрддреЗ рд╣реИрдВред рдпрд╣ рдПрдкреАрдЖрдИ рдХреЛ рдЯреЛрдХрди рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╕рддреНрд░реЛрдВ рдХреЗ рд╕рд╛рде рдЬрд╛рдиреЗ рд╕реЗ рдЪреАрдЬреЗрдВ рдереЛрдбрд╝реА рдЕрдзрд┐рдХ рддрдВрдЧ рдФрд░ рдХрдо рдЬрдЯрд┐рд▓ рд╣реЛ рдЬрд╛рддреА рд╣реИрдВред

next.js рдХреЗ рд▓рд┐рдП рдПрдХ рдкреВрд░реНрдг рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдЙрджрд╛рд╣рд░рдг рд░рдЦрдирд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдмреЗрд╣рддрд░ рдмрд╛рдд рд╣реЛрдЧреАред рдмрд╛рд╣рд░реА рдПрдкреАрдЖрдИ рдХреЗ рд▓рд┐рдП рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдЬреИрд╕реА рдЪреАрдЬреЛрдВ рдХреЗ рд╕рд╛рде, рд╕рддреНрд░ рдХреЛ next.js рдРрдк рдореЗрдВ рд░рдЦрдирд╛, рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рдмреАрдЪ рд╕рддреНрд░ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдпрд╛ рдЙрдиреНрд╣реЗрдВ рдЯреЛрдХрди рджреЗрдирд╛, рдФрд░ рдЯреЛрдХрди рдХреА рд╕рдордп рд╕реАрдорд╛ рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рдкрд░ рдЙрдиреНрд╣реЗрдВ рддрд╛рдЬрд╝рд╛ рдХрд░рдирд╛ рднреАред (рдмрд╣реБрдд рд╕реЗ рд▓реЛрдЧ JWTs рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рдХреБрдЫ рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдФрд░ рдмрд╕ рдЙрдиреНрд╣реЗрдВ рдЕрдкрдиреЗ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡реЗ рдЬреНрдпрд╛рджрд╛рддрд░ рдЙрдиреНрд╣реЗрдВ рд╕рдорд╛рдкреНрдд рднреА рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рдпрд╛ рдЙрдиреНрд╣реЗрдВ рд░реАрдлреНрд░реЗрд╢ рднреА рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред)

рд╡реИрд╕реЗ рднреА, рдЖрдкрдиреЗ рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рд╕рдмрд╕реЗ рд╕рдВрдкреВрд░реНрдг рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдореЗрдВ рд╕реЗ рдПрдХ рд▓рд┐рдЦрд╛ рд╣реИред рддреЛ рдзрдиреНрдпрд╡рд╛рдж!

рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрд╢рд╛ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдкреВрд░реНрдг рдФрд░ рд╕реНрдкрд╖реНрдЯ рдЙрджрд╛рд╣рд░рдг рдФрд░ рджрд╕реНрддрд╛рд╡реЗрдЬ рд╣реЛрдВрдЧреЗред

next.js рдХреЗ рд▓рд┐рдП рдПрдХ рдкреВрд░реНрдг рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдЙрджрд╛рд╣рд░рдг рд░рдЦрдирд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдмреЗрд╣рддрд░ рдмрд╛рдд рд╣реЛрдЧреАред рдмрд╛рд╣рд░реА рдПрдкреАрдЖрдИ рдХреЗ рд▓рд┐рдП рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдЬреИрд╕реА рдЪреАрдЬреЛрдВ рдХреЗ рд╕рд╛рде, рд╕рддреНрд░ рдХреЛ next.js рдРрдк рдореЗрдВ рд░рдЦрдирд╛, рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рдмреАрдЪ рд╕рддреНрд░ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдпрд╛ рдЙрдиреНрд╣реЗрдВ рдЯреЛрдХрди рджреЗрдирд╛, рдФрд░ рдЯреЛрдХрди рдХреА рд╕рдордп рд╕реАрдорд╛ рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рдкрд░ рдЙрдиреНрд╣реЗрдВ рддрд╛рдЬрд╝рд╛ рдХрд░рдирд╛ рднреАред (рдмрд╣реБрдд рд╕реЗ рд▓реЛрдЧ JWTs рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рдХреБрдЫ рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдФрд░ рдмрд╕ рдЙрдиреНрд╣реЗрдВ рдЕрдкрдиреЗ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡реЗ рдЬреНрдпрд╛рджрд╛рддрд░ рдЙрдиреНрд╣реЗрдВ рд╕рдорд╛рдкреНрдд рднреА рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рдпрд╛ рдЙрдиреНрд╣реЗрдВ рд░реАрдлреНрд░реЗрд╢ рднреА рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред)

рдореИрдВ рднреА, рдПрдХ рдиреБрдХрд╕рд╛рди рдореЗрдВ рд╣реВрдВ рдХрд┐ рдХрд┐рд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рдЪреБрдирдирд╛ рд╣реИред
рд▓реЗрдЦ рдХреЗ рд▓рд┐рдВрдХ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд-рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рджред
рд╡рд░реНрддрдорд╛рди рдореЗрдВ, рдЖрдкрдиреЗ рдХрд┐рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиреЛрдВ рдкрд░ рд╕рдордЭреМрддрд╛ рдХрд┐рдпрд╛ рд╣реИ?
рдХреНрдпрд╛ рдЖрдкрдХреЛ рдЕрдЧрд▓реЗ v9.3+ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡реНрдпрд╛рдкрдХ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдЙрджрд╛рд╣рд░рдг рдорд┐рд▓рд╛ рд╣реИ?

Auth0 рдХрд╛ рдирдпрд╛ рдХреБрдХреА рдЖрдзрд╛рд░рд┐рдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рджреЗрдЦрдиреЗ рд▓рд╛рдпрдХ рд╣реИ
(рдмреЗрд╢рдХ рдпрд╣ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкрд╣рдЪрд╛рди рдкреНрд░рджрд╛рддрд╛ рдХреЗ рд▓рд┐рдП рд╣реИ, рд▓реЗрдХрд┐рди рджреГрд╖реНрдЯрд┐рдХреЛрдг рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ)
https://github.com/auth0/nextjs-auth0

  • рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдЪреНрдЫрд╛ рд╣реИ рдХрд┐ рдЖрдк рдиреЗрдХреНрд╕реНрдЯрдЬ рдХреЗ рдПрдкреАрдЖрдИ рдорд╛рд░реНрдЧреЛрдВ (рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдПрдХ рдЧрддрд┐рд╢реАрд▓ рдорд╛рд░реНрдЧ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ) рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдкреАрдЖрдИ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ "рдкреНрд░реЙрдХреНрд╕реА" рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
  • рдлрд┐рд░ рдЖрдкрдХреЛ рдХреНрд▓рд╛рдЗрдВрдЯ рд╕рд╛рдЗрдб рдкрд░ рдПрдХреНрд╕реЗрд╕ рдЯреЛрдХрди рдЖрджрд┐ рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ (рдХреНрдпреЛрдВрдХрд┐ рдиреЗрдХреНрд╕реНрдЯрдЬ рдПрдкреАрдЖрдИ рд░реВрдЯ рдХреЗрд╡рд▓ рд╕рд░реНрд╡рд░ рд╕рд╛рдЗрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВ), рд╕рд░реНрд╡рд░ рд╕рд╛рдЗрдб рдПрдХ рдЧреБрдкреНрдд рдХреЗ рд╕рд╛рде auth0 рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдФрд░ рдХреБрдХреА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХреНрд╕реЗрд╕ рдЯреЛрдХрди рдЖрджрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред
  • рдЖрдкрдХрд╛ рдХреНрд▓рд╛рдЗрдВрдЯ рд╕рд╛рдЗрдб рдХреЛрдб рдЖрдкрдХреЗ рдиреЗрдХреНрд╕реНрдЯрдЬ рдПрдкреАрдЖрдИ рдорд╛рд░реНрдЧреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдЧрд╛, рдФрд░ рдПрдкреАрдЖрдИ рдорд╛рд░реНрдЧ рддрдм рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдПрдкреАрдЖрдИ рдЕрдиреБрд░реЛрдз рдХрд░реЗрдЧрд╛

рдзреНрдпрд╛рди рд░рдЦреЗрдВ рдХрд┐ рд╡реЗ рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд░реАрдбрдореА рдореЗрдВ "рдкреНрд░рдпреЛрдЧрд╛рддреНрдордХ" рд╣реИ

Auth0 рдХрд╛ рдирдпрд╛ рдХреБрдХреА рдЖрдзрд╛рд░рд┐рдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рджреЗрдЦрдиреЗ рд▓рд╛рдпрдХ рд╣реИ
(рдмреЗрд╢рдХ рдпрд╣ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкрд╣рдЪрд╛рди рдкреНрд░рджрд╛рддрд╛ рдХреЗ рд▓рд┐рдП рд╣реИ, рд▓реЗрдХрд┐рди рджреГрд╖реНрдЯрд┐рдХреЛрдг рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ)
https://github.com/auth0/nextjs-auth0

  • рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдЪреНрдЫрд╛ рд╣реИ рдХрд┐ рдЖрдк рдиреЗрдХреНрд╕реНрдЯрдЬ рдХреЗ рдПрдкреАрдЖрдИ рдорд╛рд░реНрдЧреЛрдВ (рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдПрдХ рдЧрддрд┐рд╢реАрд▓ рдорд╛рд░реНрдЧ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ) рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдкреАрдЖрдИ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ "рдкреНрд░реЙрдХреНрд╕реА" рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
  • рдлрд┐рд░ рдЖрдкрдХреЛ рдХреНрд▓рд╛рдЗрдВрдЯ рд╕рд╛рдЗрдб рдкрд░ рдПрдХреНрд╕реЗрд╕ рдЯреЛрдХрди рдЖрджрд┐ рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ (рдХреНрдпреЛрдВрдХрд┐ рдиреЗрдХреНрд╕реНрдЯрдЬ рдПрдкреАрдЖрдИ рд░реВрдЯ рдХреЗрд╡рд▓ рд╕рд░реНрд╡рд░ рд╕рд╛рдЗрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВ), рд╕рд░реНрд╡рд░ рд╕рд╛рдЗрдб рдПрдХ рдЧреБрдкреНрдд рдХреЗ рд╕рд╛рде auth0 рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдФрд░ рдХреБрдХреА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХреНрд╕реЗрд╕ рдЯреЛрдХрди рдЖрджрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред
  • рдЖрдкрдХрд╛ рдХреНрд▓рд╛рдЗрдВрдЯ рд╕рд╛рдЗрдб рдХреЛрдб рдЖрдкрдХреЗ рдиреЗрдХреНрд╕реНрдЯрдЬ рдПрдкреАрдЖрдИ рдорд╛рд░реНрдЧреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдЧрд╛, рдФрд░ рдПрдкреАрдЖрдИ рдорд╛рд░реНрдЧ рддрдм рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдПрдкреАрдЖрдИ рдЕрдиреБрд░реЛрдз рдХрд░реЗрдЧрд╛

рдзреНрдпрд╛рди рд░рдЦреЗрдВ рдХрд┐ рд╡реЗ рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд░реАрдбрдореА рдореЗрдВ "рдкреНрд░рдпреЛрдЧрд╛рддреНрдордХ" рд╣реИ

рдпрд╣ рд▓реЗрдЦ рдмрд╣реБрдд рдорджрджрдЧрд╛рд░ рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред
https://auth0.com/blog/ultimate-guide-nextjs-authentication-auth0/

рдПрдкреАрдЖрдИ рдорд╛рд░реНрдЧреЛрдВ рдХреЛ рдкреНрд░реЙрдХреНрд╕реА рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛, рдПрдкреАрдЖрдИ рдорд╛рд░реНрдЧреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓реЙрдЧрд┐рди/рд▓реЙрдЧрдЖрдЙрдЯ рдХрд░рдирд╛, рдПрдкреАрдЖрдИ рд╕реЗ рдЯреЛрдХрди рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛, рдЗрд╕реЗ рдПрдЪрдЯреАрдкреАрдУрдирд▓реА рдХреБрдХреА рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЗрдЯ рдХрд░рдирд╛ рдПрдХ рдареЛрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реИ рдЬреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИред
рдПрдХ рдЪрд┐рдВрддрд╛ рд╕реАрдПрд╕рдЖрд░рдПрдл рд╣реЛ рд╕рдХрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк рдЖрд╕рд╛рдиреА рд╕реЗ csrf npm рдкреИрдХреЗрдЬ рдХреЗ рд╕рд╛рде рдХреБрдЫ рд╕рдорд╛рдзрд╛рди рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ ( csurf , рд▓реЗрдХрд┐рди рд╡рд╣ рднреА рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ)ред

@onderonur , auth0 рд▓реЗрдЦ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред
рдЕрд░реНрдерд╛рддреН, рд╡рд░реНрддрдорд╛рди рдореЗрдВ next.js рдХреЗ рд╕рд╛рде рд╢реБрджреНрдз jwt рдкрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдПрдХ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдпрд╛ рдХрдо рд╕реЗ рдХрдо рдиреНрдпреВрдирддрдо рдЙрджрд╛рд╣рд░рдг рд╣реИ?
рдореИрдВ рдХреБрдХреАрдЬрд╝ рдХреЗ рд╕рд╛рде рдПрдХ рдЙрдиреНрдирдд рдкрд░рдд рдирд╣реАрдВ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рд╕реАрдПрд╕рдЖрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ, рд╣рдордиреЗ рдмрд╕ рдЯреЛрдХрди рдХреЛ рд▓реЛрдХрд▓рд╕реНрдЯреЛрд░реЗрдЬ рдореЗрдВ рд╕реНрдЯреЛрд░ рдХрд┐рдпрд╛ рдФрд░ рдЕрдиреБрд░реЛрдз рдХреЗ рд╕рд╛рде рднреЗрдЬ рджрд┐рдпрд╛ред

@onderonur , auth0 рд▓реЗрдЦ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред
рдЕрд░реНрдерд╛рддреН, рд╡рд░реНрддрдорд╛рди рдореЗрдВ next.js рдХреЗ рд╕рд╛рде рд╢реБрджреНрдз jwt рдкрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдПрдХ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдпрд╛ рдХрдо рд╕реЗ рдХрдо рдиреНрдпреВрдирддрдо рдЙрджрд╛рд╣рд░рдг рд╣реИ?
рдореИрдВ рдХреБрдХреАрдЬрд╝ рдХреЗ рд╕рд╛рде рдПрдХ рдЙрдиреНрдирдд рдкрд░рдд рдирд╣реАрдВ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рд╕реАрдПрд╕рдЖрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ, рд╣рдордиреЗ рдмрд╕ рдЯреЛрдХрди рдХреЛ рд▓реЛрдХрд▓рд╕реНрдЯреЛрд░реЗрдЬ рдореЗрдВ рд╕реНрдЯреЛрд░ рдХрд┐рдпрд╛ рдФрд░ рдЕрдиреБрд░реЛрдз рдХреЗ рд╕рд╛рде рднреЗрдЬ рджрд┐рдпрд╛ред

рдореИрдВрдиреЗ рдЗрд╕ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдкрдиреЗ рд░реЗрдкреЛ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдпрд╣ рдЕрднреА рднреА рдорд╕реМрджреЗ рдореЗрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рд╕реНрд╡рдпрдВ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ :)
https://github.com/onderonur/post-gallery
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ "рдХреБрдХреА рдкрд░рдд" рдПрдХ рдЙрдиреНрдирдд рдЪреАрдЬ рдирд╣реАрдВ рд╣реИред /api/login рдПрдкреАрдЖрдИ рдорд╛рд░реНрдЧ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдмрд╕ рдЕрдкрдиреЗ рдПрдкреАрдЖрдИ рдХреЗ рд▓реЙрдЧрд┐рди рдПрдВрдбрдкреЙрдЗрдВрдЯ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВ рдФрд░ рдпрджрд┐ рдЕрдиреБрд░реЛрдз рд╕рдлрд▓ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдЯреЛрдХрди рдХреЛ httpOnly рдХреБрдХреА рдореЗрдВ рд╕реЗрдЯ рдХрд░реЗрдВред
рдЖрдк рдареАрдХ рдЙрд╕реА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдореЗрд░реЗ рд░реЗрдкреЛ рдХреА рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдПрдХ рдЕрдиреНрдп рд╡рд┐рдХрд▓реНрдк рд╣реИ (рдпрджрд┐ рдЖрдк рд╕реНрдерд╛рдиреАрдп рднрдВрдбрд╛рд░рдг рдореЗрдВ рдЯреЛрдХрди рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд╕рдорд╛рди рдкреНрд░рд╡рд╛рд╣ рдЪрд╛рд╣рддреЗ рд╣реИрдВ), рддреЛ рдЖрдк js-cookie npm рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрд▓рд╛рдЗрдВрдЯ-рд╕рд╛рдЗрдб рдЕрдиреБрд░реЛрдз рдХреЗ рд╕рд╛рде рдЕрдкрдиреЗ рд▓реЙрдЧрд┐рди рдПрдВрдбрдкреЙрдЗрдВрдЯ рдХреЛ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрджрд┐ рдпрд╣ рд╡рд╛рдкрд╕ рдЖрддрд╛ рд╣реИ рддреЛ рд╕рдорд╛рдкреНрдд рдХрд░реЗрдВ рдПрдХ рдЯреЛрдХрди, рдЗрд╕реЗ рдХреБрдХреА рдореЗрдВ рд╕реЗрдЯ рдХрд░реЗрдВред рдФрд░ рдЬрдм рдЖрдк рдЕрдиреБрд░реЛрдз рдХрд░рддреЗ рд╣реИрдВ (рдЕрдХреНрд╖реАрдп рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд░ рдЖрджрд┐ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ) рдХреБрдХреА рдорд╛рди рдкрдврд╝реЗрдВ рдФрд░ рдЕрдиреБрд░реЛрдз рд╢реАрд░реНрд╖рд▓реЗрдЦ рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕реЗ рдЕрдкрдиреЗ рдПрдкреАрдЖрдИ рдореЗрдВ рдкрд╛рд╕ рдХрд░реЗрдВред рдореИрдВрдиреЗ рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдмрд╣реБрдд рд╕рд╛рд░реЗ (рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдХреБрдЫ рд▓реЛрдХрдкреНрд░рд┐рдп) рдПрдкреНрд▓рд┐рдХреЗрд╢рди рджреЗрдЦреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдпрд╣ рдереЛрдбрд╝рд╛ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИред рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ httpOnly рдХреБрдХреАрдЬ рд╕реЗрдЯ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рддреЛ, рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЖрдкрдХреА рдЯреЛрдХрди рдХреБрдХреА рдХреЛ рдкрдврд╝рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдЧрд╛ред рдЗрд╕ рдкреНрд░рдХрд╛рд░, XSS рднреЗрджреНрдпрддрд╛ рд╣реЛрдЧреАред

рдЗрд╕рдХреА рд╕рд░рд╛рд╣рдирд╛ рдХрд░реЗрдВ рдХрд┐ рдпрд╣ рдПрдХ рдкреБрд░рд╛рдирд╛ рдзрд╛рдЧрд╛ рд╣реИ (рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдПрдХ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдЪрд▓рдиреЗ рд╡рд╛рд▓рд╛ рд╡рд┐рд╖рдп рд╣реИ) рд▓реЗрдХрд┐рди рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рдВрджрд░реНрдн рдпрд╛ рдЙрджрд╛рд╣рд░рдг рдХреА рддрд▓рд╛рд╢ рдХрд░рдиреЗ рд╡рд╛рд▓реЛрдВ рдХреЗ рд▓рд┐рдП, рд╣рдордиреЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ NextAuth.js v2 рдкрд░ рдХрд╛рдо рдХрд┐рдпрд╛ рд╣реИред рдореИрдВ рдЗрд╕рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдкреНрд▓рдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдЗрддрдирд╛ рдирд╣реАрдВ рдХрд░рддрд╛ - рдпрд╣ рдПрдХ рдУрдкрди рд╕реЛрд░реНрд╕ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╣реИ рдФрд░ рд▓реЛрдЧреЛрдВ рдХреЗ рдПрдХ рд╕рдореВрд╣ рдиреЗ рдЗрд╕рдореЗрдВ рдорджрдж рдХреА рд╣реИ - рд▓реЗрдХрд┐рди рдпрд╣ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИ рдФрд░ рдХреЛрдб рдФрд░ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд▓реЛрдЧреЛрдВ рдХреЗ рд╕рдВрджрд░реНрдн рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдХреБрдЫ рдкреГрд╖реНрдарднреВрдорд┐ рдХреЗ рд▓рд┐рдП, рдЬреИрд╕реЗ рдиреЗрдХреНрд╕реНрдЯрдЕрде v1, рдпрд╣ рдХреЗрд╡рд▓ рд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд, рдкреНрд░реАрдлрд╝рд┐рдХреНрд╕реНрдб рдФрд░ рдПрдЪрдЯреАрдЯреАрдкреА рдХреБрдХреАрдЬрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдХреНрд▓рд╛рдЗрдВрдЯ рд╕рд╛рдЗрдб рдЯреЛрдХрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рд╕реБрд░рдХреНрд╖рд╛ рдиреБрдХрд╕рд╛рди рд╕реЗ рдмрдЪрддрд╛ рд╣реИред

NextAuth.js v2 Apple, Google, Facebook, Twitter, GitHub, Auth0, Okta, Slack, Discord рдФрд░ рдЕрдиреНрдп OAuth рдкреНрд░рджрд╛рддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рд╕рд╛рдЗрди рдЗрди рдХрд░рдиреЗ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ (рдпрд╣ 1.x рдФрд░ 2.x рджреЛрдиреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ)ред рдЖрдк рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ MySQL, MariaDB, Postgres, MongoDB рдХреЗ рд╕рд╛рде рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - рдпрд╛ рдХреЛрдИ рдбреЗрдЯрд╛рдмреЗрд╕ рдирд╣реАрдВ (100% рд╕рд░реНрд╡рд░ рд░рд╣рд┐рдд рд╕рдорд╛рдзрд╛рди рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ OAuth рдФрд░ JSON рд╡реЗрдм рдЯреЛрдХрди)ред

рдЙрдкрдпреЛрдЧ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ, session() рдирд╛рдордХ рдПрдХ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рд╕реНрдерд┐рд░ рд╡рд┐рдзрд┐ рд╣реИ рдФрд░ useSession() рдирд╛рдордХ рдПрдХ рд░рд┐рдПрдХреНрдЯ рд╣реБрдХ рдЬрд┐рд╕реЗ рдЖрдк рдШрдЯрдХ рдХреНрд▓рд╛рдЗрдВрдЯ рд╕рд╛рдЗрдб рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

import { useSession } from 'next-auth/client'

export default () => {
  const [session, loading] = useSession()

  return <>
    {!loading && session && <p>Signed in as {session.user.name || session.user.email}.</p>}
    {!loading && !session && <p><a href="/api/auth/signin">Sign in here</a></p>}
  </>
}

рдпрд╣ Next.js 9.x рдФрд░ Serverless рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдореЗрдВ Express рдпрд╛ PassportJS рдЬреИрд╕реА рдирд┐рд░реНрднрд░рддрд╛рдПрдБ рдирд╣реАрдВ рд╣реИрдВред рдЗрд╕рдореЗрдВ рдПрдХ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдкреНрд░рджрд╛рддрд╛ рд╢рд╛рдорд┐рд▓ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЖрдк _app.js рд╕рднреА рдкреГрд╖реНрдареЛрдВ рдкрд░ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ; рдпрд╣ рдХреНрд▓рд╛рдЗрдВрдЯ рдФрд░ рд╕рд░реНрд╡рд░ рд╕рд╛рдЗрдб рд░реЗрдВрдбрд░рд┐рдВрдЧ рджреЛрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП, next-auth.js.org рджреЗрдЦреЗрдВ рдпрд╛ NPM рдкрд░ auth@beta рджреЗрдЦреЗрдВ ред

рдпрд╣ рдЕрднреА рднреА рдПрдХ рдХрд╛рд░реНрдп рдкреНрд░рдЧрддрд┐ рдкрд░ рд╣реИ - рд╣рдо рдЕрднреА рднреА рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдФрд░ рдЗрд╡реЗрдВрдЯ рдореЙрдбрд▓ рдХреЛ рдкреЙрд▓рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ - ~ тАЛтАЛрдЬреВрди рдХреЗ рдордзреНрдп рдХреА рд▓рдХреНрд╖реНрдп рд░рд┐рд▓реАрдЬ рдХреА рддрд╛рд░реАрдЦ рдХреЗ рд╕рд╛рдеред

рдЗрд╕рдХреА рд╕рд░рд╛рд╣рдирд╛ рдХрд░реЗрдВ рдХрд┐ рдпрд╣ рдПрдХ рдкреБрд░рд╛рдирд╛ рдзрд╛рдЧрд╛ рд╣реИ (рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдПрдХ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдЪрд▓рдиреЗ рд╡рд╛рд▓рд╛ рд╡рд┐рд╖рдп рд╣реИ) рд▓реЗрдХрд┐рди рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рдВрджрд░реНрдн рдпрд╛ рдЙрджрд╛рд╣рд░рдг рдХреА рддрд▓рд╛рд╢ рдХрд░рдиреЗ рд╡рд╛рд▓реЛрдВ рдХреЗ рд▓рд┐рдП, рд╣рдордиреЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ NextAuth.js v2 рдкрд░ рдХрд╛рдо рдХрд┐рдпрд╛ рд╣реИред рдореИрдВ рдЗрд╕рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдкреНрд▓рдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдЗрддрдирд╛ рдирд╣реАрдВ рдХрд░рддрд╛ - рдпрд╣ рдПрдХ рдУрдкрди рд╕реЛрд░реНрд╕ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╣реИ рдФрд░ рд▓реЛрдЧреЛрдВ рдХреЗ рдПрдХ рд╕рдореВрд╣ рдиреЗ рдЗрд╕рдореЗрдВ рдорджрдж рдХреА рд╣реИ - рд▓реЗрдХрд┐рди рдпрд╣ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИ рдФрд░ рдХреЛрдб рдФрд░ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд▓реЛрдЧреЛрдВ рдХреЗ рд╕рдВрджрд░реНрдн рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдХреБрдЫ рдкреГрд╖реНрдарднреВрдорд┐ рдХреЗ рд▓рд┐рдП, рдЬреИрд╕реЗ рдиреЗрдХреНрд╕реНрдЯрдЕрде v1, рдпрд╣ рдХреЗрд╡рд▓ рд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд, рдкреНрд░реАрдлрд╝рд┐рдХреНрд╕реНрдб рдФрд░ рдПрдЪрдЯреАрдЯреАрдкреА рдХреБрдХреАрдЬрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдХреНрд▓рд╛рдЗрдВрдЯ рд╕рд╛рдЗрдб рдЯреЛрдХрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рд╕реБрд░рдХреНрд╖рд╛ рдиреБрдХрд╕рд╛рди рд╕реЗ рдмрдЪрддрд╛ рд╣реИред

NextAuth.js v2 Apple, Google, Facebook, Twitter, GitHub, Auth0, Okta, Slack, Discord рдФрд░ рдЕрдиреНрдп OAuth рдкреНрд░рджрд╛рддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рд╕рд╛рдЗрди рдЗрди рдХрд░рдиреЗ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ (рдпрд╣ 1.x рдФрд░ 2.x рджреЛрдиреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ)ред рдЖрдк рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ MySQL, MariaDB, Postgres, MongoDB рдХреЗ рд╕рд╛рде рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - рдпрд╛ рдХреЛрдИ рдбреЗрдЯрд╛рдмреЗрд╕ рдирд╣реАрдВ (100% рд╕рд░реНрд╡рд░ рд░рд╣рд┐рдд рд╕рдорд╛рдзрд╛рди рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ OAuth рдФрд░ JSON рд╡реЗрдм рдЯреЛрдХрди)ред

рдЙрдкрдпреЛрдЧ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ, session() рдирд╛рдордХ рдПрдХ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рд╕реНрдерд┐рд░ рд╡рд┐рдзрд┐ рд╣реИ рдФрд░ useSession() рдирд╛рдордХ рдПрдХ рд░рд┐рдПрдХреНрдЯ рд╣реБрдХ рдЬрд┐рд╕реЗ рдЖрдк рдШрдЯрдХ рдХреНрд▓рд╛рдЗрдВрдЯ рд╕рд╛рдЗрдб рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

import { useSession } from 'next-auth/client'

export default () => {
  const [session, loading] = useSession()

  return <>
    {!loading && session && <p>Signed in as {session.user.name || session.user.email}.</p>}
    {!loading && !session && <p><a href="/api/auth/signin">Sign in here</a></p>}
  </>
}

рдпрд╣ Next.js 9.x рдФрд░ Serverless рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдореЗрдВ Express рдпрд╛ PassportJS рдЬреИрд╕реА рдирд┐рд░реНрднрд░рддрд╛рдПрдБ рдирд╣реАрдВ рд╣реИрдВред рдЗрд╕рдореЗрдВ рдПрдХ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдкреНрд░рджрд╛рддрд╛ рд╢рд╛рдорд┐рд▓ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЖрдк _app.js рд╕рднреА рдкреГрд╖реНрдареЛрдВ рдкрд░ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ; рдпрд╣ рдХреНрд▓рд╛рдЗрдВрдЯ рдФрд░ рд╕рд░реНрд╡рд░ рд╕рд╛рдЗрдб рд░реЗрдВрдбрд░рд┐рдВрдЧ рджреЛрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП, next-auth.js.org рджреЗрдЦреЗрдВ рдпрд╛ NPM рдкрд░ auth@beta рджреЗрдЦреЗрдВ ред

рдпрд╣ рдЕрднреА рднреА рдПрдХ рдХрд╛рд░реНрдп рдкреНрд░рдЧрддрд┐ рдкрд░ рд╣реИ - рд╣рдо рдЕрднреА рднреА рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдФрд░ рдЗрд╡реЗрдВрдЯ рдореЙрдбрд▓ рдХреЛ рдкреЙрд▓рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ - ~ тАЛтАЛрдЬреВрди рдХреЗ рдордзреНрдп рдХреА рд▓рдХреНрд╖реНрдп рд░рд┐рд▓реАрдЬ рдХреА рддрд╛рд░реАрдЦ рдХреЗ рд╕рд╛рдеред

рдмрдврд╝рд┐рдпрд╛ рдХрд╛рдо рдпрд╣!
рдХреНрдпрд╛ рдЗрд╕рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдЕрдХреЗрд▓реЗ рдХреНрд▓рд╛рдЗрдВрдЯ рд╕рд╛рдЗрдб рдкрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ? рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореЗрд░реЗ рдкрд╛рд╕ рд░реЗрд▓ рдПрдкреАрдЖрдИ рдРрдк рд╣реИ - рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рд╕рд╛рдЗрдб рдХреЗ рд▓рд┐рдП рдЕрдЧрд▓реЗ рдЬреЗрдПрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

pie6k picture pie6k  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

knipferrc picture knipferrc  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

kenji4569 picture kenji4569  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

flybayer picture flybayer  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

olifante picture olifante  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ