在我们的团队中,我们使用gitlab(
https://git.example)和捆绑的多数聊天(
https://chat.example).
最重要的是,我们想要一个专门的bot用户(网络钩子有限制,私人频道等),其实际上是像普通用户一样登录.
我们在gitlab中创建了该用户,并且可以通过chrome登录到我们的聊天(聊天登录redir – > gitlab oauth,输入用户名和pw – > redir回到聊天 – > authed).
现在我搜索了实际可以做到这一点的python库,但是我只能找到需要一个client_id和client_secret的一些…从我的理解(请纠正我,如果我错了)这不是我们正在寻找,因为我们不想通过gitlab创建另一个应用程序,而是通过gitlab登录到我们的聊天(已经有一个id(已知)和一个秘密(未知))作为用户.
由于我们找不到这样一个lib,我们还检查了chrome中的网络请求,并尝试通过请求在python中重新创建它,但不能让它工作(不用说,它涉及解析html和csrf令牌) …
再次尝试和很多猜测,我们尝试通过手动获取access_token
client_id = 'the one of mattermost in our gitlab'
user = 'username'
pw = 'password'
r = requests.post(
'https://git.example/oauth/token',
data={
"grant_type": "password",
"username": user,
"password": pw,
"client_id": client_id,
}
)
access_token = r.json()['access_token']
这似乎工作(令牌看起来不错),但是在最重要的API中使用它只会导致401:
ri = requests.get(
'https://chat.example/api/v1/users/me',
headers={'Authorization': 'Bearer ' + access_token}
)
ri.status_code, ri.json()
(401,
{u'detailed_error': u'token=...xxx...',
u'id': u'api.context.session_expired.app_error',
u'is_oauth': False,
u'message': u'Invalid or expired session, please login again.',
u'request_id': u'...yyy...',
u'status_code': 401})