2016-09-09 4 views
1

내 (Django) 앱을 사용하려면 사용자가 Google 계정을 사용하여 로그인해야합니다. 이 앱의 기능은 Gmail API를 통해 이메일을 보내는 것입니다.Google 로그인 및 Gmail에 로그인하기위한 자격 증명을 설정하는 방법

지금까지 로그인 (마지막 줄)에 사용되는 Web application 유형의 자격증 명을 설정했습니다.

enter image description here

다음은 단계는 위의 메시지는 제가 잘못된 자격 증명이 있는지 의심하게

2016-09-09 05:30:53,535 :Starting new HTTPS connection (1): accounts.google.com 
2016-09-09 05:30:53,779 :Starting new HTTPS connection (1): www.googleapis.com 

에서 중단 때문에 ('웹 응용 프로그램') 자격 증명을 작동하지 않는 이메일의 전송. 제 질문은 :

Google 콘솔에 두 세트의 자격 증명 (따라서 client_secret.json 개의 파일이 있음)을 설정해야하나요, 하나는 로그인 용이고 다른 하나는 Gmail API를 통해 이메일을 보내기위한 것입니까? 또는 몇 가지 불가사의 한 마법에 의한 로그인 및 Gmail-API 인증을 하나의 자격증 명으로 페이지합니까? 모든 정보가 많이 감사합니다.

+0

클라이언트 ID는이 API를 사용 섹션에서 사용 가능 한 모든 API에 액세스 할 수 있습니다. 사용자가 범위 이메일 (나는 그것이 하나 또는 gmail이라고 생각한다)로 인증하는 한 원하는만큼 많은 API에 대해 동일한 클라이언트 ID를 사용할 수 있습니다. 액세스 할 수있는 것을 결정하는 인증의 범위. 위의 메시지는 나에게 많은 것을 말하지 않습니다. 노래를 부를 YouTube 동영상을 볼 수 있습니다. – DaImTo

+0

@DaImTo 현재 내 정의 된 범위는 [' 'https://www.googleapis.com/auth/gmail.send''](https://developers.google.com)입니다./gmail/api/auth/scopes). 나는 "로그인"범위를 추가 할 수있는 곳을 보지 못했습니다 (이전 링크 참조). 그 youtube 비디오를 직접보고 싶습니다. 편집 : 흠, 어쩌면 [이] (https://developers.google.com/identity/protocols/googlescopes), 특히 Google 로그인에서'프로필'과'로그인'? –

+0

잠시 있었지만 로그인은 더 잘될 것이라고 생각합니다. https://developers.google.com/+/web/api/rest/oauth btw Gmail은 고통을 말하고 있습니다. 나는 여러분을 가리키고있는 비단뱀 사람이 아닙니다. 올바른 방향으로 – DaImTo

답변

1

Django에서 python-social-auth을 통해 추가 범위를 추가하는 것은 기본적으로는 아니지만 (two ways described here) 어렵지 않습니다. 첫 번째 옵션을 선택하고 get_scope 메소드를 덮어 썼습니다.

views.py, 나는

flow = client.flow_from_clientsecrets(
    CLIENT_SECRET_FILE, 
    scope=SOCIAL_AUTH_GOOGLE_OAUTH2_SCOPES, 
    redirect_uri='https://yourdomain.com/callbacklinkforgmail') 

을 설정하고 redirect_uri 구글 콘솔에서 리디렉션 된 URL과 일치해야합니다.

요청 권한은 어딘가에 저장된 자격 증명을 기반으로 수행됩니다. 내 경우에는 하나의 모델입니다.

이 단계를 수행
# model with variable/column 'credentials' 
storage = Storage(YourModel, 'id', request.user, 'credentials') 
      credential = storage.get() 
      if credential is None or credential.invalid is True: 
       flow.params['state'] = xsrfutil.generate_token(SOCIAL_AUTH_GOOGLE_OAUTH2_KEY, 
                   request.user) 
       authorize_url = flow.step1_get_authorize_url() 
       return HttpResponseRedirect(authorize_url) 
      else: 
       http = credential.authorize(httplib2.Http()) 
       service = discovery.build('gmail', 'v1', http=http) 

, 일치를 확인하는 기능에 redirect_uri 리디렉션. 제 경우에는 views.py입니다. 내 응용 프로그램의 urls.py에서

@login_required 
def auth_return(request): 
    if not xsrfutil.validate_token(SOCIAL_AUTH_GOOGLE_OAUTH2_KEY, request.GET['state'].encode('utf-8'), request.user): 
     return HttpResponseBadRequest() 

    credential = flow.step2_exchange(request.GET) 
    storage = Storage(YourModel, 'id', request.user, 'credentials') 
    storage.put(credential) 
    return HttpResponseRedirect("/") 

및 항목은

url(r'^callbacklinkforgmail/$', views.auth_return, name='mailsend') 
관련 문제