如何从Android Google令牌创建parse_用户帐户?
我发现了一些有用的信息片段 演示如何在拥有解析令牌后登录Android应用程序 我可以成功获得手机谷歌账户的谷歌代币 如何让Parse使用Google令牌创建解析令牌 我假设这将涉及编写一些云代码,但我不清楚云代码应该做什么。我认为它需要为Google令牌创建或找到一个新的用户,并返回解析令牌如何从Android Google令牌创建parse_用户帐户?,android,parse-platform,oauth-2.0,Android,Parse Platform,Oauth 2.0,我发现了一些有用的信息片段 演示如何在拥有解析令牌后登录Android应用程序 我可以成功获得手机谷歌账户的谷歌代币 如何让Parse使用Google令牌创建解析令牌 我假设这将涉及编写一些云代码,但我不清楚云代码应该做什么。我认为它需要为Google令牌创建或找到一个新的用户,并返回解析令牌 有没有解析云代码的例子来说明如何处理GoogleAndroid登录/注册,或者除了Facebook/Twitter之外的其他例子 注意:这个答案不适用于开源解析服务器,因为它只使用可撤销会话。查看更多更
有没有解析云代码的例子来说明如何处理GoogleAndroid登录/注册,或者除了Facebook/Twitter之外的其他例子 注意:这个答案不适用于开源解析服务器,因为它只使用可撤销会话。查看更多更新 更新(2016年1月): 您需要关闭才能在
Parse.User
上调用getSessionToken
。转到应用程序设置>用户>>关闭需要可撤销会话。这在2016年并不新鲜,但在给出答案时,作者并不知道这一变化
为了便于理解,我将分为两种情况:新用户和返回用户 1.新用户 流程如下:
{
"iss": "https://accounts.google.com",
"sub": "110169484474386276334",
"azp": "1008719970978-hb24n2dstb40o45d4feuo2ukqmcc6381.apps.googleusercontent.com",
"email": "billd1600@gmail.com",
"at_hash": "X_B3Z3Fi4udZ2mf75RWo3w",
"email_verified": "true",
"aud": "1008719970978-hb24n2dstb40o45d4feuo2ukqmcc6381.apps.googleusercontent.com",
"iat": "1433978353",
"exp": "1433981953"
}
newchooseAccountContent()
方法中使用以下代码创建ParseUser
ParseUser user = new ParseUser();
user.setUsername(mEmail);
user.setPassword(randomPassword);
user.setEmail(mEmail);
user.signUpInBackground(new SignUpCallback() {
public void done(ParseException e) {
if (e == null) {
// Hooray! Let them use the app now.
} else {
// Sign up didn't succeed. Look at the ParseException
// to figure out what went wrong
}
}
});
2.返回用户
正如我在互联网上研究的那样,这是大多数人陷入困境的地方。流程如下:
{
"iss": "https://accounts.google.com",
"sub": "110169484474386276334",
"azp": "1008719970978-hb24n2dstb40o45d4feuo2ukqmcc6381.apps.googleusercontent.com",
"email": "billd1600@gmail.com",
"at_hash": "X_B3Z3Fi4udZ2mf75RWo3w",
"email_verified": "true",
"aud": "1008719970978-hb24n2dstb40o45d4feuo2ukqmcc6381.apps.googleusercontent.com",
"iat": "1433978353",
"exp": "1433981953"
}
Parse.Cloud.useMasterKey()
方法在云代码中查询用户,并使用getSessionToken()
方法在查询结果上返回会话密钥becomeInBackground
方法,使用会话密钥在磁盘上保存登录状态Parse.Cloud.httprequest
发送到此端点:https://www.googleapis.com/oauth2/v3/tokeninfo?access_token=
。这是在中说明的。您将收到以下数据:
{
"iss": "https://accounts.google.com",
"sub": "110169484474386276334",
"azp": "1008719970978-hb24n2dstb40o45d4feuo2ukqmcc6381.apps.googleusercontent.com",
"email": "billd1600@gmail.com",
"at_hash": "X_B3Z3Fi4udZ2mf75RWo3w",
"email_verified": "true",
"aud": "1008719970978-hb24n2dstb40o45d4feuo2ukqmcc6381.apps.googleusercontent.com",
"iat": "1433978353",
"exp": "1433981953"
}
需要比较的是“aud”、“azp”和“电子邮件”,它们被翻译为受众、授权方和电子邮件
要查询云上当前用户代码:
var query = new Parse.Query(Parse.User);
query.equalTo("email",mEmail);
query.first({
success: function(user) {
// Use user..getSessionToken() to get a session token
},
error: function(user, error) {
//
},
useMasterKey: true
});
注意:确保您具有以下范围,以便在检查云代码时显示电子邮件:https://www.googleapis.com/auth/plus.profile.emails.read
步骤:
(1):参见指南:
(2):将ID令牌发送到后端服务器(在本例中为解析)
//将令牌发送到后端
String backendapirltogeneratesessiontoken=您的\u url\u与\u cloud\u code\u生成\u会话\u令牌;
Log.i(“URL:,BackendApirlToGenerateSessionToken”);
RequestQueue newRequestQueue=Volley.newRequestQueue(this);
JSONObject getSessionTokenJsonRequestBody=新JSONObject();
//后端需要验证令牌和Google客户端ID
试一试{
getSessionTokenJsonRequestBody.put(“idToken”,idTokenFromGoogle);
getSessionTokenJsonRequestBody.put(“GClientId”,您的\u google\u客户端\u id);//在google-services.json文件中找到它
}捕获(JSONException e){
e、 printStackTrace();
}
最后一个字符串requestBody=getSessionTokenJsonRequestBody.toString();
JsonObjectRequest JsonObjectRequest=新的JsonObjectRequest(Request.Method.POST、BackendApirlToGenerateSessionToken、getSessionTokenJsonRequestBody、,
新的Response.Listener(){
@凌驾
公共void onResponse(JSONObject响应){
//成功回调
//设置当前用户并继续
试一试{
ParseUser.becomeInBackground(response.getString(“result”),new LogInCallback(){
@凌驾
公共无效完成(ParseUser用户,parsee异常){
如果(用户!=null){
//成功登录,将用户转到他们所在的最后一页
完成();
}否则{
//错误
Log.e(“登录错误:,e.getMessage());
//显示错误对话框,提示用户再次登录
}
}
});
}捕获(JSONException e){
e、 printStackTrace();
}
}
},
新的Response.ErrorListener(){
@凌驾
公共无效onErrorResponse(截击错误){
//错误回调
int statusCode=error.networkResponse.statusCode;
NetworkResponse=错误。NetworkResponse;
Log.d(“错误响应请求:”、“+statusCode+”+Response.data.toString());
}
})
{
@凌驾
//generating a random password
function getRandomString(){
var chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZ";
var string_length = 10;
var randomstring = '';
for (var i=0; i<string_length; i++) {
var rnum = Math.floor(Math.random() * chars.length);
randomstring += chars.substring(rnum,rnum + 1);
}
return randomstring;
}
Parse.Cloud.define("getSessionToken", function(request, response) {
console.log(request);
console.log(request.params.accessToken);
console.log(request.params.GClientId);
Parse.Cloud.useMasterKey();
//Verifying token (id Token)
var authTokenVerificationURL = "https://oauth2.googleapis.com/tokeninfo?id_token=" + request.params.idToken;
console.log(authTokenVerificationURL);
Parse.Cloud.httpRequest({
url:authTokenVerificationURL
}).then(function(httpResponse){
//Success
//console.log("success httpResponse: " + httpResponse.text);
//Verify if token is generated from our client
var gAudience = httpResponse.data.aud;
if(gAudience == request.params.GClientId) {
console.log("Verified: Token is generated from our app");
var user_emailId = httpResponse.data.email;
var user_username = httpResponse.data.name;
//console.log(user_emailId);
/*
* 1. User signing up for the first time
* 2. User already signed up logging in
*/
//Check if User account exists for the emailId
var query = new Parse.Query(Parse.User);
query.equalTo("email",user_emailId);
query.first({
success: function(user) {
//if the user exists, they could have logged out so no sessionToken is available so we'll need to log them in again
if(user) {
console.log("User found with Username: " + user.getUsername() + ", objectId: " + user.id);
//Generate the Session Token
var sessionToken = user.getSessionToken();
if(sessionToken) {
console.log("SessionToken: " + sessionToken);
response.success(sessionToken);
}else {
//create a new session - login (user can signup then log-out which deletes the session)
var newRandomPassword = getRandomString();
user.set("password", newRandomPassword);
user.save(null, {useMasterKey : true}).then(function(user){
Parse.User.logIn(user.get("username"), newRandomPassword).then(function(user){
var sessionToken = user.getSessionToken();
response.success(sessionToken);
}, function(error){
response.error("Cannot create session");
})
}, function(error){
response.error("Unable to save user data");
});
}
}else {
console.log("User not found, Creating new account for user with emailId: " + user_emailId);
//Create New Account
var nUser = new Parse.User();
nUser.set("username",user_username);
nUser.set("password",getRandomString());
nUser.set("email",user_emailId);
nUser.signUp(null,{
success: function(user) {
console.log("New account created for user with emailID: " + user_emailId);
//Generate the Session Token
var sessionToken = user.getSessionToken();
console.log("SessionToken: " + sessionToken);
response.success(sessionToken);
},
error: function(user, error) {
console.log("Failed to create a new account for emailID: " + user_emailId);
console.log("User: " + user + ", Error: " + error);
response.error(error);
}
});
}
},
error: function(user, error) {
console.log("Query to fetch user failed");
console.log("User: " + user + ", Error: " + error);;
response.error(error);
},
userMasterKey:true
});
}else { //Client has not login from our app
console.log("Google AudienceID: " + gAudience + "\n AppClientId: " + request.params.GClientId);
response.error('Invalid Audience');
}
},function(httpResponse) {
//Error
console.log("Failed httpResponse: " + httpResponse.text);
console.error('Request Failed with response code' + httpResponse.status);
response.error('Failed to verify access token');
});
});