如何通过oauth2管理多个Google帐户

时间:2014-09-24 21:04:39

标签: python django oauth-2.0 google-api youtube-api

在我的网络应用中,用户可以与他们的YouTube帐户建立联系,以便他们可以访问他们的视频上传并通过网络应用与他们互动。这适用于单个YouTube帐户。我正在努力解决如何在不在我的网站上创建多个帐户的情况下允许用户关联多个YouTube帐户的问题。

谷歌的API支持吗?

以下是我尝试做的事情(使用Python和Django)...将其删除以便更容易管理。基本上,我不能让谷歌重新启动并要求新的授权...它似乎只知道用户是谁并做出回应。任何方向的任何帮助都表示赞赏。

# models.py
class YouTubeAccount(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL)
    google_plus_id = models.CharField(max_length=50, editable=False, null=True)
    display_name = models.CharField(max_length=255, null=True)

class FlowModel(models.Model):
    id = models.ForeignKey(YouTubeAccount, primary_key=True)
    flow = FlowField()

class CredentialsModel(models.Model):
    id = models.ForeignKey(YouTubeAccount, primary_key=True)
    credential = CredentialsField()

然后在添加帐户的视图中:

@login_required
def add_account(request):
    yt_acct = YouTubeAccount.objects.create(user=request.user)
    yt_acct.save()

    # i thought maybe I use the yt_account as my flow state
    FLOW.params['state'] = xsrfutil.generate_token(settings.SECRET_KEY, yt_acct)
    authorize_url = FLOW.step1_get_authorize_url()
    return HttpResponseRedirect(authorize_url)

@login_required
def return_authorization(request):

    yt_acct = YouTubeAccount.objects.get(user=request.user, google_plus_id__isnull=True, display_name__isnull=True)

    if not xsrfutil.validate_token(settings.SECRET_KEY,
                                    request.REQUEST['state'],
                                    yt_acct):
        return  HttpResponseBadRequest()

    credential = FLOW.step2_exchange(request.REQUEST)

    http = httplib2.Http()
    http = credential.authorize(http)

1 个答案:

答案 0 :(得分:1)

是的,他们会在进行身份验证时选择要使用的帐户,或者他们只能分配默认帐户。 以下是更多信息:http://apiblog.youtube.com/2013/06/google-page-identities-and-youtube-api.html

但是,如果您要求一个用户拥有多个Google帐户,那么您可以要求他们再次通过OAuth。在每个操作中,您只能使用一个用户OAuth,因此,对于每个帐户,应重复所有aPI调用。这是使用客户端库的PHP示例。在这些中你可以简单地存储到多个json文件等中,让它们尽可能多地通过OAuth。 https://github.com/youtube/api-samples/tree/master/python