0

OAUTH API を使用して、ユーザーの Google カレンダーへのアクセスを確認しています。彼らは OAUTH を使用して私のシステムにログインするのではなく、私のサイトが彼らのデータにアクセスすることを受け入れるだけです。

問題は、ユーザーが Google アカウントからログアウトし、確認を押した後、強制的にセッションからログアウトされ、リンクを元に戻す方法がないことです。

これは、ブラウザー セッションで既に Google アカウントにログインしている場合に機能し、承認を押すと、適切なページにリダイレクトされます。

キャッシュ、Cookie が消去され、確認のために Google アカウントに再ログインする必要がある場合に、エラーを再現します。

セッション ID などを保存しようとしましたが、リクエスト パラメータに初期ビューと同じリクエスト データが含まれていないため、取得しようとしているデータに競合があります。

ユーザーは、資格情報モデルの標準 Django ライブラリを使用してログインします。

コード

FLOW = flow_from_clientsecrets(
    CLIENT_SECRETS,
    scope='https://www.googleapis.com/auth/calendar.readonly',
    redirect_uri='http://127.0.0.1:8000/oauth2callback')

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ' 認証検証を扱うメイン関数 '''''''''''''''''''''''''''''''''''''''' ''''''''

def index(request):
  current_user = User.objects.get(username=request.user.username)
  storage = Storage(CredentialsModel, 'id', current_user, 'credential')
  credential = storage.get()
  if credential is None or credential.invalid == True:
    FLOW.params['state'] = xsrfutil.generate_token(settings.SECRET_KEY,
                                                   request.user.id)
    authorize_url = FLOW.step1_get_authorize_url()
    return redirect(authorize_url)

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ''''''' 認証後、ユーザーはデータ関数を呼び出します'''

def auth_return(request):

    print("THE CURRENTLY REQUESTED USER IN THIS SESSION REQUEST IS %s"%(request.user.username))

    credential = FLOW.step2_exchange(request.REQUEST)
    try:
      current_user = User.objects.get(id=request.user.id)
    except:
        return HttpResponseRedirect("/login")

    storage = Storage(CredentialsModel, 'id', current_user, 'credential')
    storage.put(credential)
    return HttpResponseRedirect("/get_cal")
4

1 に答える 1

0

わかりました、これは私が思っていたよりも少し複雑でした。

現在ログインしているユーザー名の状態パラメーターを追加して、これを修正しました。

logged_in_username = request.user.username
user_data = {'var_test' : logged_in_username}
pass_param = urllib.urlencode(user_data)
FLOW.params['state']=pass_param
authorize_url = FLOW.step1_get_authorize_url()

これにより、Django contrib の User モデルを介して DB からユーザーをクエリできるようになりました。URL から状態変数を解析しました。

#Get the currently logged in username
user_variable_data = str(FLOW.params['state'])

#get rid of the var_test= preprended text data for parsing reasons
user_variable_data = user_variable_data[9:]

#Get that user from the database in the form of a user object
current_user = User.objects.get(username=user_variable_data)

次に、パスワードなしでユーザーを認証するカスタムバックエンド認証ファイルを作成して、奇妙なことが何も起こらなかったようにリクエストを維持しました。

user = authenticate(username=user_variable_data)
login(request, user)
print("AUTHENTICATED")

これを設定ファイルに追加しました

AUTHENTICATION_BACKENDS = (
    'django.contrib.auth.backends.ModelBackend',
    'procrastinate.auth_backend.PasswordlessAuthBackend',
)

カスタム バックエンド ファイル

django.contrib.auth.backends からインポート ModelBackend django.contrib.auth.models からインポート ユーザー

class PasswordlessAuthBackend(ModelBackend): """パスワードを入力せずに Django にログインします。

"""
def authenticate(self, username=None):
    try:
        return User.objects.get(username=username)
    except User.DoesNotExist:
        return None

def get_user(self, user_id):
    try:
        return User.objects.get(pk=user_id)
    except User.DoesNotExist:
        return None
于 2015-12-24T02:49:10.703 に答える