Exemplo n.º 1
0
	def subscribe( self ):
		device_token = self.request.get( 'device_token', None );
		type = self.request.get( 'type', None ); # ios or android

		# パラメータが足りなかったらエラー
		if device_token is None or type is None:
			functions.printError( "parameter missing" )
			return

		# ios の場合は urbanairship に登録する。
		# android の場合はクライアント側のライブラリが
		# urbanairship への登録までやってくれているので何もしない。
		if type == "ios":
			from openfish.libs import urbanairship
			import config
			airship = urbanairship.Airship( config.URBANAIRSHIP_APP_KEY, config.URBANAIRSHIP_MASTER_SECRET )# 2つ目は master secret
			airship.register( device_token, alias=self.user.ua_alias )

		# user のプロパティとして保存
		self.user.device_token = device_token
		self.user.put()

		logging.info( "%s の device_token を %s として登録しました" % ( str(self.user.key), str(device_token) ) )

		# 出力
		out = {
			"meta": functions.createMetaData( status="ok", code=200, method_name="subscribePushNotification" ),
		};
		self.response.out.write( json.encode(out) )
Exemplo n.º 2
0
	def externalAccountLogin( self ):
		logging.info( self.request.arguments() )
		token = self.request.get( "token", None )
		tokenSecret = self.request.get( "tokenSecret", None )
		type = self.request.get( "type" )

		if token is None:
			functions.printError( "users externalAccountLogin パラメータが足りません" )
			return;

		if type=="facebook":
			self._externalAccountLoginWithFacebook( token )
		elif type=="twitter":
			self._externalAccountLoginWithTwitter( token, tokenSecret )
Exemplo n.º 3
0
	def externalAccountLink( self ):
		if self.user is None:
			functions.printError( "users externalAccountLink ログインが必要です" )
			return;

		type = self.request.get( "type" )
		token = self.request.get( "token", None )

		ea = models.ExternalAccount()
		ea.token = token
		ea.external_type = type

		# facebook情報を取得
		url = 'https://graph.facebook.com/me?access_token='+ token +'&fields=name,picture,email&locale=ja_JP'
		result = urlfetch.fetch(url)
		if result.status_code != 200:
			functions.printError( "tokenが不正です。"+ result.content )
			return
		result_obj = json.decode( result.content )
		facebook_id = str( result_obj["id"] )
		auth_id = "facebook:"+ facebook_id
		ea.external_id = facebook_id

		self.user.external_accounts = ea;
		if "email" in result_obj:
			self.user.email = result_obj["email"]
		self.user.add_auth_id( auth_id )

		out = {
			"meta": functions.createMetaData( status="ok", code=200, method_name="externalAccountLink" ),
			"response":{
				"users": [
					self.user.toDict( full=True ),
				],
			},
		};
		self.response.out.write( json.encode(out) )
Exemplo n.º 4
0
	def extendSSOAccessToken( self ):
		if self.user is None:
			functions.printError( "ログインが必要です" )
			return;

		if self.user.external_accounts is None:
			functions.printError( "facebook認証が必要です" )
			return;

		url = "https://api.facebook.com/method/auth.extendSSOAccessToken?format=json&access_token="+ self.user.external_accounts.token
		result = urlfetch.fetch(url)
		if result.status_code != 200:
			functions.printError( "facebook extendSSOAccessToken tokenが不正です。"+ result.content )
			return
		result_obj = json.decode( result.content )
		
		if "access_token" in result_obj == False:
			logging.error( "facebook extendSSOAccessToken facebook の accessToken を延長できませんでした。"+ result.content )
			out = {
				"meta": functions.createMetaData( status="fail", code=200, method_name="extendSSOAccessToken" ),
			};
			self.response.out.write( json.encode(out) )
			return


		self.user.external_accounts.token = result_obj["access_token"]
		self.user.put()
		logging.debug( "facebook extendSSOAccessToken accessToken を正常に延長できました。" )

		out = {
			"meta": functions.createMetaData( status="ok", code=200, method_name="extendSSOAccessToken" ),
			"response":{
				"accessToken": self.user.external_accounts.token,
			},
		};
		self.response.out.write( json.encode(out) )
