这是在2013年12月16日通过https://www.facebook.com/whitehat/report/向Facebook报道的,Facebook 于12月17日回复说该错误早已得到修复.
我用我的Facebook帐户重新测试了这个(我还没有验证电子邮件地址),使用Grap API Explorer工具时,无法使用Graph API或使用FQL查询获取此帐户的电子邮件地址.
结论:使用Graph API或FQL查询从Facebook获得的电子邮件地址是经过验证的电子邮件.如果某个帐户尚未验证其电子邮件,则无法获得该帐户.
我正在制作一个带有SSO的网络应用程序,用户可以通过Google或Facebook登录.我希望拥有这两种类型帐户的用户在我的系统中显示为同一用户,无论他们使用哪种身份登录.为了实现这一点,我正在考虑使用电子邮件地址作为标识符来了解我是否应该创建一个新帐户或者用户是否已经存在.
为了不引入任何安全问题,我必须知道电子邮件地址已经过验证,并且实际上属于用户.对于Google,userinfo API可以告诉我电子邮件是否已经过验证,因此这里没有问题.但我在Facebook Graph API中找不到这样的东西.
是否有可能知道Facebook上是否确认了电子邮件地址?
我知道有一个verified
字段,但这只会告诉帐户是否经过验证而不是电子邮件地址.
起初看起来您只能将图谱API用于已确认电子邮件地址的帐户.如果地址未得到确认,我只是在收到错误时告诉我必须先确认电子邮件地址才能登录任何第三方网站.
然而,对于所有帐户而言,这似乎并非如此.在某些情况下,即使您没有确认的电子邮件地址,也可以访问Facebook的所有部分.例如,当您使用@ myopera.com邮件地址注册时.
当您使用@ myopera.com电子邮件地址注册Facebook时,您会收到一条消息,表明您的帐户在提交注册表单后已暂时锁定.要继续,您需要提供您的电话号码以验证您的帐户并"保持Facebook安全且免受垃圾邮件"(对于屏幕截图中的瑞典语,这是在我进入Facebook并将语言更改为英语之前):
当您提供电话号码时,您已登录,Facebook不会再唠叨您必须验证您的电子邮件地址.
您可以在设置页面上看到尚未验证您的电子邮件地址的唯一位置:
在您验证电子邮件地址之前通常无法访问的移动设置可用,并列出注册期间输入的电话号码:
除此之外,还可以使用未经证实的电子邮件地址登录第三方站点:
当我使用此用户连接到图形API时,我可以获得未经证实的电子邮件地址,并且该verified
字段按预期返回true,因为我已通过添加电话号码验证了帐户.显然我不相信我从Facebook获得的电子邮件地址真的属于拥有Facebook帐户的用户.
有没有其他方法可以知道电子邮件地址是否经过验证,或者如果我想用它来识别用户,我是否必须自己验证?
security facebook single-sign-on facebook-graph-api facebook-authentication
最近,我一直在使用Android上的Google API,特别是Google Analytics,AdSense和Tasks API.
我见过Google提供的一些示例,他们使用此语句获取GoogleAccountCredential
对象
credential =
GoogleAccountCredential.usingOAuth2(this, Collections.singleton(TasksScopes.TASKS));
但是,如果我查看以下文档:
http://developer.android.com/google/auth/http-auth.html
http://developer.android.com/google/play-services/auth.html
他们都提到了下面用于获取令牌的方法:
token = GoogleAuthUtil.getToken(mActivity, mEmail, mScope);
我很困惑在哪种场景中使用哪一个以及为什么.我一直在使用Method no.1成功而无需在首选项中保留令牌(我猜这是由GoogleAccountCredential自动完成的)
任何人都可以告诉我为什么有人会使用第一种方法而不是第二种方法?
如何在第一种方法中访问身份验证令牌?
在Android上,我希望能够检测所使用的字体是否可以显示某个字符,但据我所知,这是不可能的常规方法,如检查自定义字体是否可以显示字符
为了检测这个,我正在写一个我要检查的字符到一个位图然后我写另一个我知道的字符丢失到另一个位图并比较位图的内容.如果它们相等,则字符丢失.
问题是,是否有任何unicode角色的字形(或多或少)保证在Android手机上常用的字体上缺失?
在维基百科上阅读它时,Unicode替换字符听起来很有前途:
当系统无法将数据流呈现为正确的符号时,它用于指示问题.最常见的情况是字体不包含字符,但在数据无效且与任何字符都不匹配时也会看到
然而,经过一些测试后,我发现这个角色并不是用来表示我的Windows 7计算机或我测试过的Android手机(摩托罗拉Atrix)上缺少的字形.
我正在尝试了解Android中的sp单元,但我无法弄清楚它是如何工作的.该文件说:
SP
与比例无关的像素 - 这与dp单位类似,但它也可以通过用户的字体大小首选项进行缩放.建议您在指定字体大小时使用此单位,以便根据屏幕密度和用户偏好调整它们.
使用DisplayMetrics可以获得scaledDensity,它是:
显示屏上显示的字体的缩放系数.这与密度相同,除了它可以在运行时根据用户对字体大小的偏好以较小的增量进行调整.
因此,鉴于此信息,我假设scaledDensity将随着我更改系统字体大小而改变,并且我可以使用此信息来了解1dp和1sp(scaledDensity / density
)之间的比率.
然而,当我在手机(Nexus 4)上测试时,我没有得到我期待的结果.DisplayMetrics.scaledDensity始终返回相同的值(等于DisplayMetrics.density),无论我将手机设置为使用什么字体大小(通过settings -> accessibility -> use large font
或settings -> display -> font size
).
当我更改字体设置时,我指定的字体会改变大小,因此sp单元按预期工作,但scaledDensity值根本不会改变.
我用来获取scaledDensity的代码是:
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
metrics.scaledDensity
Run Code Online (Sandbox Code Playgroud)
我做错了什么或者我误解了DisplayMetrics.scaledDensity实际上做了什么?
更新
这是三个屏幕截图,说明了我的意思:
这是应用程序的代码:
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
String result = "\n"
+ "density : " + metrics.density + " (24 dp = " + 24 * metrics.density + " px)\n"
+ "scaledDensity: " …
Run Code Online (Sandbox Code Playgroud) 我正在考虑使用https://www.googleapis.com/auth/userinfo.email来获取用户的电子邮件地址,我在Google自己的文档和其他指南中看到了很多关于如何执行此操作的示例.互联网.
但是,我无法找到有关速率限制的信息,或者是否有任何速率限制.Google API控制台列出了许多不同API的礼貌限制,但没有提及OAuth 2.0 API.
有谁知道是否有任何限制,如果有的话,它们是什么?
我正在开发一个客户端-服务器应用程序,并希望为用户提供单点登录,他们可以在其中使用 Google 登录。我计划通过使用 AccountManager 在手机上获取访问令牌,然后将此令牌发送到服务器以验证令牌并登录用户来执行此操作。
当我在 AccountManager 中调用 getAuthToken 方法时,会显示一个对话框,其中用户必须允许这样做,但是 Android 上的 Chrome 允许您登录并将浏览器数据与您的 Google 帐户同步,而不会显示此对话框。因此,Chrome 似乎能够在不向用户显示任何对话框的情况下获取访问令牌,如果我可以对我的应用程序执行相同操作,那就太好了。
在查看 Android 的源代码和getAuthToken的实现时, 如果应用程序是预安装的应用程序或者应用程序的 UID 与(Google 帐户的)身份验证器的 UID 相同,则似乎会自动授予访问权限。
我的应用程序和 Chrome 都没有预装,所以在这两种情况下检查都是假的。我的应用程序当然不能与 Google 帐户身份验证器共享 UID,而且我认为 Chrome 有可能与身份验证器共享 UID,因为 Google 创建了它们。如果是这种情况,那么它将解释为什么 Chrome 不显示任何对话框。
在请求我可能丢失的访问令牌时,是否有其他方法不向用户显示此对话框?
我需要在 Google Apps 脚本中使用 RSA-SHA256 和公钥对消息进行签名。
我尝试使用Utilities.computeRsaSha256Signature(value, key)来实现此目的,但我收到一个Invalid argument: key
错误。
为了这个问题的目的,我生成了一个像这样的密钥对:
openssl genrsa -out private.pem 32
openssl rsa -in private.pem -out public.pem -outform PEM -pubout
Run Code Online (Sandbox Code Playgroud)
我的脚本如下所示:
openssl genrsa -out private.pem 32
openssl rsa -in private.pem -out public.pem -outform PEM -pubout
Run Code Online (Sandbox Code Playgroud)
当我运行此命令时,我Invalid argument: key
在第一次调用时收到错误computeRsaSha256Signature
。
该错误表明它们的密钥有问题,但我无法弄清楚问题出在哪里。我尝试过使用公钥和私钥,并且尝试删除换行符,但一切都失败并显示相同的消息。
我的代码看起来与文档中的示例非常相似,所以我不确定我做错了什么。
怎样才能Utilities.computeRsaSha256Signature()
使用成功呢?
我有一些代码可以生成小数据类的大量实例。当我向该类添加一个惰性属性时,我注意到即使从未访问该惰性属性,创建该类的实例也会变得慢得多。怎么会出现这样的情况呢?我原以为如果从不访问惰性属性,那么不会有什么区别。有没有什么方法可以使用惰性属性而不遭受这种性能影响?
这是一个最小的例子:
import kotlin.system.measureTimeMillis
class LazyTest(val x: Int) {
val test: Int by lazy { 9 }
}
fun main(){
val time = measureTimeMillis { List(500_000) {LazyTest(it) }}
println("time: $time")
}
Run Code Online (Sandbox Code Playgroud)
当在 play.kotlinlang.org上运行它时,需要 500-600 毫秒,如果我注释掉val test: Int by lazy { 9 }
该行,则运行大约需要 40 毫秒。
使用EventTarget.addEventListener()时,是否可以在调用回调时获取监听器注册到的元素?
我知道event.target属性,但这是触发事件的元素,它不必与注册侦听器的元素相同。
这是我的意思的一个例子。考虑以下 HTML:
<p id="1">paragraph <span>1</span></p>
<p id="2">paragraph <span>2</span></p>
Run Code Online (Sandbox Code Playgroud)
以及以下 JavaScript:
document.getElementById("1").addEventListener("click", myfun);
document.getElementById("2").addEventListener("click", myfun);
function myfun(ev) {
ev.target.style.backgroundColor = "yellow";
}
Run Code Online (Sandbox Code Playgroud)
在此示例中,我想将<p>
单击的内容着色为黄色,但由于我使用的是 event.target,因此当单击 1 或 2 时,仅将其着色,而不是整个段落。
android ×4
oauth-2.0 ×2
api ×1
dom ×1
dom-events ×1
facebook ×1
fonts ×1
google-api ×1
javascript ×1
kotlin ×1
oauth ×1
security ×1
unicode ×1