Я следую этому руководству, предоставленному чатом Google, для проверки подлинности моего приложения django. https://developers.google.com/hangouts/chat/how-tos/auth-3p
Как запустить oauth-процесс и как мои аргументы url configCompleteRedirect могут быть сохранены в коде бота?
Я пытался реализовать использование возврата кода из моего приложения, но когда я возвращаюсь к URL-адресу, предоставленному событием, он закрывается, и процесс возвращается. Я не уверен, как идти вперед.
Это мой код со страницы скрипта приложения Google для бота
var RESPONSE_TYPE = 'code';
var client_id = 'OCauEBdxUEXGncRB1WGP9eOeEREPDnwPoKwGgESB';
var client_secret = '8zsIv2wflcITDGXqgD7YKzTYf4fu2rPp73fi9VpqEntkluATGNL56BkDSh5licnUxufK6fU6FmZuhEsjVVUEjXsoFFly37zdptRogmRFCMLaCLMkYW2xvGhaOk5M3InE';
function getOAuthService() {
var client_id = 'OCauEBdxUEXGncRB1WGP9eOeEREPDnwPoKwGgESB';
var client_secret = '8zsIv2wflcITDGXqgD7YKzTYf4fu2rPp73fi9VpqEntkluATGNL56BkDSh5licnUxufK6fU6FmZuhEsjVVUEjXsoFFly37zdptRogmRFCMLaCLMkYW2xvGhaOk5M3InE';
var userProperties = PropertiesService.getUserProperties();
var rec = userProperties.getProperty("receiver")
var twOAuth = OAuth2.createService('TW CHAT')
.setAuthorizationBaseUrl('https://de4bda93.ngrok.io/oauth/gmail-addon/')
.setTokenUrl('https://de4bda93.ngrok.io/o/token/')
.setClientId(client_id)
.setClientSecret(client_secret)
.setCallbackFunction('authCallback')
.setPropertyStore(PropertiesService.getUserProperties())
.setCache(CacheService.getUserCache())
.setLock(LockService.getUserLock())
.setScope('read write')
.setParam('response_type', RESPONSE_TYPE)
.setParam('grant_type', 'authorization_code')
.setParam('login_email', rec)
.setParam('access_type', 'offline') // Requests offline access.
console.log(twOAuth);
return twOAuth;
}
function getStateToken(callbackFunction){
var stateToken = ScriptApp.newStateToken()
.withMethod(callbackFunction)
.withTimeout(120)
.createToken();
return stateToken;
}
function accessProtectedResource(url, method_opt, payload_opt, headers_opt) {
var service = getOAuthService();
var maybeAuthorized = service.hasAccess();
if (maybeAuthorized) {
var accessToken = service.getAccessToken();
var method = method_opt || 'get';
var headers = headers_opt || {};
headers['Authorization'] =
Utilities.formatString('Bearer %s', accessToken);
var options = {
'headers': headers,
'method' : method,
'muteHttpExceptions': true,
};
if(payload_opt){
options['content_type'] = 'application/json';
options['payload'] = payload_opt;
}
var resp = UrlFetchApp.fetch(url, options);
var code = resp.getResponseCode();
if (code >= 200 && code < 300) {
return resp;
} else if (code == 401 || code == 403) {
maybeAuthorized = false;
} else if(code == 400){
// console.info('validation')
return resp;
}else{
console.error("Backend server error (%s): %s", code.toString(),
resp.getContentText());
}
}
if (!maybeAuthorized) {
// CardService.newAuthorizationException()
// .setAuthorizationUrl(service.getAuthorizationUrl())
// .setResourceDisplayName("TeamWave Chat bot")
// .setCustomUiCallback("createTWAuthorizationUi")
// .throwException();
return {
"actionResponse": {
"type": "REQUEST_CONFIG",
"url": service.getAuthorizationUrl(),
}
};
}
}
function logRedirectUri() {
var service = getOAuthService();
// console.info(service.getRedirectUri());
}
/**
* Boilerplate code to determine if a request is authorized and returns
* a corresponding HTML message. When the user completes the OAuth2 flow
* on the service provider's website, this function is invoked from the
* service. In order for authorization to succeed you must make sure that
* the service knows how to call this function by setting the correct
* redirect URL.
*
* The redirect URL to enter is:
* https://script.google.com/macros/d/<Apps Script ID>/usercallback
*
* See the Apps Script OAuth2 Library documentation for more
* information:
* https://github.com/googlesamples/apps-script-oauth2#1-create-the-oauth2-service
*
* @param {Object} callbackRequest The request data received from the
* callback function. Pass it to the service's
* handleCallback() method to complete the
* authorization process.
* @returns {HtmlOutput} a success or denied HTML message to display to
* the user. Also sets a timer to close the window
* automatically.
*/
function authCallback(callbackRequest) {
console.log('line 119 auth');
var authorized = getOAuthService().handleCallback(callbackRequest);
if (authorized) {
return HtmlService.createHtmlOutput(
'Success! <script>setTimeout(function() { top.window.close() }, 1);</script>');
} else {
return HtmlService.createHtmlOutput('Denied');
}
}
/**
* Returns an array of cards that comprise the customized authorization
* prompt. Includes a button that opens the proper authorization link
* for a non-Google service.
*
* When creating the text button, using the
* setOnClose(CardService.OnClose.RELOAD_ADD_ON) function forces the add-on
* to refresh once the authorization flow completes.
*
* @returns {Card[]} The card representing the custom authorization prompt.
*/
/**
* Unauthorizes the non-Google service. This is useful for OAuth
* development/testing. Run this method (Run > resetOAuth in the script
* editor) to reset OAuth to re-prompt the user for OAuth.
*/
function resetOAuth() {
var revokeUrl = 'https://de4bda93.ngrok.io/o/revoke_token/';
var service = getOAuthService();
var accessToken = service.getAccessToken();
var data = {
'client_id': client_id,
'client_secret': client_secret,
'token': accessToken
};
var options = {
'method' : 'post',
'payload' : data
};
var response = UrlFetchApp.fetch(revokeUrl, options);
if(response.getResponseCode() >=200 && response.getResponseCode() <300){
getOAuthService().reset();
return true;
}else{
console.error("Cannot reset token");
return false;
}
}
Я использую эту библиотеку oauth для доступа к токенам, но она всегда возвращается не доступной. Пожалуйста, помогите.
https://github.com/gsuitedevs/apps-script-oauth2
Я ожидаю, что ссылка для аутентификации приведет нас к нашему приложению на странице django, где пользователь передает свои учетные данные, и после сохранения информации от пользователя и чата Google Hangouts мы перенаправим его на страницу чата, где выполняются все его запросы. с помощью токенов на предъявителя в наше приложение django