- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在开发用 Python 编写并使用 Endpoints API 的 Google App Engine 应用程序。同时,我正在编写一个 Chrome 扩展来与 Endpoints API 交互。我在 Endpoints API 和授权方面遇到了很多问题。目前,这是我的设置:
端点 API (Python)
from google.appengine.ext import endpoints
from protorpc import message_types
from protorpc import remote
ALLOWED_CLIENT_IDS = ['client_id_from_google_api_console',
endpoints.API_EXPLORER_CLIENT_ID]
@endpoints.api(name='my_api',version='v1', description='My API',
allowed_client_ids=ALLOWED_CLIENT_IDS)
class MyApi(remote.Service):
@endpoints.method(message_types.VoidMessage, DeviceListResponse,
name='user.device.list', path='user/device/list',
http_method='GET')
def user_device_list(self, request):
current_user = endpoints.get_current_user()
if current_user is None:
raise endpoints.UnauthorizedException('You must authenticate first.')
if current_user.user_id() is None:
raise endpoints.NotFoundException("Your user id was not found.")
return DeviceListResponse(devices=[]) #Hypothetically return devices
api_service = endpoints.api_server([MyApi], restricted=False)
var apiRoot = "https://my_app_id.appspot.com/_ah/api";
var clientID = "client_id_from_google_api_console";
var oauthScopes = ["https://www.googleapis.com/auth/userinfo.email"];
var responseType = "token id_token";
//Helper method to log to the console
function l(o){console.log(o);}
function oauthSignin(mode) {
gapi.auth.authorize({client_id: clientID, scope: oauthScopes,
immediate: mode, response_type: responseType}, function() {
var request = gapi.client.oauth2.userinfo.get();
request.execute(function(resp) {
authenticated = !resp.code;
if(authenticated) {
var token = gapi.auth.getToken();
token.access_token = token.id_token;
gapi.auth.setToken(token);
l("Successfully authenticated. Loading device list");
gapi.client.my_api.user.device.list({}).execute(function(resp) {
if(resp.code) {
l("Response from device list: " + resp.message);
}
l(resp);
});
}
});
});
}
//This get's called when the page and js library has loaded.
function jsClientLoad() {
l("JS Client Libary loaded. Now loading my_api and oauth2 APIs.");
var apisToLoad;
var callback = function() {
if (--apisToLoad == 0) {
l("APIs have loaded.")
oauthSignin(true);
} else {
l("Waiting for " + apisToLoad + " API" + (apisToLoad>1?"s":"") + " to load.");
}
}
apisToLoad = 2; // must match number of calls to gapi.client.load()
gapi.client.load('my_api', 'v1', callback, apiRoot);
gapi.client.load('oauth2', 'v2', callback);
}
最佳答案
目前尚不清楚为什么/何时会导致 200
;不应该。如 Function User.getUserId() in Cloud endpoint api returns null for a user object that is not null 中所述,这是一个 known issue .
TLDR;user_id
将 从不 填充在从 endpoints.get_current_user()
返回的结果中.存在一种解决方法:通过将用户对象存储在数据存储区中,然后检索它(使用新的 get,如果您使用的是 ndb
),则 user_id()
值将被填充。
您应该强烈考虑使用与帐户关联的 Google 个人资料 ID,而不是 App Engine 用户 ID。
历史/解释:endpoints
旨在与不记名 token 和 ID token (适用于 Android)一起使用。 ID token 是一种特殊类型的 JWT(JSON Web token ),与设备加密一起签名。因此,从这些 token 中解析用户只能确定该 token 中编码的信息(有关更多信息,请参阅 Cloud endpoints oauth2 error)。
由于这些 token 是由 App Engine 之外的通用 Google 身份验证提供程序 (OAuth 2.0) 生成的,因此该服务不知道/不共享 App Engine 用户 ID。结果是从不 可以填充 user_id()
当 ID token 用于签署请求时。
当使用标准的不记名 token (这对您的 Chrome 应用程序很好)时,App Engine OAuth API用来。当 OAuth API 调用时
oauth.get_current_user(some_scope)
oauth
是
google.appengine.api.oauth
),
oauth.oauth_api._maybe_call_get_oauth_user(_scope=None)
user_id()
返回用户的
威尔设置,但是,用户值不会保留在
endpoints.get_current_user
周围。 ,只有电子邮件和身份验证域。
oauth.get_current_user()
通话才贵
如果 它使RPC。
_maybe_call_get_oauth_user
方法存储上次调用的值,因此调用
oauth.get_current_user()
除了从 Python 中查找值的几纳秒之外,第二次不会产生网络/速度开销
dict
.
endpoints.get_current_user()
使用调用
oauth.get_current_user()
来确定 Bearer token 用户,因此如果您想再次调用它,您会担心该性能。
endpoints_user = endpoints.get_current_user()
if endpoints_user is None:
raise endpoints.UnauthorizedException(...)
oauth_user = oauth.get_current_user(known_scope)
if oauth_user is None or oauth_user.user_id() is None:
# This should never happen
raise endpoints.NotFoundException(...)
endpoints.get_current_user()
因为它始终确保我们的 token 仅针对我们允许的特定范围之一以及我们已列入白名单以与我们的应用程序对话的特定客户端 ID 之一类型转换。
known_scope
将根据您的哪个可能的范围与 token 匹配而有所不同。您的范围列表将在
endpoints.get_current_user()
之一中循环。
helper methods ,如果成功,最终匹配范围将存储为
os.getenv('OAUTH_LAST_SCOPE')
.我强烈建议将此值用于
known_scope
.
userinfo.email
之一与
userinfo
API 关联的范围:
https://www.googleapis.com/auth/plus.login
https://www.googleapis.com/auth/plus.me
https://www.googleapis.com/auth/userinfo.email
https://www.googleapis.com/auth/userinfo.profile
endpoints.get_current_user()
丢弃。 ,
但是 它适用于两种 token 。
get_google_plus_user_id()
method这是
appengine-picturesque-python
的一部分示例补丁之一
endpoints.get_current_user()
helper 方法来保留此数据并允许您使用此值,而无需重复用于验证请求中的 Bearer 或 ID token 的昂贵网络调用。
关于google-app-engine - Google Endpoints API + Chrome 扩展为 endpoints.get_current_user().user_id() 返回 None,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16661109/
我正在使用 winsock 和 C++ 来设置服务器应用程序。我遇到的问题是对 listen 的调用会导致第一次机会异常。我想通常这些可以忽略(?),但我发现其他人也有同样的问题,它导致应用程序偶尔挂
我对 Wireguard 的理解是服务器和客户端的接口(interface)(虽然看起来听不清?)每个都有自己的 .conf 文件。例如,考虑以下 .conf 文件。 [Interface] Priv
如何将多个实体从客户端传递到 Google Cloud Endpoint? 例如,传递单个实体很容易在服务器的 Endpoint api 源文件中完成: public class SomeEndpoi
我试图建立一个路径来将文件从一个目录复制到另一个目录。但不是使用:从(文件://源目录)到(文件://目标目录)我想做这样的事情: from(direct:start) .to(direct:do
我有一个非常小的网站,在 Azure 上以共享托管配置运行。我上面有一堆涉及打开套接字的网络代码,所有这些代码都成功运行。 我编写了一些发送 ping 的代码,但抛出了 PingException,内
我试图了解如何将 Cloud Endpoints 与自定义身份验证结合使用。从文档中我了解到它从 securityDefinitions 开始: securityDefinitions: yo
我在理解有关此文档的过程中遇到了一些麻烦。位于 ... https://developers.google.com/appengine/docs/java/endpoints/consume_js 具
我一直在尝试在生成的 Endpoint 类中创建一些新方法,但发现了这种奇怪的行为:我可以向生成的类添加一个方法,但我无法添加其中两个方法,无论我选择这两个方法中的哪一个添加。这是我生成的类的代码,我
azure 中的“输入端点”和“内部端点”是什么?如何创建新的“输入端点”? &如何将数据发送到“输入端点”? 输入端点端口 65400 端口是什么? 最佳答案 输入端点是云服务和 Internet
首先,对您可能犯的语法错误表示歉意。我的英语不是很好。 我是 Spring 新手,我正在尝试创建基本身份验证安全性。 我正在尝试配置一个端点具有公共(public)访问权限,而其他端点则具有用户访问权
我试图让图标部分包含我自己的图标,而不是通过尝试猴子补丁 ApiConfigGenerator.get_descriptor_defaults 来谷歌搜索图标。不幸的是,当发现文档完成时,这些将被忽略
我正在尝试跟随初学者到 WCF 页面上的演示视频 MSDN . 第一个视频或多或少地工作得很好。我现在接近第二个视频的结尾。我使用的是 VS2010/.NET 4.0,而视频似乎使用的是 VS2008
这个问题完全来自我在这里问过(并得到回答)的相关问题:Error when trying to retrieve a single entity 据我了解,要使用已提供的辅助方法以外的属性(例如 'i
WSL1 没有问题。我想升级到 WSL 2。 当我尝试升级到 wsl2 时,命令行失败。我试图删除 Ubuntu 并重新安装它,没有区别。 虚拟机平台处于事件状态。 Windows 内部版本号:190
我有一个代理lambda函数的AWS api。我目前使用不同的端点和单独的 lambda 函数: api.com/getData --> getData api.com/addData --> add
我正在构建一个 Chrome 应用,我真的希望它能够通过云端点与我的服务器进行通信,但有两个问题我不确定如何克服: Google apis javascript 库是一个外部脚本,我无法在 Chrom
我正在我的 gke 集群上运行 kubernetes 1.9.4 我有两个 pod,gate,它正在尝试连接到 coolapp,它们都是用 elixir 编写的 我正在使用libcluster连接我的
阅读Where to place the Asynctask in the Application和 http://android-developers.blogspot.com/2009/05/pa
我不清楚 @Named 在 Google Cloud Endpoints 中的用途。文档说: This annotation indicates the name of the parameter i
我正在关注 Getting Started guide对于使用 Maven 的 Java 中的 Google Cloud Endpoints,我无法使用 API Explorer 访问我的端点。 尽管
我是一名优秀的程序员,十分优秀!