NOIZE
@NOIZE

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

【Django】Django-allauthでLINEからemailを取得し保存したい

解決したいこと

Djnago-allauthを使いソーシャルログインを実装しているのですが、LINEの場合、scopeにプロパティの値としては返してくれないので取得・保存ができません。

LINEでログインしたユーザーのemailフィールドにメールアドレスを取得・保存する方法を教えて下さい><

発生している問題・エラー

emailを取得・保存できない状態で実装すると、emailフィールドが空白になるため、別の方が新しくLINEでログインをした場合、emailの一意性のエラーが返ってきます。(空白のemailな為)

該当するソースコード

settings.py
INSTALLED_APPS = [
    #....
    'allauth.socialaccount.providers.line',
]

SOCIALACCOUNT_PROVIDERS = {
    'line': {
        'SCOPE': [
            'profile',
            'openid',
            'email',
        ],
    }
}

自分で試したこと

googleで色々調べたのですが、allauthでLINEのemailを取得する記事はまだ無いようでした><

LINEのドキュメントには、

LINEログインのチャネルIDをエンドポイントに送信するだけで、IDトークンを検証し、ユーザーのプロフィール情報とメールアドレスを取得できます。

とあるのですが、

  • allauthでどうやってチャネルIDを送信するのか?
  • allauthでどうやってIDトークンの検証しemailを取得・保存するのか?

がわかりません・・・

allauthとは別で何かファイルやコードが必要なのでしょうか?

ご教授頂ければ幸いですm(_ _)m

0

1Answer

ID トークンはそのエンドポイントに送信しなくてもローカルで検証しメールアドレスを取得できます。 PyJWT をインストールして以下の手順で ID トークンをデコードしてください。

デコードして得た decoded_id_token["email"] にメールアドレスが入っています。

allauth で email を保存するには、 allauth.account.adapter.DefaultAccountAdaptersave_user メソッドをオーバーライドしたアダプタを作ってそこでセットすれば行けそうです。

コードは以下のような感じだと思います。 Django は使ったことがないので推測ですが。

# project/settings.py:
ACCOUNT_ADAPTER = 'project.users.adapter.MyAccountAdapter'

# project/users/adapter.py:
from django.conf import settings
from allauth.account.adapter import DefaultAccountAdapter

class MyAccountAdapter(DefaultAccountAdapter):

    def save_user(self, request, user, form, commit=True):
        user = super().save_user(request, user, form, commit=False)
        id_token = data.get("id_token")
        decoded_id_token = 上記手順でデコード(id_token)
        user.email = decoded_id_token["email"]
        user.save()
        return user
1Like

Comments

  1. @NOIZE

    Questioner

    ご回答頂きありがとうございます!

    何をどうすれば良いかイマイチ掴めてなかったのですが、@uasiさんのお陰でできそうな気がしてきました!

    この内容を元に勉強し、実装してみたいと思います!

    取り急ぎお礼の返信をさせて頂きましたが、実装できたらまたこちらで返信させて頂きたいと思いますm(_ _)m

Your answer might help someone💌