错误400:invalid_scope" https://www.googleapis.com/auth/chat.bot"

时间:2018-03-18 22:04:33

标签: oauth-2.0 google-oauth2 google-authentication hangouts-chat

新的Google环聊聊天文档说明您需要授权范围https://www.googleapis.com/auth/chat.bot执行任何操作。

这是错误:

enter image description here

使用OAuth2 client生成身份验证URL时,我收到范围无效的消息。如果我使用https://www.googleapis.com/auth/chat或其他类似google plus的范围,我就不会遇到这个问题。

当我尝试在API Explorer中点击内容时,网址或网址部分的任何组合都没有。

以下是我获取网址的代码,似乎对其他所有工作都很好:



import kivy
from kivy.app import App
from kivy.uix.screenmanager import Screen, ScreenManager 
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.button import Button
from kivy.uix.textinput import TextInput

class ScreenOne(Screen):

    def __init__ (self,**kwargs):

        super (ScreenOne, self).__init__(**kwargs)
        my_box1 = BoxLayout(orientation='vertical')
        my_button1 = Button(text="Next Screen ",size_hint_y=None,size_y=100)
        my_button1.bind(on_press=self.changer)     
        my_box1.add_widget(my_button1) 
        self.add_widget(my_box1)

    def changer(self,*args):
        self.manager.current = 'screen2'

class ScreenTwo(Screen):

    def __init__(self,**kwargs):
        super (ScreenTwo,self).__init__(**kwargs)


        layout = BoxLayout(orientation='vertical')       
        self.add_widget(layout)
        inpt = TextInput(text="Some text ",size_y=50)       
        layout.add_widget(inpt)

        my_button2 = Button(text="Print ")      
        my_button2.bind(on_press=self.click)      
        layout.add_widget(my_button2)

        Home_btn = Button(text="Back")                      
        Home_btn.bind(on_press=self.home)
        layout.add_widget(Home_btn)

    def click(self,my_button2):

        entered_value = self.inpt.text
        print entered_value


    def home(self,*args):
        self.manager.current = 'screen1'


class TestApp(App):

        def build(self):
            my_screenmanager = ScreenManager()
            screen1 = ScreenOne(name='screen1')
            screen2 = ScreenTwo(name='screen2')
            my_screenmanager.add_widget(screen1)
            my_screenmanager.add_widget(screen2)       
            return my_screenmanager

if __name__ == '__main__':
    TestApp().run()




2 个答案:

答案 0 :(得分:3)

如果其他人遇到这个问题,我想我已经想到了这一点。 Google似乎不需要域用户启用此身份验证范围,因为在您测试机器人时,它已在域上获得授权。这些范围的“授权”由域中的用户添加/删除空间中的机器人决定。

如果你感到困惑,我会详细介绍一下。

Cloud console image

当您在组织的控制台中创建机器人https://console.cloud.google.com/apis/api/chat.googleapis.com/时,您的机器人将添加到域中,并可由用户添加到空间中。如果然后转到凭据并创建服务帐户,则可以使用该json文件凭据作为机器人访问API。下面的代码获取了一个空间中的人员列表。

var { google } = require('googleapis');
var chat = google.chat("v1");

var key = require('./google_service-account-credentials.json');

var jwtClient = new google.auth.JWT(
  key.client_email,
  null,
  key.private_key,
  ['https://www.googleapis.com/auth/chat.bot'], // an array of auth scopes
  null
);

jwtClient.authorize(function (err, tokens) {
  chat.spaces.members.list({
    auth: jwtClient,
    parent: "spaces/AAAAD4xtKcE"
  }, function (err, resp) {
    console.log(resp.data);
  });
});

如果您尝试获取其他空间(和其他域)上的成员列表,则僵尸程序将失败并显示完全相同的错误消息:

“Bot不是该空间的成员。”

我假设如果你在市场上列出你的机器人并且它被添加到不同的域和空间谷歌的API确保你的机器人能够在空间的基础上做它想要做的事情。在已经添加机器人以完成其工作之后,必须设置一些认证流程将是令人讨厌的。这也可能是当前REST api不允许您在域下列出空间的原因,这不是此API工作的范例。

答案 1 :(得分:2)

可能与以下之一有关:

  1. 为服务帐户创建范围。确保使用服务帐户访问REST API。
  2. 确保将机器人添加到房间或空间,并且可以访问您想要的内容。
  3. 确保服务帐户是您用于bot的bot项目的一部分。