前提:
最近总是看到有人在问发布应用到Google Play之后,签名改变了,然后导致登录不成功的问题。之前没怎么在意,但是,问的人多了之后就想着,既然问的人这么多,那么直接写一篇文章来统一说明一下解决方式。
首先
之前加入到Google签名计划是一个可选项,但是,最近发布的应用好像默认就会分配一个新的签名。这就给我们测试增加了难度,需要使用Google新分配的签名文件的SHA1
来重新配置登录需要的文件。这里的登录不仅指的是Google登录还有Facebook登录,因为签名变了之后SHA1也会改变。所以,Google需要更新Android版的AuthID
的SHA1,Face book需要更新新的散列密钥
。
说了那么多,来看看自己的签名和Google分配的签名
如上图所示,可以看到Google分配的签名,这里面会生成新的
SHA1
、MD5
和SHA-256
,那么我们所需要的是什么呢,做过google登录的都知道需要SHA1,那么问题来了。需要用新的SHA1还是自己原来的SHA1呢?当然是要用Google分配的SHA1了。因为我们需要在Google Play上面发布应用。
其次
上面说了那么多的原因,那么下面来看解决办法。
-
关于Google登录的配置,可以看这篇Google登录配置,如果配置过了,那么看一下如何修改,我们只需要修改Android版的
AuthID
,并且修改里面对应的SHA1
。
注意:SHA1
这里需要更换成Google分配的签名的SHA1
其他的保持不变。 -
也有同仁遇到过Facebook登录失败的问题,说的是
散列密钥
错误。那么,我们的散列密钥
是怎么生成的呢?keytool -exportcert -alias (签名的别名) -keystore (签名文件路径) | openssl sha1 -binary | openssl base64
上面的就是我们生成散列密钥的方法,需要签名的别名和路径,当然还要有密钥。当我们有签名的时候当然会很容易的生成,那么Google分配的签名呢?我们怎么知道别名?怎么知道路径?怎么知道密钥?别担心,这里给你解决方法。
- 1、这里我根据当前网址的JS源码的算法,自己写出了一套
JAVA
和kotlin
源码,当前网址是如下图所示的用法
如上图所示,我们只需要填入Google分配给我们的新的SHA1
即可生成散列密钥
然后填入到Facebook的后台配置中。
- 2、代码中的用法是如何的呢?且看下面的源码
java
版的
/**
* 转换工具类
*/
public class ConvertUtil {
/**
* 输入内容
*
* @param input 输入的内容
* @param isCheck 是否取消选择OX
* @return 返回取消OX后的值
*/
private static String input(String input, boolean isCheck) {
input = input.toUpperCase();
if (isCheck) {
Pattern pattern = Pattern.compile("0X");
Matcher matcher = pattern.matcher(input);
input = matcher.replaceAll("");
}
Pattern pattern = Pattern.compile("[^A-Fa-f0-9]");
Matcher matcher = pattern.matcher(input);
input = matcher.replaceAll("");
return input;
}
/**
* 转换
*
* @param input 输入的内容
* @param isCheck 是否取消选择OX
* @return 返回散列密钥
*/
public static String convert(String input, boolean isCheck) {
String array;
String result = input(input, isCheck);
if (result.length() % 2 != 0) {
return "123";
}
int[] mArray = new int[result.length() / 2];
for (int index = 0; index < result.length() / 2; index++) {
String h = result.substring(index * 2, index * 2 + 2);
Log.e("TA", h + "");
mArray[index] = Integer.parseInt(h, 16);
}
array = convertTo64(mArray);
return array;
}
/**
* 转换为64为的String字符串
*
* @param input int 数组
* @return 转换后的散列密钥
*/
private static String convertTo64(int[] input) {
String base64_chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
String ret = "";
int i = 0;
int j = 0;
int[] char_array_3 = new int[3];
int[] char_array_4 = new int[4];
int in_len = input.length;
int pos = 0;
while (in_len-- != 0) {
char_array_3[i++] = input[pos++];
if (i == 3) {
char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;
char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);
char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);
char_array_4[3] = char_array_3[2] & 0x3f;
for (i = 0; (i < 4); i++)
ret += base64_chars.charAt(char_array_4[i]);
i = 0;
}
}
if (i != 0) {
for (j = i; j < 3; j++)
char_array_3[j] = 0;
char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;
char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);
char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);
char_array_4[3] = char_array_3[2] & 0x3f;
for (j = 0; (j < i + 1); j++)
ret += base64_chars.charAt(char_array_4[j]);
while ((i++ < 3))
ret += '=';
}
return ret;
}
}
kotlin
版的如下
/**
* 转换工具类
*/
object ConvertUtil {
/**
* 转换
*
* @param input 输入的内容
* @param isCheck 是否取消选择OX
* @return 返回散列密钥
*/
fun convert(input: String, isCheck: Boolean): String {
val array: String
val result = input(input, isCheck)
if (result.length % 2 != 0) {
return "123"
}
val mArray = IntArray(result.length / 2)
for (index in 0 until result.length / 2) {
val h = result.substring(index * 2, index * 2 + 2)
mArray[index] = h.toInt(16)
}
array = convertTo64(mArray)
return array
}
/**
* 输入内容
*
* @param input 输入的内容
* @param isCheck 是否取消选择OX
* @return 返回取消OX后的值
*/
private fun input(input: String, isCheck: Boolean): String {
var input = input
input = input.toUpperCase()
if (isCheck) {
val pattern = Pattern.compile("0X")
val matcher = pattern.matcher(input)
input = matcher.replaceAll("")
}
val pattern = Pattern.compile("[^A-Fa-f0-9]")
val matcher = pattern.matcher(input)
input = matcher.replaceAll("")
return input
}
/**
* 转换为64为的String字符串
*
* @param input int 数组
* @return 转换后的散列密钥
*/
private fun convertTo64(input: IntArray): String {
val base64_chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
var ret = ""
var i = 0
var j = 0
val char_array_3 = IntArray(3)
val char_array_4 = IntArray(4)
var in_len = input.size
var pos = 0
while (in_len-- != 0) {
char_array_3[i++] = input[pos++]
if (i == 3) {
char_array_4[0] = char_array_3[0] and 0xfc shr 2
char_array_4[1] =
(char_array_3[0] and 0x03 shl 4) + (char_array_3[1] and 0xf0 shr 4)
char_array_4[2] =
(char_array_3[1] and 0x0f shl 2) + (char_array_3[2] and 0xc0 shr 6)
char_array_4[3] = char_array_3[2] and 0x3f
i = 0
while (i < 4) {
ret += base64_chars[char_array_4[i]]
i++
}
i = 0
}
}
if (i != 0) {
j = i
while (j < 3) {
char_array_3[j] = 0
j++
}
char_array_4[0] = char_array_3[0] and 0xfc shr 2
char_array_4[1] = (char_array_3[0] and 0x03 shl 4) + (char_array_3[1] and 0xf0 shr 4)
char_array_4[2] = (char_array_3[1] and 0x0f shl 2) + (char_array_3[2] and 0xc0 shr 6)
char_array_4[3] = char_array_3[2] and 0x3f
j = 0
while (j < i + 1) {
ret += base64_chars[char_array_4[j]]
j++
}
while (i++ < 3) ret += '='
}
return ret
}
}
- 3、关于Facebook如何配置,如果不太明白的话可以看看这篇:Facebook 配置,关于如何配置
散列密钥
?可以看下图
如上图所示这里的散列密钥
换成刚生成的即可。
最后
好了,到此我们今天的文章就结束了。关于如何解决Google和Facebook加入签名计划后不能成功登录的问题就到此结束了。如果还有其他问题可以
加群探讨
,群号是:493180098