1

Flask-Authlib で Gmail API を使用してメールにアクセスしようとしています。ユーザーの承認後、サーバーはアクセストークンをセッションに配置し、反応ルートに誘導し/testます。によって呼び出された反応コンポーネントでは、電子メール情報のバックエンドの別のメソッドにリクエストを/test送信しますGETが、セッションの有効期間を十分に長く設定しても、アクセス トークンはもう存在しません。

フローは次のようになります: ログイン -> 承認済み (フロントエンドに戻る) -> バックエンドに Get リクエストを送信します/index

どんな助けでも大歓迎です。

サーバ:

@app.route('/index')
def index():
    print(get_access_token())  # does not work
    if 'access_token' in session:
        me = gmail.get('userinfo')
        user_id = me.data['id']
        access_token = get_access_token()
        start = time.time()
        inbox = Inbox(gmail, access_token, user_id)
        emails = inbox.emails
        end = time.time()
        return jsonify({
            "emails": emails,
            'me': user_id,
            'count': len(emails),
            'time': end - start,
            'request time': inbox.request_time
        })
    return jsonify({
        'status': 403,
        'session': session.get('access_token')
    })


@app.route('/login')
def login():
    return gmail.authorize(callback=url_for('authorized', _external=True))


@app.route('/logout')
def logout():
    session.pop('access_token', None)
    return redirect(url_for('index'))


@app.route('/authorized')
def authorized():
    resp = gmail.authorized_response()
    if resp is None:
        return 'Access denied: reason={} error={}'.format(
            request.args['error_reason'],
            request.args['error_description']
        )
    session['access_token'] = (resp['access_token'], '')
    print(get_access_token())  # works
    return redirect('test')


@gmail.tokengetter
def get_access_token():
    return session.get('access_token')

クライアント:

const Test = React.createClass({

  componentDidMount() {
    fetch('/index')
    .then(response => {
      return response.json()
    })
    .then(json => {
      console.log(json)
    })
    .catch(ex => {
      console.log(ex)
    })
  },
  render() {
    return (
      <div>
        tsetdsfadsf
      </div>
    )
  }
})

render((
  <Router history={history}>
    <Route component={App}>
      <Route path="/" component={Index} />
      <Route path="/test" component={Test} />
    </Route>
  </Router>
), document.getElementById('content'))
4

1 に答える 1

2

これfetchは、@see:警告セクションを使用しているためです。

デフォルトでは、フェッチはサーバーに Cookie を送信しないため、サイトがユーザー セッションの維持に依存している場合、認証されていないリクエストが発生します。

于 2015-12-25T05:53:08.650 に答える