Exemplo n.º 5
0
	def _externalAccountLoginWithFacebook( self, token ):
		ea = models.ExternalAccount()
		ea.token = token
		ea.external_type = "facebook"

		# facebook情報を取得
		url = 'https://graph.facebook.com/me?access_token='+ token +'&fields=name,picture,email&locale=ja_JP'
		result = urlfetch.fetch(url)
		if result.status_code != 200:
			functions.printError( u"tokenが不正です。["+ token +u"]"+ result.content )
			return
		result_obj = json.decode( result.content )
		facebook_id = str( result_obj["id"] )
		auth_id = "facebook:"+ facebook_id
		ea.external_id = facebook_id

		# logging.info( auth_id )

		# 存在チェック
		user = self.user_model.get_by_auth_id( auth_id )
		# logging.info( user )

		if user:
			if "email" in result_obj and user.email != result_obj["email"]:
				user.email = result_obj["email"]
			user.external_accounts = ea
			user.put()
			logging.info( "すでに登録済みなのでログインします" )
		else:
			logging.info( "初めてのユーザーなので User 作成してログイン処理します!" )
			# まずプロフィール写真取得して保存
			photoUrl = "https://graph.facebook.com/"+ facebook_id +"/picture?type=large"
			photoResult = urlfetch.fetch( photoUrl )
			photo = models.Photo()
			photo.save( photoResult.content )

			result_tuple = self.user_model.create_user( auth_id ) # User 作成
			logging.info( result_tuple )
			user = result_tuple[1]

			user.external_accounts = ea
			user.name = result_obj["name"]
			user.nickname = result_obj["name"]
			if "email" in result_obj:
				user.email = result_obj["email"]
			user.photo_key = photo.key
			user.put()

		# ログイン処理
		sessionId = self.serialize_user_token( user )

		out = {
			"meta": {
				"status": "ok",
				"code": 200,
				"method_name":"externalAccountLogin",
				"session_id": sessionId,
			},
			"response":{
				"users": [
					user.toDict( full=True ),
				],
			},
		};
		self.response.out.write( json.encode(out) )
Exemplo n.º 6
0
	def update( self ):
		# logging.info( self.request.arguments() );
		nickname = self.request.get( "nickname", None )
		photo_id = self.request.get( "photo_id", None )
		email = self.request.get( "email", None )
		password = self.request.get( "password", None )

		if self.user is None:
			out = {
				"meta": functions.createMetaData( status="fail", code=401, method_name="updateUser", message="ログインが必要です" ),
			};
			self.response.out.write( json.encode(out) )
			return
		
		if nickname:
			self.user.nickname = nickname
		if photo_id:
			photo = models.Photo.get_by_id( int(photo_id) )
			if photo is None:
				functions.printError( "Photo#%d が見つかりません"%(int(photo_id)) )
				return;
			if photo.user_key != self.user.key:
				functions.printError( "あなたのアップロードした Photo ではありません" )
				return;
			self.user.photo_key = photo.key;

		# ログイン情報更新する場合
		if email and password:
			logging.info( "ログイン情報をupdateします" )
			auth_id = "own:"+ email

			# すでに他の人にメールアドレスが使われているかチェック
			existingUser = models.User.get_by_auth_id( auth_id )
			if existingUser:
				logging.info( "すでに%sを使っているので、それが自分自身かどうか調べます。" % ( str(auth_id) ) )
				logging.info( existingUser.key.id() )
				logging.info( self.user.key.id() )
				if existingUser.key.id() != self.user.key.id():
					logging.info( "他の人によって使われていました。" )
					functions.printError( "users update メアドが使われています" )
					return;

			# すでに 自分の own:username が登録されているかチェック
			ownId = -1
			for k, v in enumerate( self.user.auth_ids ):
				if v[0:4] == "own:":
					ownId = k
					break;

			# 存在していたら更新、存在していなかったら追加
			if ownId == -1:
				self.user.add_auth_id( auth_id )
			else:
				self.user.auth_ids[k] = auth_id
			self.user.password = security.generate_password_hash( password, length=12 )

		self.user.put()

		out = {
			"meta": functions.createMetaData( status="ok", code=200, method_name="updateUser" ),
			"response":{
				"users": [
					self.user.toDict( full=True, viewerUser=self.user ),
				],
			},
		};
		self.response.out.write( json.encode(out) )